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

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

Issue 1083663007: Propagate GN public shared libraries through shared libraries (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: more docs Created 5 years, 8 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
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"
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 a.private_deps().push_back(LabelTargetPair(&b)); 163 a.private_deps().push_back(LabelTargetPair(&b));
164 b.private_deps().push_back(LabelTargetPair(&c)); 164 b.private_deps().push_back(LabelTargetPair(&c));
165 c.private_deps().push_back(LabelTargetPair(&d)); 165 c.private_deps().push_back(LabelTargetPair(&d));
166 166
167 ASSERT_TRUE(d.OnResolved(&err)); 167 ASSERT_TRUE(d.OnResolved(&err));
168 ASSERT_TRUE(c.OnResolved(&err)); 168 ASSERT_TRUE(c.OnResolved(&err));
169 ASSERT_TRUE(b.OnResolved(&err)); 169 ASSERT_TRUE(b.OnResolved(&err));
170 ASSERT_TRUE(a.OnResolved(&err)); 170 ASSERT_TRUE(a.OnResolved(&err));
171 171
172 // C should have D in its inherited libs. 172 // C should have D in its inherited libs.
173 const UniqueVector<const Target*>& c_inherited = c.inherited_libraries(); 173 std::vector<const Target*> c_inherited = c.inherited_libraries().GetOrdered();
174 EXPECT_EQ(1u, c_inherited.size()); 174 ASSERT_EQ(1u, c_inherited.size());
175 EXPECT_TRUE(c_inherited.IndexOf(&d) != static_cast<size_t>(-1)); 175 EXPECT_EQ(&d, c_inherited[0]);
176 176
177 // B should have C and D in its inherited libs. 177 // B should have C and D in its inherited libs.
178 const UniqueVector<const Target*>& b_inherited = b.inherited_libraries(); 178 std::vector<const Target*> b_inherited = b.inherited_libraries().GetOrdered();
179 EXPECT_EQ(2u, b_inherited.size()); 179 ASSERT_EQ(2u, b_inherited.size());
180 EXPECT_TRUE(b_inherited.IndexOf(&c) != static_cast<size_t>(-1)); 180 EXPECT_EQ(&c, b_inherited[0]);
181 EXPECT_TRUE(b_inherited.IndexOf(&d) != static_cast<size_t>(-1)); 181 EXPECT_EQ(&d, b_inherited[1]);
182 182
183 // A should have B in its inherited libs, but not any others (the shared 183 // A should have B in its inherited libs, but not any others (the shared
184 // library will include the static library and source set). 184 // library will include the static library and source set).
185 const UniqueVector<const Target*>& a_inherited = a.inherited_libraries(); 185 std::vector<const Target*> a_inherited = a.inherited_libraries().GetOrdered();
186 EXPECT_EQ(1u, a_inherited.size()); 186 ASSERT_EQ(1u, a_inherited.size());
187 EXPECT_TRUE(a_inherited.IndexOf(&b) != static_cast<size_t>(-1)); 187 EXPECT_EQ(&b, a_inherited[0]);
188 } 188 }
189 189
190 TEST(Target, InheritCompleteStaticLib) { 190 TEST(Target, InheritCompleteStaticLib) {
191 TestWithScope setup; 191 TestWithScope setup;
192 Err err; 192 Err err;
193 193
194 // Create a dependency chain: 194 // Create a dependency chain:
195 // A (executable) -> B (complete static lib) -> C (source set) 195 // A (executable) -> B (complete static lib) -> C (source set)
196 Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); 196 Target a(setup.settings(), Label(SourceDir("//foo/"), "a"));
197 a.set_output_type(Target::EXECUTABLE); 197 a.set_output_type(Target::EXECUTABLE);
198 a.visibility().SetPublic(); 198 a.visibility().SetPublic();
199 a.SetToolchain(setup.toolchain()); 199 a.SetToolchain(setup.toolchain());
200 Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); 200 Target b(setup.settings(), Label(SourceDir("//foo/"), "b"));
201 b.set_output_type(Target::STATIC_LIBRARY); 201 b.set_output_type(Target::STATIC_LIBRARY);
202 b.visibility().SetPublic(); 202 b.visibility().SetPublic();
203 b.set_complete_static_lib(true); 203 b.set_complete_static_lib(true);
204 b.SetToolchain(setup.toolchain()); 204 b.SetToolchain(setup.toolchain());
205 Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); 205 Target c(setup.settings(), Label(SourceDir("//foo/"), "c"));
206 c.set_output_type(Target::SOURCE_SET); 206 c.set_output_type(Target::SOURCE_SET);
207 c.visibility().SetPublic(); 207 c.visibility().SetPublic();
208 c.SetToolchain(setup.toolchain()); 208 c.SetToolchain(setup.toolchain());
209 a.public_deps().push_back(LabelTargetPair(&b)); 209 a.public_deps().push_back(LabelTargetPair(&b));
210 b.public_deps().push_back(LabelTargetPair(&c)); 210 b.public_deps().push_back(LabelTargetPair(&c));
211 211
212 ASSERT_TRUE(c.OnResolved(&err)); 212 ASSERT_TRUE(c.OnResolved(&err));
213 ASSERT_TRUE(b.OnResolved(&err)); 213 ASSERT_TRUE(b.OnResolved(&err));
214 ASSERT_TRUE(a.OnResolved(&err)); 214 ASSERT_TRUE(a.OnResolved(&err));
215 215
216 // B should have C in its inherited libs. 216 // B should have C in its inherited libs.
217 const UniqueVector<const Target*>& b_inherited = b.inherited_libraries(); 217 std::vector<const Target*> b_inherited = b.inherited_libraries().GetOrdered();
218 EXPECT_EQ(1u, b_inherited.size()); 218 ASSERT_EQ(1u, b_inherited.size());
219 EXPECT_TRUE(b_inherited.IndexOf(&c) != static_cast<size_t>(-1)); 219 EXPECT_EQ(&c, b_inherited[0]);
220 220
221 // A should have B in its inherited libs, but not any others (the complete 221 // A should have B in its inherited libs, but not any others (the complete
222 // static library will include the source set). 222 // static library will include the source set).
223 const UniqueVector<const Target*>& a_inherited = a.inherited_libraries(); 223 std::vector<const Target*> a_inherited = a.inherited_libraries().GetOrdered();
224 EXPECT_EQ(1u, a_inherited.size()); 224 EXPECT_EQ(1u, a_inherited.size());
225 EXPECT_TRUE(a_inherited.IndexOf(&b) != static_cast<size_t>(-1)); 225 EXPECT_EQ(&b, a_inherited[0]);
226 } 226 }
227 227
228 TEST(Target, InheritCompleteStaticLibNoDirectStaticLibDeps) { 228 TEST(Target, InheritCompleteStaticLibNoDirectStaticLibDeps) {
229 TestWithScope setup; 229 TestWithScope setup;
230 Err err; 230 Err err;
231 231
232 // Create a dependency chain: 232 // Create a dependency chain:
233 // A (complete static lib) -> B (static lib) 233 // A (complete static lib) -> B (static lib)
234 Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); 234 Target a(setup.settings(), Label(SourceDir("//foo/"), "a"));
235 a.set_output_type(Target::STATIC_LIBRARY); 235 a.set_output_type(Target::STATIC_LIBRARY);
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 toolchain.SetTool(Toolchain::TYPE_SOLINK, solink_tool.Pass()); 509 toolchain.SetTool(Toolchain::TYPE_SOLINK, solink_tool.Pass());
510 510
511 Target target(setup.settings(), Label(SourceDir("//a/"), "a")); 511 Target target(setup.settings(), Label(SourceDir("//a/"), "a"));
512 target.set_output_type(Target::SHARED_LIBRARY); 512 target.set_output_type(Target::SHARED_LIBRARY);
513 target.SetToolchain(&toolchain); 513 target.SetToolchain(&toolchain);
514 ASSERT_TRUE(target.OnResolved(&err)); 514 ASSERT_TRUE(target.OnResolved(&err));
515 515
516 EXPECT_EQ("./liba.so", target.link_output_file().value()); 516 EXPECT_EQ("./liba.so", target.link_output_file().value());
517 EXPECT_EQ("./liba.so.TOC", target.dependency_output_file().value()); 517 EXPECT_EQ("./liba.so.TOC", target.dependency_output_file().value());
518 } 518 }
519
520 // Shared libraries should be inherited across public shared liobrary
521 // boundaries.
522 TEST(Target, SharedInheritance) {
523 TestWithScope setup;
524 Err err;
525
526 // Create two leaf shared libraries.
527 Target pub(setup.settings(), Label(SourceDir("//foo/"), "pub"));
528 pub.set_output_type(Target::SHARED_LIBRARY);
529 pub.visibility().SetPublic();
530 pub.SetToolchain(setup.toolchain());
531 ASSERT_TRUE(pub.OnResolved(&err));
532
533 Target priv(setup.settings(), Label(SourceDir("//foo/"), "priv"));
534 priv.set_output_type(Target::SHARED_LIBRARY);
535 priv.visibility().SetPublic();
536 priv.SetToolchain(setup.toolchain());
537 ASSERT_TRUE(priv.OnResolved(&err));
538
539 // Intermediate shared library with the leaf shared libraries as
540 // dependencies, one public, one private.
541 Target inter(setup.settings(), Label(SourceDir("//foo/"), "inter"));
542 inter.set_output_type(Target::SHARED_LIBRARY);
543 inter.visibility().SetPublic();
544 inter.public_deps().push_back(LabelTargetPair(&pub));
545 inter.private_deps().push_back(LabelTargetPair(&priv));
546 inter.SetToolchain(setup.toolchain());
547 ASSERT_TRUE(inter.OnResolved(&err));
548
549 // The intermediate shared library should have both "pub" and "priv" in its
550 // inherited libraries.
551 std::vector<const Target*> inter_inherited =
552 inter.inherited_libraries().GetOrdered();
553 ASSERT_EQ(2u, inter_inherited.size());
554 EXPECT_EQ(&pub, inter_inherited[0]);
555 EXPECT_EQ(&priv, inter_inherited[1]);
556
557 // Make a toplevel executable target depending on the intermediate one.
558 Target exe(setup.settings(), Label(SourceDir("//foo/"), "exe"));
559 exe.set_output_type(Target::SHARED_LIBRARY);
560 exe.visibility().SetPublic();
561 exe.private_deps().push_back(LabelTargetPair(&inter));
562 exe.SetToolchain(setup.toolchain());
563 ASSERT_TRUE(exe.OnResolved(&err));
564
565 // The exe's inherited libraries should be "inter" (because it depended
566 // directly on it) and "pub" (because inter depended publicly on it).
567 std::vector<const Target*> exe_inherited =
568 exe.inherited_libraries().GetOrdered();
569 ASSERT_EQ(2u, exe_inherited.size());
570 EXPECT_EQ(&inter, exe_inherited[0]);
571 EXPECT_EQ(&pub, exe_inherited[1]);
572 }
OLDNEW
« tools/gn/target.h ('K') | « tools/gn/target.cc ('k') | tools/gn/variables.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698