OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "testing/gtest/include/gtest/gtest.h" | 5 #include "testing/gtest/include/gtest/gtest.h" |
6 #include "tools/gn/build_settings.h" | 6 #include "tools/gn/build_settings.h" |
7 #include "tools/gn/config.h" | 7 #include "tools/gn/config.h" |
8 #include "tools/gn/settings.h" | 8 #include "tools/gn/settings.h" |
9 #include "tools/gn/target.h" | 9 #include "tools/gn/target.h" |
10 #include "tools/gn/test_with_scope.h" | 10 #include "tools/gn/test_with_scope.h" |
11 #include "tools/gn/toolchain.h" | 11 #include "tools/gn/toolchain.h" |
12 | 12 |
13 // Tests that depending on a group is like depending directly on the group's | |
14 // deps. | |
15 TEST(Target, GroupDeps) { | |
16 TestWithScope setup; | |
17 Err err; | |
18 | |
19 // Used as the origin for the not-automatically-set deps. | |
20 IdentifierNode origin; | |
21 | |
22 // Two low-level targets. | |
23 Target x(setup.settings(), Label(SourceDir("//component/"), "x")); | |
24 x.set_output_type(Target::STATIC_LIBRARY); | |
25 x.SetToolchain(setup.toolchain()); | |
26 ASSERT_TRUE(x.OnResolved(&err)); | |
27 Target y(setup.settings(), Label(SourceDir("//component/"), "y")); | |
28 y.set_output_type(Target::STATIC_LIBRARY); | |
29 y.SetToolchain(setup.toolchain()); | |
30 ASSERT_TRUE(y.OnResolved(&err)); | |
31 | |
32 // Make a group for both x and y. | |
33 Target g(setup.settings(), Label(SourceDir("//group/"), "g")); | |
34 g.set_output_type(Target::GROUP); | |
35 g.visibility().SetPublic(); | |
36 g.deps().push_back(LabelTargetPair(&x)); | |
37 g.deps()[0].origin = &origin; | |
38 g.deps().push_back(LabelTargetPair(&y)); | |
39 g.deps()[1].origin = &origin; | |
40 | |
41 // Random placeholder target so we can see the group's deps get inserted at | |
42 // the right place. | |
43 Target b(setup.settings(), Label(SourceDir("//app/"), "b")); | |
44 b.set_output_type(Target::STATIC_LIBRARY); | |
45 b.SetToolchain(setup.toolchain()); | |
46 b.visibility().SetPublic(); | |
47 ASSERT_TRUE(b.OnResolved(&err)); | |
48 | |
49 // Make a target depending on the group and "b". OnResolved will expand. | |
50 Target a(setup.settings(), Label(SourceDir("//app/"), "a")); | |
51 a.set_output_type(Target::EXECUTABLE); | |
52 a.deps().push_back(LabelTargetPair(&g)); | |
53 a.deps()[0].origin = &origin; | |
54 a.deps().push_back(LabelTargetPair(&b)); | |
55 a.deps()[1].origin = &origin; | |
56 a.SetToolchain(setup.toolchain()); | |
57 ASSERT_TRUE(a.OnResolved(&err)); | |
58 | |
59 // The group's deps should be inserted after the group itself in the deps | |
60 // list, so we should get "g, x, y, b" | |
61 ASSERT_EQ(4u, a.deps().size()); | |
62 EXPECT_EQ(&g, a.deps()[0].ptr); | |
63 EXPECT_EQ(&x, a.deps()[1].ptr); | |
64 EXPECT_EQ(&y, a.deps()[2].ptr); | |
65 EXPECT_EQ(&b, a.deps()[3].ptr); | |
66 | |
67 // The "regular" deps on a should have the origin set. The automatically | |
68 // expanded ones will have a null origin so we know they are generated. | |
69 EXPECT_EQ(&origin, a.deps()[0].origin); | |
70 EXPECT_EQ(NULL, a.deps()[1].origin); | |
71 EXPECT_EQ(NULL, a.deps()[2].origin); | |
72 EXPECT_EQ(&origin, a.deps()[3].origin); | |
73 } | |
74 | |
75 // Tests that lib[_dir]s are inherited across deps boundaries for static | 13 // Tests that lib[_dir]s are inherited across deps boundaries for static |
76 // libraries but not executables. | 14 // libraries but not executables. |
77 TEST(Target, LibInheritance) { | 15 TEST(Target, LibInheritance) { |
78 TestWithScope setup; | 16 TestWithScope setup; |
79 Err err; | 17 Err err; |
80 | 18 |
81 const std::string lib("foo"); | 19 const std::string lib("foo"); |
82 const SourceDir libdir("/foo_dir/"); | 20 const SourceDir libdir("/foo_dir/"); |
83 | 21 |
84 // Leaf target with ldflags set. | 22 // Leaf target with ldflags set. |
85 Target z(setup.settings(), Label(SourceDir("//foo/"), "z")); | 23 Target z(setup.settings(), Label(SourceDir("//foo/"), "z")); |
86 z.set_output_type(Target::STATIC_LIBRARY); | 24 z.set_output_type(Target::STATIC_LIBRARY); |
87 z.config_values().libs().push_back(lib); | 25 z.config_values().libs().push_back(lib); |
88 z.config_values().lib_dirs().push_back(libdir); | 26 z.config_values().lib_dirs().push_back(libdir); |
| 27 z.visibility().SetPublic(); |
89 z.SetToolchain(setup.toolchain()); | 28 z.SetToolchain(setup.toolchain()); |
90 ASSERT_TRUE(z.OnResolved(&err)); | 29 ASSERT_TRUE(z.OnResolved(&err)); |
91 | 30 |
92 // All lib[_dir]s should be set when target is resolved. | 31 // All lib[_dir]s should be set when target is resolved. |
93 ASSERT_EQ(1u, z.all_libs().size()); | 32 ASSERT_EQ(1u, z.all_libs().size()); |
94 EXPECT_EQ(lib, z.all_libs()[0]); | 33 EXPECT_EQ(lib, z.all_libs()[0]); |
95 ASSERT_EQ(1u, z.all_lib_dirs().size()); | 34 ASSERT_EQ(1u, z.all_lib_dirs().size()); |
96 EXPECT_EQ(libdir, z.all_lib_dirs()[0]); | 35 EXPECT_EQ(libdir, z.all_lib_dirs()[0]); |
97 | 36 |
98 // Shared library target should inherit the libs from the static library | 37 // Shared library target should inherit the libs from the static library |
99 // and its own. Its own flag should be before the inherited one. | 38 // and its own. Its own flag should be before the inherited one. |
100 const std::string second_lib("bar"); | 39 const std::string second_lib("bar"); |
101 const SourceDir second_libdir("/bar_dir/"); | 40 const SourceDir second_libdir("/bar_dir/"); |
102 Target shared(setup.settings(), Label(SourceDir("//foo/"), "shared")); | 41 Target shared(setup.settings(), Label(SourceDir("//foo/"), "shared")); |
103 shared.set_output_type(Target::SHARED_LIBRARY); | 42 shared.set_output_type(Target::SHARED_LIBRARY); |
104 shared.config_values().libs().push_back(second_lib); | 43 shared.config_values().libs().push_back(second_lib); |
105 shared.config_values().lib_dirs().push_back(second_libdir); | 44 shared.config_values().lib_dirs().push_back(second_libdir); |
106 shared.deps().push_back(LabelTargetPair(&z)); | 45 shared.private_deps().push_back(LabelTargetPair(&z)); |
| 46 shared.visibility().SetPublic(); |
107 shared.SetToolchain(setup.toolchain()); | 47 shared.SetToolchain(setup.toolchain()); |
108 ASSERT_TRUE(shared.OnResolved(&err)); | 48 ASSERT_TRUE(shared.OnResolved(&err)); |
109 | 49 |
110 ASSERT_EQ(2u, shared.all_libs().size()); | 50 ASSERT_EQ(2u, shared.all_libs().size()); |
111 EXPECT_EQ(second_lib, shared.all_libs()[0]); | 51 EXPECT_EQ(second_lib, shared.all_libs()[0]); |
112 EXPECT_EQ(lib, shared.all_libs()[1]); | 52 EXPECT_EQ(lib, shared.all_libs()[1]); |
113 ASSERT_EQ(2u, shared.all_lib_dirs().size()); | 53 ASSERT_EQ(2u, shared.all_lib_dirs().size()); |
114 EXPECT_EQ(second_libdir, shared.all_lib_dirs()[0]); | 54 EXPECT_EQ(second_libdir, shared.all_lib_dirs()[0]); |
115 EXPECT_EQ(libdir, shared.all_lib_dirs()[1]); | 55 EXPECT_EQ(libdir, shared.all_lib_dirs()[1]); |
116 | 56 |
117 // Executable target shouldn't get either by depending on shared. | 57 // Executable target shouldn't get either by depending on shared. |
118 Target exec(setup.settings(), Label(SourceDir("//foo/"), "exec")); | 58 Target exec(setup.settings(), Label(SourceDir("//foo/"), "exec")); |
119 exec.set_output_type(Target::EXECUTABLE); | 59 exec.set_output_type(Target::EXECUTABLE); |
120 exec.deps().push_back(LabelTargetPair(&shared)); | 60 exec.private_deps().push_back(LabelTargetPair(&shared)); |
121 exec.SetToolchain(setup.toolchain()); | 61 exec.SetToolchain(setup.toolchain()); |
122 ASSERT_TRUE(exec.OnResolved(&err)); | 62 ASSERT_TRUE(exec.OnResolved(&err)); |
123 EXPECT_EQ(0u, exec.all_libs().size()); | 63 EXPECT_EQ(0u, exec.all_libs().size()); |
124 EXPECT_EQ(0u, exec.all_lib_dirs().size()); | 64 EXPECT_EQ(0u, exec.all_lib_dirs().size()); |
125 } | 65 } |
126 | 66 |
127 // Test all/direct_dependent_configs inheritance, and | 67 // Test all_dependent_configs, public_config inheritance, and |
128 // forward_dependent_configs_from | 68 // forward_dependent_configs_from |
129 TEST(Target, DependentConfigs) { | 69 TEST(Target, DependentConfigs) { |
130 TestWithScope setup; | 70 TestWithScope setup; |
131 Err err; | 71 Err err; |
132 | 72 |
133 // Set up a dependency chain of a -> b -> c | 73 // Set up a dependency chain of a -> b -> c |
134 Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); | 74 Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); |
135 a.set_output_type(Target::EXECUTABLE); | 75 a.set_output_type(Target::EXECUTABLE); |
| 76 a.visibility().SetPublic(); |
136 a.SetToolchain(setup.toolchain()); | 77 a.SetToolchain(setup.toolchain()); |
137 Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); | 78 Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); |
138 b.set_output_type(Target::STATIC_LIBRARY); | 79 b.set_output_type(Target::STATIC_LIBRARY); |
| 80 b.visibility().SetPublic(); |
139 b.SetToolchain(setup.toolchain()); | 81 b.SetToolchain(setup.toolchain()); |
140 Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); | 82 Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); |
141 c.set_output_type(Target::STATIC_LIBRARY); | 83 c.set_output_type(Target::STATIC_LIBRARY); |
| 84 c.visibility().SetPublic(); |
142 c.SetToolchain(setup.toolchain()); | 85 c.SetToolchain(setup.toolchain()); |
143 a.deps().push_back(LabelTargetPair(&b)); | 86 a.private_deps().push_back(LabelTargetPair(&b)); |
144 b.deps().push_back(LabelTargetPair(&c)); | 87 b.private_deps().push_back(LabelTargetPair(&c)); |
145 | 88 |
146 // Normal non-inherited config. | 89 // Normal non-inherited config. |
147 Config config(setup.settings(), Label(SourceDir("//foo/"), "config")); | 90 Config config(setup.settings(), Label(SourceDir("//foo/"), "config")); |
148 c.configs().push_back(LabelConfigPair(&config)); | 91 c.configs().push_back(LabelConfigPair(&config)); |
149 | 92 |
150 // All dependent config. | 93 // All dependent config. |
151 Config all(setup.settings(), Label(SourceDir("//foo/"), "all")); | 94 Config all(setup.settings(), Label(SourceDir("//foo/"), "all")); |
152 c.all_dependent_configs().push_back(LabelConfigPair(&all)); | 95 c.all_dependent_configs().push_back(LabelConfigPair(&all)); |
153 | 96 |
154 // Direct dependent config. | 97 // Direct dependent config. |
155 Config direct(setup.settings(), Label(SourceDir("//foo/"), "direct")); | 98 Config direct(setup.settings(), Label(SourceDir("//foo/"), "direct")); |
156 c.direct_dependent_configs().push_back(LabelConfigPair(&direct)); | 99 c.public_configs().push_back(LabelConfigPair(&direct)); |
157 | 100 |
158 ASSERT_TRUE(c.OnResolved(&err)); | 101 ASSERT_TRUE(c.OnResolved(&err)); |
159 ASSERT_TRUE(b.OnResolved(&err)); | 102 ASSERT_TRUE(b.OnResolved(&err)); |
160 ASSERT_TRUE(a.OnResolved(&err)); | 103 ASSERT_TRUE(a.OnResolved(&err)); |
161 | 104 |
162 // B should have gotten both dependent configs from C. | 105 // B should have gotten both dependent configs from C. |
163 ASSERT_EQ(2u, b.configs().size()); | 106 ASSERT_EQ(2u, b.configs().size()); |
164 EXPECT_EQ(&all, b.configs()[0].ptr); | 107 EXPECT_EQ(&all, b.configs()[0].ptr); |
165 EXPECT_EQ(&direct, b.configs()[1].ptr); | 108 EXPECT_EQ(&direct, b.configs()[1].ptr); |
166 ASSERT_EQ(1u, b.all_dependent_configs().size()); | 109 ASSERT_EQ(1u, b.all_dependent_configs().size()); |
167 EXPECT_EQ(&all, b.all_dependent_configs()[0].ptr); | 110 EXPECT_EQ(&all, b.all_dependent_configs()[0].ptr); |
168 | 111 |
169 // A should have just gotten the "all" dependent config from C. | 112 // A should have just gotten the "all" dependent config from C. |
170 ASSERT_EQ(1u, a.configs().size()); | 113 ASSERT_EQ(1u, a.configs().size()); |
171 EXPECT_EQ(&all, a.configs()[0].ptr); | 114 EXPECT_EQ(&all, a.configs()[0].ptr); |
172 EXPECT_EQ(&all, a.all_dependent_configs()[0].ptr); | 115 EXPECT_EQ(&all, a.all_dependent_configs()[0].ptr); |
173 | 116 |
174 // Making an an alternate A and B with B forwarding the direct dependents. | 117 // Making an an alternate A and B with B forwarding the direct dependents. |
175 Target a_fwd(setup.settings(), Label(SourceDir("//foo/"), "a_fwd")); | 118 Target a_fwd(setup.settings(), Label(SourceDir("//foo/"), "a_fwd")); |
176 a_fwd.set_output_type(Target::EXECUTABLE); | 119 a_fwd.set_output_type(Target::EXECUTABLE); |
| 120 a_fwd.visibility().SetPublic(); |
177 a_fwd.SetToolchain(setup.toolchain()); | 121 a_fwd.SetToolchain(setup.toolchain()); |
178 Target b_fwd(setup.settings(), Label(SourceDir("//foo/"), "b_fwd")); | 122 Target b_fwd(setup.settings(), Label(SourceDir("//foo/"), "b_fwd")); |
179 b_fwd.set_output_type(Target::STATIC_LIBRARY); | 123 b_fwd.set_output_type(Target::STATIC_LIBRARY); |
180 b_fwd.SetToolchain(setup.toolchain()); | 124 b_fwd.SetToolchain(setup.toolchain()); |
181 a_fwd.deps().push_back(LabelTargetPair(&b_fwd)); | 125 b_fwd.visibility().SetPublic(); |
182 b_fwd.deps().push_back(LabelTargetPair(&c)); | 126 a_fwd.private_deps().push_back(LabelTargetPair(&b_fwd)); |
| 127 b_fwd.private_deps().push_back(LabelTargetPair(&c)); |
183 b_fwd.forward_dependent_configs().push_back(LabelTargetPair(&c)); | 128 b_fwd.forward_dependent_configs().push_back(LabelTargetPair(&c)); |
184 | 129 |
185 ASSERT_TRUE(b_fwd.OnResolved(&err)); | 130 ASSERT_TRUE(b_fwd.OnResolved(&err)); |
186 ASSERT_TRUE(a_fwd.OnResolved(&err)); | 131 ASSERT_TRUE(a_fwd.OnResolved(&err)); |
187 | 132 |
188 // A_fwd should now have both configs. | 133 // A_fwd should now have both configs. |
189 ASSERT_EQ(2u, a_fwd.configs().size()); | 134 ASSERT_EQ(2u, a_fwd.configs().size()); |
190 EXPECT_EQ(&all, a_fwd.configs()[0].ptr); | 135 EXPECT_EQ(&all, a_fwd.configs()[0].ptr); |
191 EXPECT_EQ(&direct, a_fwd.configs()[1].ptr); | 136 EXPECT_EQ(&direct, a_fwd.configs()[1].ptr); |
192 ASSERT_EQ(1u, a_fwd.all_dependent_configs().size()); | 137 ASSERT_EQ(1u, a_fwd.all_dependent_configs().size()); |
193 EXPECT_EQ(&all, a_fwd.all_dependent_configs()[0].ptr); | 138 EXPECT_EQ(&all, a_fwd.all_dependent_configs()[0].ptr); |
194 } | 139 } |
195 | 140 |
196 // Tests that forward_dependent_configs_from works for groups, forwarding the | |
197 // group's deps' dependent configs. | |
198 TEST(Target, ForwardDependentConfigsFromGroups) { | |
199 TestWithScope setup; | |
200 Err err; | |
201 | |
202 Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); | |
203 a.set_output_type(Target::EXECUTABLE); | |
204 a.SetToolchain(setup.toolchain()); | |
205 Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); | |
206 b.set_output_type(Target::GROUP); | |
207 b.SetToolchain(setup.toolchain()); | |
208 Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); | |
209 c.set_output_type(Target::STATIC_LIBRARY); | |
210 c.SetToolchain(setup.toolchain()); | |
211 a.deps().push_back(LabelTargetPair(&b)); | |
212 b.deps().push_back(LabelTargetPair(&c)); | |
213 | |
214 // Direct dependent config on C. | |
215 Config direct(setup.settings(), Label(SourceDir("//foo/"), "direct")); | |
216 c.direct_dependent_configs().push_back(LabelConfigPair(&direct)); | |
217 | |
218 // A forwards the dependent configs from B. | |
219 a.forward_dependent_configs().push_back(LabelTargetPair(&b)); | |
220 | |
221 ASSERT_TRUE(c.OnResolved(&err)); | |
222 ASSERT_TRUE(b.OnResolved(&err)); | |
223 ASSERT_TRUE(a.OnResolved(&err)); | |
224 | |
225 // The config should now be on A, and in A's direct dependent configs. | |
226 ASSERT_EQ(1u, a.configs().size()); | |
227 ASSERT_EQ(&direct, a.configs()[0].ptr); | |
228 ASSERT_EQ(1u, a.direct_dependent_configs().size()); | |
229 ASSERT_EQ(&direct, a.direct_dependent_configs()[0].ptr); | |
230 } | |
231 | |
232 TEST(Target, InheritLibs) { | 141 TEST(Target, InheritLibs) { |
233 TestWithScope setup; | 142 TestWithScope setup; |
234 Err err; | 143 Err err; |
235 | 144 |
236 // Create a dependency chain: | 145 // Create a dependency chain: |
237 // A (executable) -> B (shared lib) -> C (static lib) -> D (source set) | 146 // A (executable) -> B (shared lib) -> C (static lib) -> D (source set) |
238 Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); | 147 Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); |
239 a.set_output_type(Target::EXECUTABLE); | 148 a.set_output_type(Target::EXECUTABLE); |
| 149 a.visibility().SetPublic(); |
240 a.SetToolchain(setup.toolchain()); | 150 a.SetToolchain(setup.toolchain()); |
241 Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); | 151 Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); |
242 b.set_output_type(Target::SHARED_LIBRARY); | 152 b.set_output_type(Target::SHARED_LIBRARY); |
| 153 b.visibility().SetPublic(); |
243 b.SetToolchain(setup.toolchain()); | 154 b.SetToolchain(setup.toolchain()); |
244 Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); | 155 Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); |
245 c.set_output_type(Target::STATIC_LIBRARY); | 156 c.set_output_type(Target::STATIC_LIBRARY); |
| 157 c.visibility().SetPublic(); |
246 c.SetToolchain(setup.toolchain()); | 158 c.SetToolchain(setup.toolchain()); |
247 Target d(setup.settings(), Label(SourceDir("//foo/"), "d")); | 159 Target d(setup.settings(), Label(SourceDir("//foo/"), "d")); |
248 d.set_output_type(Target::SOURCE_SET); | 160 d.set_output_type(Target::SOURCE_SET); |
| 161 d.visibility().SetPublic(); |
249 d.SetToolchain(setup.toolchain()); | 162 d.SetToolchain(setup.toolchain()); |
250 a.deps().push_back(LabelTargetPair(&b)); | 163 a.private_deps().push_back(LabelTargetPair(&b)); |
251 b.deps().push_back(LabelTargetPair(&c)); | 164 b.private_deps().push_back(LabelTargetPair(&c)); |
252 c.deps().push_back(LabelTargetPair(&d)); | 165 c.private_deps().push_back(LabelTargetPair(&d)); |
253 | 166 |
254 ASSERT_TRUE(d.OnResolved(&err)); | 167 ASSERT_TRUE(d.OnResolved(&err)); |
255 ASSERT_TRUE(c.OnResolved(&err)); | 168 ASSERT_TRUE(c.OnResolved(&err)); |
256 ASSERT_TRUE(b.OnResolved(&err)); | 169 ASSERT_TRUE(b.OnResolved(&err)); |
257 ASSERT_TRUE(a.OnResolved(&err)); | 170 ASSERT_TRUE(a.OnResolved(&err)); |
258 | 171 |
259 // C should have D in its inherited libs. | 172 // C should have D in its inherited libs. |
260 const UniqueVector<const Target*>& c_inherited = c.inherited_libraries(); | 173 const UniqueVector<const Target*>& c_inherited = c.inherited_libraries(); |
261 EXPECT_EQ(1u, c_inherited.size()); | 174 EXPECT_EQ(1u, c_inherited.size()); |
262 EXPECT_TRUE(c_inherited.IndexOf(&d) != static_cast<size_t>(-1)); | 175 EXPECT_TRUE(c_inherited.IndexOf(&d) != static_cast<size_t>(-1)); |
(...skipping 12 matching lines...) Expand all Loading... |
275 } | 188 } |
276 | 189 |
277 TEST(Target, InheritCompleteStaticLib) { | 190 TEST(Target, InheritCompleteStaticLib) { |
278 TestWithScope setup; | 191 TestWithScope setup; |
279 Err err; | 192 Err err; |
280 | 193 |
281 // Create a dependency chain: | 194 // Create a dependency chain: |
282 // A (executable) -> B (complete static lib) -> C (source set) | 195 // A (executable) -> B (complete static lib) -> C (source set) |
283 Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); | 196 Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); |
284 a.set_output_type(Target::EXECUTABLE); | 197 a.set_output_type(Target::EXECUTABLE); |
| 198 a.visibility().SetPublic(); |
285 a.SetToolchain(setup.toolchain()); | 199 a.SetToolchain(setup.toolchain()); |
286 Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); | 200 Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); |
287 b.set_output_type(Target::STATIC_LIBRARY); | 201 b.set_output_type(Target::STATIC_LIBRARY); |
| 202 b.visibility().SetPublic(); |
288 b.set_complete_static_lib(true); | 203 b.set_complete_static_lib(true); |
289 b.SetToolchain(setup.toolchain()); | 204 b.SetToolchain(setup.toolchain()); |
290 Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); | 205 Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); |
291 c.set_output_type(Target::SOURCE_SET); | 206 c.set_output_type(Target::SOURCE_SET); |
| 207 c.visibility().SetPublic(); |
292 c.SetToolchain(setup.toolchain()); | 208 c.SetToolchain(setup.toolchain()); |
293 a.deps().push_back(LabelTargetPair(&b)); | 209 a.public_deps().push_back(LabelTargetPair(&b)); |
294 b.deps().push_back(LabelTargetPair(&c)); | 210 b.public_deps().push_back(LabelTargetPair(&c)); |
295 | 211 |
296 ASSERT_TRUE(c.OnResolved(&err)); | 212 ASSERT_TRUE(c.OnResolved(&err)); |
297 ASSERT_TRUE(b.OnResolved(&err)); | 213 ASSERT_TRUE(b.OnResolved(&err)); |
298 ASSERT_TRUE(a.OnResolved(&err)); | 214 ASSERT_TRUE(a.OnResolved(&err)); |
299 | 215 |
300 // B should have C in its inherited libs. | 216 // B should have C in its inherited libs. |
301 const UniqueVector<const Target*>& b_inherited = b.inherited_libraries(); | 217 const UniqueVector<const Target*>& b_inherited = b.inherited_libraries(); |
302 EXPECT_EQ(1u, b_inherited.size()); | 218 EXPECT_EQ(1u, b_inherited.size()); |
303 EXPECT_TRUE(b_inherited.IndexOf(&c) != static_cast<size_t>(-1)); | 219 EXPECT_TRUE(b_inherited.IndexOf(&c) != static_cast<size_t>(-1)); |
304 | 220 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 Target b(setup.settings(), Label(SourceDir("//private/"), "b")); | 275 Target b(setup.settings(), Label(SourceDir("//private/"), "b")); |
360 b.set_output_type(Target::STATIC_LIBRARY); | 276 b.set_output_type(Target::STATIC_LIBRARY); |
361 b.SetToolchain(setup.toolchain()); | 277 b.SetToolchain(setup.toolchain()); |
362 b.visibility().SetPrivate(b.label().dir()); | 278 b.visibility().SetPrivate(b.label().dir()); |
363 ASSERT_TRUE(b.OnResolved(&err)); | 279 ASSERT_TRUE(b.OnResolved(&err)); |
364 | 280 |
365 // Make a target depending on "b". The dependency must have an origin to mark | 281 // Make a target depending on "b". The dependency must have an origin to mark |
366 // it as user-set so we check visibility. This check should fail. | 282 // it as user-set so we check visibility. This check should fail. |
367 Target a(setup.settings(), Label(SourceDir("//app/"), "a")); | 283 Target a(setup.settings(), Label(SourceDir("//app/"), "a")); |
368 a.set_output_type(Target::EXECUTABLE); | 284 a.set_output_type(Target::EXECUTABLE); |
369 a.deps().push_back(LabelTargetPair(&b)); | 285 a.private_deps().push_back(LabelTargetPair(&b)); |
370 IdentifierNode origin; // Dummy origin. | 286 IdentifierNode origin; // Dummy origin. |
371 a.deps()[0].origin = &origin; | 287 a.private_deps()[0].origin = &origin; |
372 a.SetToolchain(setup.toolchain()); | 288 a.SetToolchain(setup.toolchain()); |
373 ASSERT_FALSE(a.OnResolved(&err)); | 289 ASSERT_FALSE(a.OnResolved(&err)); |
374 } | 290 } |
375 | 291 |
376 // Test visibility with a single datadep. | 292 // Test visibility with a single data_dep. |
377 TEST(Target, VisibilityDatadeps) { | 293 TEST(Target, VisibilityDatadeps) { |
378 TestWithScope setup; | 294 TestWithScope setup; |
379 Err err; | 295 Err err; |
380 | 296 |
381 Target b(setup.settings(), Label(SourceDir("//public/"), "b")); | 297 Target b(setup.settings(), Label(SourceDir("//public/"), "b")); |
382 b.set_output_type(Target::STATIC_LIBRARY); | 298 b.set_output_type(Target::STATIC_LIBRARY); |
383 b.SetToolchain(setup.toolchain()); | 299 b.SetToolchain(setup.toolchain()); |
384 b.visibility().SetPublic(); | 300 b.visibility().SetPublic(); |
385 ASSERT_TRUE(b.OnResolved(&err)); | 301 ASSERT_TRUE(b.OnResolved(&err)); |
386 | 302 |
387 // Make a target depending on "b". The dependency must have an origin to mark | 303 // Make a target depending on "b". The dependency must have an origin to mark |
388 // it as user-set so we check visibility. This check should fail. | 304 // it as user-set so we check visibility. This check should fail. |
389 Target a(setup.settings(), Label(SourceDir("//app/"), "a")); | 305 Target a(setup.settings(), Label(SourceDir("//app/"), "a")); |
390 a.set_output_type(Target::EXECUTABLE); | 306 a.set_output_type(Target::EXECUTABLE); |
391 a.datadeps().push_back(LabelTargetPair(&b)); | 307 a.data_deps().push_back(LabelTargetPair(&b)); |
392 IdentifierNode origin; // Dummy origin. | 308 IdentifierNode origin; // Dummy origin. |
393 a.datadeps()[0].origin = &origin; | 309 a.data_deps()[0].origin = &origin; |
394 a.SetToolchain(setup.toolchain()); | 310 a.SetToolchain(setup.toolchain()); |
395 ASSERT_TRUE(a.OnResolved(&err)) << err.help_text(); | 311 ASSERT_TRUE(a.OnResolved(&err)) << err.help_text(); |
396 } | 312 } |
397 | 313 |
398 // Tests that A -> Group -> B where the group is visible from A but B isn't, | 314 // Tests that A -> Group -> B where the group is visible from A but B isn't, |
399 // passes visibility even though the group's deps get expanded into A. | 315 // passes visibility even though the group's deps get expanded into A. |
400 TEST(Target, VisibilityGroup) { | 316 TEST(Target, VisibilityGroup) { |
401 TestWithScope setup; | 317 TestWithScope setup; |
402 Err err; | 318 Err err; |
403 | 319 |
404 IdentifierNode origin; // Dummy origin. | 320 IdentifierNode origin; // Dummy origin. |
405 | 321 |
406 // B has private visibility. This lets the group see it since the group is in | 322 // B has private visibility. This lets the group see it since the group is in |
407 // the same directory. | 323 // the same directory. |
408 Target b(setup.settings(), Label(SourceDir("//private/"), "b")); | 324 Target b(setup.settings(), Label(SourceDir("//private/"), "b")); |
409 b.set_output_type(Target::STATIC_LIBRARY); | 325 b.set_output_type(Target::STATIC_LIBRARY); |
410 b.SetToolchain(setup.toolchain()); | 326 b.SetToolchain(setup.toolchain()); |
411 b.visibility().SetPrivate(b.label().dir()); | 327 b.visibility().SetPrivate(b.label().dir()); |
412 ASSERT_TRUE(b.OnResolved(&err)); | 328 ASSERT_TRUE(b.OnResolved(&err)); |
413 | 329 |
414 // The group has public visibility and depends on b. | 330 // The group has public visibility and depends on b. |
415 Target g(setup.settings(), Label(SourceDir("//private/"), "g")); | 331 Target g(setup.settings(), Label(SourceDir("//private/"), "g")); |
416 g.set_output_type(Target::GROUP); | 332 g.set_output_type(Target::GROUP); |
417 g.SetToolchain(setup.toolchain()); | 333 g.SetToolchain(setup.toolchain()); |
418 g.deps().push_back(LabelTargetPair(&b)); | 334 g.private_deps().push_back(LabelTargetPair(&b)); |
419 g.deps()[0].origin = &origin; | 335 g.private_deps()[0].origin = &origin; |
420 g.visibility().SetPublic(); | 336 g.visibility().SetPublic(); |
421 ASSERT_TRUE(b.OnResolved(&err)); | 337 ASSERT_TRUE(b.OnResolved(&err)); |
422 | 338 |
423 // Make a target depending on "g". This should succeed. | 339 // Make a target depending on "g". This should succeed. |
424 Target a(setup.settings(), Label(SourceDir("//app/"), "a")); | 340 Target a(setup.settings(), Label(SourceDir("//app/"), "a")); |
425 a.set_output_type(Target::EXECUTABLE); | 341 a.set_output_type(Target::EXECUTABLE); |
426 a.deps().push_back(LabelTargetPair(&g)); | 342 a.private_deps().push_back(LabelTargetPair(&g)); |
427 a.deps()[0].origin = &origin; | 343 a.private_deps()[0].origin = &origin; |
428 a.SetToolchain(setup.toolchain()); | 344 a.SetToolchain(setup.toolchain()); |
429 ASSERT_TRUE(a.OnResolved(&err)); | 345 ASSERT_TRUE(a.OnResolved(&err)); |
430 } | 346 } |
431 | 347 |
432 // Verifies that only testonly targets can depend on other testonly targets. | 348 // Verifies that only testonly targets can depend on other testonly targets. |
433 // Many of the above dependency checking cases covered the non-testonly | 349 // Many of the above dependency checking cases covered the non-testonly |
434 // case. | 350 // case. |
435 TEST(Target, Testonly) { | 351 TEST(Target, Testonly) { |
436 TestWithScope setup; | 352 TestWithScope setup; |
437 Err err; | 353 Err err; |
438 | 354 |
439 // "testlib" is a test-only library. | 355 // "testlib" is a test-only library. |
440 Target testlib(setup.settings(), Label(SourceDir("//test/"), "testlib")); | 356 Target testlib(setup.settings(), Label(SourceDir("//test/"), "testlib")); |
441 testlib.set_testonly(true); | 357 testlib.set_testonly(true); |
442 testlib.set_output_type(Target::STATIC_LIBRARY); | 358 testlib.set_output_type(Target::STATIC_LIBRARY); |
| 359 testlib.visibility().SetPublic(); |
443 testlib.SetToolchain(setup.toolchain()); | 360 testlib.SetToolchain(setup.toolchain()); |
444 ASSERT_TRUE(testlib.OnResolved(&err)); | 361 ASSERT_TRUE(testlib.OnResolved(&err)); |
445 | 362 |
446 // "test" is a test-only executable depending on testlib, this is OK. | 363 // "test" is a test-only executable depending on testlib, this is OK. |
447 Target test(setup.settings(), Label(SourceDir("//test/"), "test")); | 364 Target test(setup.settings(), Label(SourceDir("//test/"), "test")); |
448 test.set_testonly(true); | 365 test.set_testonly(true); |
449 test.set_output_type(Target::EXECUTABLE); | 366 test.set_output_type(Target::EXECUTABLE); |
450 test.deps().push_back(LabelTargetPair(&testlib)); | 367 test.private_deps().push_back(LabelTargetPair(&testlib)); |
451 test.SetToolchain(setup.toolchain()); | 368 test.SetToolchain(setup.toolchain()); |
452 ASSERT_TRUE(test.OnResolved(&err)); | 369 ASSERT_TRUE(test.OnResolved(&err)); |
453 | 370 |
454 // "product" is a non-test depending on testlib. This should fail. | 371 // "product" is a non-test depending on testlib. This should fail. |
455 Target product(setup.settings(), Label(SourceDir("//app/"), "product")); | 372 Target product(setup.settings(), Label(SourceDir("//app/"), "product")); |
456 product.set_testonly(false); | 373 product.set_testonly(false); |
457 product.set_output_type(Target::EXECUTABLE); | 374 product.set_output_type(Target::EXECUTABLE); |
458 product.deps().push_back(LabelTargetPair(&testlib)); | 375 product.private_deps().push_back(LabelTargetPair(&testlib)); |
459 product.SetToolchain(setup.toolchain()); | 376 product.SetToolchain(setup.toolchain()); |
460 ASSERT_FALSE(product.OnResolved(&err)); | 377 ASSERT_FALSE(product.OnResolved(&err)); |
461 } | 378 } |
OLD | NEW |