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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: tools/gn/target_unittest.cc
diff --git a/tools/gn/target_unittest.cc b/tools/gn/target_unittest.cc
index 8cc29e1771b555a2fa35b3b3fcf875d7008a9018..020d43226763d0d02b795e574b82d96f87e8c024 100644
--- a/tools/gn/target_unittest.cc
+++ b/tools/gn/target_unittest.cc
@@ -170,21 +170,21 @@ TEST(Target, InheritLibs) {
ASSERT_TRUE(a.OnResolved(&err));
// C should have D in its inherited libs.
- const UniqueVector<const Target*>& c_inherited = c.inherited_libraries();
- EXPECT_EQ(1u, c_inherited.size());
- EXPECT_TRUE(c_inherited.IndexOf(&d) != static_cast<size_t>(-1));
+ std::vector<const Target*> c_inherited = c.inherited_libraries().GetOrdered();
+ ASSERT_EQ(1u, c_inherited.size());
+ EXPECT_EQ(&d, c_inherited[0]);
// B should have C and D in its inherited libs.
- const UniqueVector<const Target*>& b_inherited = b.inherited_libraries();
- EXPECT_EQ(2u, b_inherited.size());
- EXPECT_TRUE(b_inherited.IndexOf(&c) != static_cast<size_t>(-1));
- EXPECT_TRUE(b_inherited.IndexOf(&d) != static_cast<size_t>(-1));
+ std::vector<const Target*> b_inherited = b.inherited_libraries().GetOrdered();
+ ASSERT_EQ(2u, b_inherited.size());
+ EXPECT_EQ(&c, b_inherited[0]);
+ EXPECT_EQ(&d, b_inherited[1]);
// A should have B in its inherited libs, but not any others (the shared
// library will include the static library and source set).
- const UniqueVector<const Target*>& a_inherited = a.inherited_libraries();
- EXPECT_EQ(1u, a_inherited.size());
- EXPECT_TRUE(a_inherited.IndexOf(&b) != static_cast<size_t>(-1));
+ std::vector<const Target*> a_inherited = a.inherited_libraries().GetOrdered();
+ ASSERT_EQ(1u, a_inherited.size());
+ EXPECT_EQ(&b, a_inherited[0]);
}
TEST(Target, InheritCompleteStaticLib) {
@@ -214,15 +214,15 @@ TEST(Target, InheritCompleteStaticLib) {
ASSERT_TRUE(a.OnResolved(&err));
// B should have C in its inherited libs.
- const UniqueVector<const Target*>& b_inherited = b.inherited_libraries();
- EXPECT_EQ(1u, b_inherited.size());
- EXPECT_TRUE(b_inherited.IndexOf(&c) != static_cast<size_t>(-1));
+ std::vector<const Target*> b_inherited = b.inherited_libraries().GetOrdered();
+ ASSERT_EQ(1u, b_inherited.size());
+ EXPECT_EQ(&c, b_inherited[0]);
// A should have B in its inherited libs, but not any others (the complete
// static library will include the source set).
- const UniqueVector<const Target*>& a_inherited = a.inherited_libraries();
+ std::vector<const Target*> a_inherited = a.inherited_libraries().GetOrdered();
EXPECT_EQ(1u, a_inherited.size());
- EXPECT_TRUE(a_inherited.IndexOf(&b) != static_cast<size_t>(-1));
+ EXPECT_EQ(&b, a_inherited[0]);
}
TEST(Target, InheritCompleteStaticLibNoDirectStaticLibDeps) {
@@ -516,3 +516,57 @@ TEST(Target, LinkAndDepOutputs) {
EXPECT_EQ("./liba.so", target.link_output_file().value());
EXPECT_EQ("./liba.so.TOC", target.dependency_output_file().value());
}
+
+// Shared libraries should be inherited across public shared liobrary
+// boundaries.
+TEST(Target, SharedInheritance) {
+ TestWithScope setup;
+ Err err;
+
+ // Create two leaf shared libraries.
+ Target pub(setup.settings(), Label(SourceDir("//foo/"), "pub"));
+ pub.set_output_type(Target::SHARED_LIBRARY);
+ pub.visibility().SetPublic();
+ pub.SetToolchain(setup.toolchain());
+ ASSERT_TRUE(pub.OnResolved(&err));
+
+ Target priv(setup.settings(), Label(SourceDir("//foo/"), "priv"));
+ priv.set_output_type(Target::SHARED_LIBRARY);
+ priv.visibility().SetPublic();
+ priv.SetToolchain(setup.toolchain());
+ ASSERT_TRUE(priv.OnResolved(&err));
+
+ // Intermediate shared library with the leaf shared libraries as
+ // dependencies, one public, one private.
+ Target inter(setup.settings(), Label(SourceDir("//foo/"), "inter"));
+ inter.set_output_type(Target::SHARED_LIBRARY);
+ inter.visibility().SetPublic();
+ inter.public_deps().push_back(LabelTargetPair(&pub));
+ inter.private_deps().push_back(LabelTargetPair(&priv));
+ inter.SetToolchain(setup.toolchain());
+ ASSERT_TRUE(inter.OnResolved(&err));
+
+ // The intermediate shared library should have both "pub" and "priv" in its
+ // inherited libraries.
+ std::vector<const Target*> inter_inherited =
+ inter.inherited_libraries().GetOrdered();
+ ASSERT_EQ(2u, inter_inherited.size());
+ EXPECT_EQ(&pub, inter_inherited[0]);
+ EXPECT_EQ(&priv, inter_inherited[1]);
+
+ // Make a toplevel executable target depending on the intermediate one.
+ Target exe(setup.settings(), Label(SourceDir("//foo/"), "exe"));
+ exe.set_output_type(Target::SHARED_LIBRARY);
+ exe.visibility().SetPublic();
+ exe.private_deps().push_back(LabelTargetPair(&inter));
+ exe.SetToolchain(setup.toolchain());
+ ASSERT_TRUE(exe.OnResolved(&err));
+
+ // The exe's inherited libraries should be "inter" (because it depended
+ // directly on it) and "pub" (because inter depended publicly on it).
+ std::vector<const Target*> exe_inherited =
+ exe.inherited_libraries().GetOrdered();
+ ASSERT_EQ(2u, exe_inherited.size());
+ EXPECT_EQ(&inter, exe_inherited[0]);
+ EXPECT_EQ(&pub, exe_inherited[1]);
+}
« 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