Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: tools/gn/target_unittest.cc

Issue 561273003: Add public deps to GN (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: merge Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tools/gn/target_generator.cc ('k') | tools/gn/variables.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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 }
OLDNEW
« no previous file with comments | « tools/gn/target_generator.cc ('k') | tools/gn/variables.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698