3ccada8e287f814c8e19bf62f60e29b20054d97f
[scons.git] / test / option / tree-derived.py
1 #!/usr/bin/env python
2 #
3 # __COPYRIGHT__
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 """
28 Test that the --debug=dtree option correctly prints just the explicit
29 dependencies (sources or Depends()) of a target.
30 """
31
32 import TestSCons
33 import sys
34 import string
35 import re
36 import time
37
38 test = TestSCons.TestSCons()
39
40 test.write('SConstruct', """
41 env = Environment(OBJSUFFIX = '.ooo', PROGSUFFIX = '.xxx')
42 env.Program('foo', Split('foo.c bar.c'))
43 """)
44
45 test.write('foo.c', r"""
46 #include <stdio.h>
47 #include <stdlib.h>
48 #include "foo.h"
49 int main(int argc, char *argv[])
50 {
51         argv[argc++] = "--";
52         printf("f1.c\n");
53         exit (0);
54 }
55 """)
56
57 test.write('bar.c', """
58 #include "bar.h"
59 """)
60
61 test.write('foo.h', """
62 #ifndef FOO_H
63 #define FOO_H
64 #include "bar.h"
65 #endif
66 """)
67
68 test.write('bar.h', """
69 #ifndef BAR_H
70 #define BAR_H
71 #include "foo.h"
72 #endif
73 """)
74
75 dtree1 = """
76 +-foo.xxx
77   +-foo.ooo
78   +-bar.ooo
79 """
80
81 test.run(arguments = "--tree=derived foo.xxx")
82 test.fail_test(string.find(test.stdout(), dtree1) == -1)
83
84 dtree2 = """
85 +-.
86   +-bar.ooo
87   +-foo.ooo
88   +-foo.xxx
89     +-foo.ooo
90     +-bar.ooo
91 """
92
93 test.run(arguments = "--tree=derived .")
94 test.fail_test(string.find(test.stdout(), dtree2) == -1)
95
96 dtree3 = """
97 +-.
98   +-bar.ooo
99   +-foo.ooo
100   +-foo.xxx
101     +-foo.ooo
102     +-bar.ooo
103 """
104
105 test.run(arguments = "--tree=derived,prune .")
106 test.fail_test(string.find(test.stdout(), dtree3) == -1)
107
108 dtree4 = """
109  E         = exists
110   R        = exists in repository only
111    b       = implicit builder
112    B       = explicit builder
113     S      = side effect
114      P     = precious
115       A    = always build
116        C   = current
117         N  = no clean
118          H = no cache
119
120 [  B      ]+-foo.xxx
121 [  B      ]  +-foo.ooo
122 [  B      ]  +-bar.ooo
123 """
124
125 test.run(arguments = '-c foo.xxx')
126
127 test.run(arguments = "--no-exec --tree=derived,status foo.xxx")
128 test.fail_test(string.find(test.stdout(), dtree4) == -1)
129
130 # Make sure we print the debug stuff even if there's a build failure.
131 test.write('bar.h', """
132 #ifndef BAR_H
133 #define BAR_H
134 #include "foo.h"
135 #endif
136 THIS SHOULD CAUSE A BUILD FAILURE
137 """)
138
139 test.run(arguments = "--tree=derived foo.xxx",
140          status = 2,
141          stderr = None)
142 test.fail_test(string.find(test.stdout(), dtree1) == -1)
143
144 test.pass_test()