3 # Copyright (c) 2001, 2002, 2003 Steven Knight
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:
13 # The above copyright notice and this permission notice shall be included
14 # in all copies or substantial portions of the Software.
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.
25 __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
32 if sys.platform == 'win32':
39 test = TestSCons.TestSCons()
41 test.subdir('repository',
42 ['repository', 'src1'],
43 ['repository', 'src2'],
44 ['repository', 'src2', 'include'],
45 ['repository', 'src2', 'xxx'],
46 ['repository', 'build2'],
47 ['repository', 'build2', 'foo'],
48 ['repository', 'build2', 'bar'],
53 ['work2', 'src2', 'include'],
54 ['work2', 'src2', 'xxx'])
56 aaa_obj = 'aaa' + _obj
57 bbb_obj = 'bbb' + _obj
58 main_obj = 'main' + _obj
60 xxx_exe = 'xxx' + _exe
62 repository_build1_foo_xxx = test.workpath('repository', 'build1', 'foo', 'xxx')
63 work1_build1_foo_xxx = test.workpath('work1', 'build1', 'foo', 'xxx')
64 work1_build1_bar_xxx = test.workpath('work1', 'build1', 'bar', 'xxx')
66 repository_build2_foo_src2_xxx_xxx = test.workpath('repository', 'build2',
67 'foo', 'src2', 'xxx', 'xxx')
68 repository_build2_bar_src2_xxx_xxx = test.workpath('repository', 'build2',
69 'bar', 'src2', 'xxx', 'xxx')
70 work2_build2_foo_src2_xxx_xxx = test.workpath('work2', 'build2',
71 'foo', 'src2', 'xxx', 'xxx')
72 work2_build2_bar_src2_xxx_xxx = test.workpath('work2', 'build2',
73 'bar', 'src2', 'xxx', 'xxx')
75 opts = "-Y " + test.workpath('repository')
78 test.write(['repository', 'SConstruct'], r"""
79 OS = ARGUMENTS.get('OS', '')
80 build1_os = "#build1/" + OS
81 default_ccflags = Environment()['CCFLAGS']
87 env1 = Environment(CCFLAGS = default_ccflags + ' ' + ccflags[OS],
89 BuildDir(build1_os, 'src1')
90 SConscript(build1_os + '/SConscript', "env1")
92 SConscript('build2/foo/SConscript')
93 SConscript('build2/bar/SConscript')
96 test.write(['repository', 'src1', 'SConscript'], r"""
98 env1.Program('xxx', ['aaa.c', 'bbb.c', 'main.c'])
101 test.write(['repository', 'build2', 'foo', 'SConscript'], r"""
102 BuildDir('src2', '#src2')
104 default_ccflags = Environment()['CCFLAGS']
105 env2 = Environment(CCFLAGS = default_ccflags + ' -DFOO',
106 CPPPATH = ['#src2/xxx', '#src2/include'])
108 SConscript('src2/xxx/SConscript', "env2")
111 test.write(['repository', 'build2', 'bar', 'SConscript'], r"""
112 BuildDir('src2', '#src2')
114 default_ccflags = Environment()['CCFLAGS']
115 env2 = Environment(CCFLAGS = default_ccflags + ' -DBAR',
116 CPPPATH = ['#src2/xxx', '#src2/include'])
118 SConscript('src2/xxx/SConscript', "env2")
121 test.write(['repository', 'src2', 'xxx', 'SConscript'], r"""
123 env2.Program('xxx', ['main.c'])
126 test.write(['repository', 'src1', 'iii.h'], r"""
128 #define STRING "REPOSITORY_FOO"
131 #define STRING "REPOSITORY_BAR"
135 test.write(['repository', 'src1', 'aaa.c'], r"""
140 printf("repository/src1/aaa.c: %s\n", STRING);
144 test.write(['repository', 'src1', 'bbb.c'], r"""
149 printf("repository/src1/bbb.c: %s\n", STRING);
153 test.write(['repository', 'src1', 'main.c'], r"""
155 extern void aaa(void);
156 extern void bbb(void);
158 main(int argc, char *argv[])
161 printf("Only when -DBAR.\n");
165 printf("repository/src1/main.c: %s\n", STRING);
170 test.write(['repository', 'src2', 'include', 'my_string.h'], r"""
172 #define INCLUDE_OS "FOO"
175 #define INCLUDE_OS "BAR"
177 #define INCLUDE_STRING "repository/src2/include/my_string.h: %s\n"
180 test.write(['repository', 'src2', 'xxx', 'include.h'], r"""
181 #include <my_string.h>
188 #define XXX_STRING "repository/src2/xxx/include.h: %s\n"
191 test.write(['repository', 'src2', 'xxx', 'main.c'], r"""
194 #define MAIN_OS "FOO"
197 #define MAIN_OS "BAR"
201 printf(INCLUDE_STRING, INCLUDE_OS);
202 printf(XXX_STRING, XXX_OS);
203 printf("repository/src2/xxx/main.c: %s\n", MAIN_OS);
209 test.run(chdir = 'repository', options = opts + " OS=foo", arguments = '.')
211 test.run(program = repository_build1_foo_xxx, stdout = """\
212 repository/src1/aaa.c: REPOSITORY_FOO
213 repository/src1/bbb.c: REPOSITORY_FOO
214 repository/src1/main.c: REPOSITORY_FOO
217 test.fail_test(os.path.exists(test.workpath('repository', 'src1', '.sconsign')))
218 test.fail_test(os.path.exists(test.workpath('repository', 'src2', '.sconsign')))
219 test.fail_test(os.path.exists(test.workpath('work1', 'src1', '.sconsign')))
220 test.fail_test(os.path.exists(test.workpath('work2', 'src2', '.sconsign')))
222 test.run(program = repository_build2_foo_src2_xxx_xxx, stdout = """\
223 repository/src2/include/my_string.h: FOO
224 repository/src2/xxx/include.h: FOO
225 repository/src2/xxx/main.c: FOO
228 test.run(program = repository_build2_bar_src2_xxx_xxx, stdout = """\
229 repository/src2/include/my_string.h: BAR
230 repository/src2/xxx/include.h: BAR
231 repository/src2/xxx/main.c: BAR
234 test.fail_test(os.path.exists(test.workpath('repository', 'src1', '.sconsign')))
235 test.fail_test(os.path.exists(test.workpath('repository', 'src2', '.sconsign')))
236 test.fail_test(os.path.exists(test.workpath('work1', 'src1', '.sconsign')))
237 test.fail_test(os.path.exists(test.workpath('work2', 'src2', '.sconsign')))
239 # Make the entire repository non-writable, so we'll detect
240 # if we try to write into it accidentally.
241 test.writable('repository', 0)
244 test.up_to_date(chdir = 'work1', options = opts + " OS=foo", arguments = 'build1')
246 test.fail_test(os.path.exists(test.workpath('work1', 'build1', 'foo', aaa_obj)))
247 test.fail_test(os.path.exists(test.workpath('work1', 'build1', 'foo', bbb_obj)))
248 test.fail_test(os.path.exists(test.workpath('work1', 'build1', 'foo', main_obj)))
250 test.fail_test(os.path.exists(test.workpath('work1', 'build1', 'foo', xxx_exe)))
253 test.run(chdir = 'work1', options = opts, arguments = 'OS=bar .')
255 test.run(program = work1_build1_bar_xxx, stdout = """\
257 repository/src1/aaa.c: REPOSITORY_BAR
258 repository/src1/bbb.c: REPOSITORY_BAR
259 repository/src1/main.c: REPOSITORY_BAR
262 test.fail_test(os.path.exists(test.workpath('repository', 'src1', '.sconsign')))
263 test.fail_test(os.path.exists(test.workpath('repository', 'src2', '.sconsign')))
264 test.fail_test(os.path.exists(test.workpath('work1', 'src1', '.sconsign')))
265 test.fail_test(os.path.exists(test.workpath('work2', 'src2', '.sconsign')))
267 test.up_to_date(chdir = 'work1', options = opts + " OS=bar", arguments = 'build1')
269 # Ensure file time stamps will be newer.
272 test.write(['work1', 'src1', 'iii.h'], r"""
274 #define STRING "WORK_FOO"
277 #define STRING "WORK_BAR"
282 test.run(chdir = 'work1', options = opts + " OS=bar", arguments = 'build1')
284 test.run(program = work1_build1_bar_xxx, stdout = """\
286 repository/src1/aaa.c: WORK_BAR
287 repository/src1/bbb.c: WORK_BAR
288 repository/src1/main.c: WORK_BAR
291 test.fail_test(os.path.exists(test.workpath('repository', 'src1', '.sconsign')))
292 test.fail_test(os.path.exists(test.workpath('repository', 'src2', '.sconsign')))
293 test.fail_test(os.path.exists(test.workpath('work1', 'src1', '.sconsign')))
294 test.fail_test(os.path.exists(test.workpath('work2', 'src2', '.sconsign')))
296 test.up_to_date(chdir = 'work1', options = opts + " OS=bar", arguments = 'build1')
299 test.run(chdir = 'work1', options = opts + " OS=foo", arguments = 'build1')
301 test.run(program = work1_build1_foo_xxx, stdout = """\
302 repository/src1/aaa.c: WORK_FOO
303 repository/src1/bbb.c: WORK_FOO
304 repository/src1/main.c: WORK_FOO
307 test.fail_test(os.path.exists(test.workpath('repository', 'src1', '.sconsign')))
308 test.fail_test(os.path.exists(test.workpath('repository', 'src2', '.sconsign')))
309 test.fail_test(os.path.exists(test.workpath('work1', 'src1', '.sconsign')))
310 test.fail_test(os.path.exists(test.workpath('work2', 'src2', '.sconsign')))
312 test.up_to_date(chdir = 'work1', options = opts + " OS=foo", arguments = 'build1')
315 test.up_to_date(chdir = 'work2', options = opts, arguments = 'build2')
317 test.fail_test(os.path.exists(test.workpath('work2', 'build2', 'foo', 'src2', 'xxx', aaa_obj)))
318 test.fail_test(os.path.exists(test.workpath('work2', 'build2', 'foo', 'src2', 'xxx', bbb_obj)))
319 test.fail_test(os.path.exists(test.workpath('work2', 'build2', 'foo', 'src2', 'xxx', main_obj)))
320 test.fail_test(os.path.exists(test.workpath('work2', 'build2', 'foo', 'src2', 'xxx', xxx_exe)))
321 test.fail_test(os.path.exists(test.workpath('work2', 'build2', 'bar', 'src2', 'xxx', aaa_obj)))
322 test.fail_test(os.path.exists(test.workpath('work2', 'build2', 'bar', 'src2', 'xxx', bbb_obj)))
323 test.fail_test(os.path.exists(test.workpath('work2', 'build2', 'bar', 'src2', 'xxx', main_obj)))
324 test.fail_test(os.path.exists(test.workpath('work2', 'build2', 'bar', 'src2', 'xxx', xxx_exe)))
326 # Ensure file time stamps will be newer.
329 test.write(['work2', 'src2', 'include', 'my_string.h'], r"""
331 #define INCLUDE_OS "FOO"
334 #define INCLUDE_OS "BAR"
336 #define INCLUDE_STRING "work2/src2/include/my_string.h: %s\n"
340 test.run(chdir = 'work2', options = opts, arguments = 'build2')
342 test.run(program = work2_build2_foo_src2_xxx_xxx, stdout = """\
343 work2/src2/include/my_string.h: FOO
344 repository/src2/xxx/include.h: FOO
345 repository/src2/xxx/main.c: FOO
348 test.run(program = work2_build2_bar_src2_xxx_xxx, stdout = """\
349 work2/src2/include/my_string.h: BAR
350 repository/src2/xxx/include.h: BAR
351 repository/src2/xxx/main.c: BAR
354 test.fail_test(os.path.exists(test.workpath('repository', 'src1', '.sconsign')))
355 test.fail_test(os.path.exists(test.workpath('repository', 'src2', '.sconsign')))
356 test.fail_test(os.path.exists(test.workpath('work1', 'src1', '.sconsign')))
357 test.fail_test(os.path.exists(test.workpath('work2', 'src2', '.sconsign')))
359 # Ensure file time stamps will be newer.
362 test.write(['work2', 'src2', 'xxx', 'include.h'], r"""
363 #include <my_string.h>
370 #define XXX_STRING "work2/src2/xxx/include.h: %s\n"
373 test.run(chdir = 'work2', options = opts, arguments = 'build2')
375 test.run(program = work2_build2_foo_src2_xxx_xxx, stdout = """\
376 work2/src2/include/my_string.h: FOO
377 work2/src2/xxx/include.h: FOO
378 repository/src2/xxx/main.c: FOO
381 test.run(program = work2_build2_bar_src2_xxx_xxx, stdout = """\
382 work2/src2/include/my_string.h: BAR
383 work2/src2/xxx/include.h: BAR
384 repository/src2/xxx/main.c: BAR
387 test.fail_test(os.path.exists(test.workpath('repository', 'src1', '.sconsign')))
388 test.fail_test(os.path.exists(test.workpath('repository', 'src2', '.sconsign')))
389 test.fail_test(os.path.exists(test.workpath('work1', 'src1', '.sconsign')))
390 test.fail_test(os.path.exists(test.workpath('work2', 'src2', '.sconsign')))
393 test.unlink(['work2', 'src2', 'include', 'my_string.h'])
395 test.run(chdir = 'work2', options = opts, arguments = 'build2')
397 test.run(program = work2_build2_foo_src2_xxx_xxx, stdout = """\
398 repository/src2/include/my_string.h: FOO
399 work2/src2/xxx/include.h: FOO
400 repository/src2/xxx/main.c: FOO
403 test.run(program = work2_build2_bar_src2_xxx_xxx, stdout = """\
404 repository/src2/include/my_string.h: BAR
405 work2/src2/xxx/include.h: BAR
406 repository/src2/xxx/main.c: BAR
409 test.fail_test(os.path.exists(test.workpath('repository', 'src1', '.sconsign')))
410 test.fail_test(os.path.exists(test.workpath('repository', 'src2', '.sconsign')))
411 test.fail_test(os.path.exists(test.workpath('work1', 'src1', '.sconsign')))
412 test.fail_test(os.path.exists(test.workpath('work2', 'src2', '.sconsign')))