3a3c2bc59095daea2ddc139af839394c76a0312e
[scons.git] / test / Install.py
1 #!/usr/bin/env python
2 #
3 # Copyright (c) 2001, 2002 Steven Knight
4 #
5 # Permission is hereby granted, free of charge, to any person obtaining
6 # a copy of this software and associated documentation files (the
7 # "Software"), to deal in the Software without restriction, including
8 # without limitation the rights to use, copy, modify, merge, publish,
9 # distribute, sublicense, and/or sell copies of the Software, and to
10 # permit persons to whom the Software is furnished to do so, subject to
11 # the following conditions:
12 #
13 # The above copyright notice and this permission notice shall be included
14 # in all copies or substantial portions of the Software.
15 #
16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
17 # KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
18 # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 #
24
25 __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
26
27 import os.path
28 import sys
29 import time
30 import TestSCons
31
32 if sys.platform == 'win32':
33     _exe = '.exe'
34     _obj = '.obj'
35 else:
36     _exe = ''
37     _obj = '.o'
38
39 test = TestSCons.TestSCons()
40
41 foo1 = test.workpath('export/foo1' + _exe)
42 foo2 = test.workpath('export/foo2' + _exe)
43
44 test.write('SConstruct', """
45 env=Environment()
46 t=env.Program(target='foo1', source='f1.c')
47 env.Install(dir='export', source=t)
48 t=env.Program(target='foo2', source='f2.c')
49 env.Install(dir='export', source=t)
50 """)
51
52 test.write('f1.c', r"""
53 #include <stdio.h>
54
55 int main(void)
56 {
57    printf("f1.c\n");
58    return 0;
59 }
60 """)
61
62 test.write('f2.c', r"""
63 #include <stdio.h>
64
65 int main(void)
66 {
67    printf("f2.c\n");
68    return 0;
69 }
70 """)
71
72 test.run(arguments = '.')
73
74 test.run(program = foo1, stdout = "f1.c\n")
75 test.run(program = foo2, stdout = "f2.c\n")
76
77 # make sure the programs didn't get rebuilt, because nothing changed:
78 oldtime1 = os.path.getmtime(foo1)
79 oldtime2 = os.path.getmtime(foo2)
80
81 test.write('f1.c', r"""
82 #include <stdio.h>
83
84 int main(void)
85 {
86    printf("f1.c again\n");
87    return 0;
88 }
89 """)
90
91 time.sleep(2) # introduce a small delay, to make the test valid
92
93 test.run(arguments = '.')
94
95 test.fail_test(oldtime1 == os.path.getmtime(foo1))
96 test.fail_test(oldtime2 != os.path.getmtime(foo2))
97
98 # Verify that scons prints an error message if a target can not be unlinked before
99 # building it:
100 test.write('f1.c', r"""
101 #include <stdio.h>
102
103 int main(void)
104 {
105    printf("f1.c again again\n");
106    return 0;
107 }
108 """)
109
110 os.chmod(test.workpath('.'), 0555)
111
112 test.run(arguments = foo1, stderr="scons: *** [Errno 13] Permission denied: 'f1%s'\n"%_obj, status=2)
113
114 test.pass_test()