158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file. 458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "tools/gn/build_settings.h" 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "tools/gn/config.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "tools/gn/settings.h" 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "tools/gn/target.h" 1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "tools/gn/test_with_scope.h" 1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "tools/gn/toolchain.h" 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Tests that lib[_dir]s are inherited across deps boundaries for static 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// libraries but not executables. 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(Target, LibInheritance) { 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TestWithScope setup; 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Err err; 1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string lib("foo"); 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const SourceDir libdir("/foo_dir/"); 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Leaf target with ldflags set. 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target z(setup.settings(), Label(SourceDir("//foo/"), "z")); 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) z.set_output_type(Target::STATIC_LIBRARY); 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) z.config_values().libs().push_back(lib); 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) z.config_values().lib_dirs().push_back(libdir); 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci z.visibility().SetPublic(); 2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) z.SetToolchain(setup.toolchain()); 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(z.OnResolved(&err)); 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // All lib[_dir]s should be set when target is resolved. 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_EQ(1u, z.all_libs().size()); 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(lib, z.all_libs()[0]); 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_EQ(1u, z.all_lib_dirs().size()); 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(libdir, z.all_lib_dirs()[0]); 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Shared library target should inherit the libs from the static library 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // and its own. Its own flag should be before the inherited one. 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string second_lib("bar"); 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const SourceDir second_libdir("/bar_dir/"); 4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target shared(setup.settings(), Label(SourceDir("//foo/"), "shared")); 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shared.set_output_type(Target::SHARED_LIBRARY); 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) shared.config_values().libs().push_back(second_lib); 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) shared.config_values().lib_dirs().push_back(second_libdir); 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci shared.private_deps().push_back(LabelTargetPair(&z)); 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci shared.visibility().SetPublic(); 4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) shared.SetToolchain(setup.toolchain()); 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(shared.OnResolved(&err)); 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_EQ(2u, shared.all_libs().size()); 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(second_lib, shared.all_libs()[0]); 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(lib, shared.all_libs()[1]); 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_EQ(2u, shared.all_lib_dirs().size()); 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(second_libdir, shared.all_lib_dirs()[0]); 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(libdir, shared.all_lib_dirs()[1]); 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Executable target shouldn't get either by depending on shared. 5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target exec(setup.settings(), Label(SourceDir("//foo/"), "exec")); 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) exec.set_output_type(Target::EXECUTABLE); 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci exec.private_deps().push_back(LabelTargetPair(&shared)); 6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) exec.SetToolchain(setup.toolchain()); 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(exec.OnResolved(&err)); 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, exec.all_libs().size()); 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, exec.all_lib_dirs().size()); 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test all_dependent_configs, public_config inheritance, and 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// forward_dependent_configs_from 6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(Target, DependentConfigs) { 7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TestWithScope setup; 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Err err; 7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Set up a dependency chain of a -> b -> c 7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) a.set_output_type(Target::EXECUTABLE); 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.visibility().SetPublic(); 7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) a.SetToolchain(setup.toolchain()); 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) b.set_output_type(Target::STATIC_LIBRARY); 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.visibility().SetPublic(); 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) b.SetToolchain(setup.toolchain()); 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) c.set_output_type(Target::STATIC_LIBRARY); 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci c.visibility().SetPublic(); 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) c.SetToolchain(setup.toolchain()); 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.private_deps().push_back(LabelTargetPair(&b)); 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.private_deps().push_back(LabelTargetPair(&c)); 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Normal non-inherited config. 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Config config(setup.settings(), Label(SourceDir("//foo/"), "config")); 910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) c.configs().push_back(LabelConfigPair(&config)); 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // All dependent config. 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Config all(setup.settings(), Label(SourceDir("//foo/"), "all")); 950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) c.all_dependent_configs().push_back(LabelConfigPair(&all)); 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Direct dependent config. 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Config direct(setup.settings(), Label(SourceDir("//foo/"), "direct")); 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci c.public_configs().push_back(LabelConfigPair(&direct)); 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(c.OnResolved(&err)); 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(b.OnResolved(&err)); 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(a.OnResolved(&err)); 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // B should have gotten both dependent configs from C. 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(2u, b.configs().size()); 1070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ(&all, b.configs()[0].ptr); 1080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ(&direct, b.configs()[1].ptr); 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(1u, b.all_dependent_configs().size()); 1100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ(&all, b.all_dependent_configs()[0].ptr); 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // A should have just gotten the "all" dependent config from C. 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(1u, a.configs().size()); 1140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ(&all, a.configs()[0].ptr); 1150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ(&all, a.all_dependent_configs()[0].ptr); 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Making an an alternate A and B with B forwarding the direct dependents. 11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target a_fwd(setup.settings(), Label(SourceDir("//foo/"), "a_fwd")); 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) a_fwd.set_output_type(Target::EXECUTABLE); 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a_fwd.visibility().SetPublic(); 12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) a_fwd.SetToolchain(setup.toolchain()); 12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target b_fwd(setup.settings(), Label(SourceDir("//foo/"), "b_fwd")); 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) b_fwd.set_output_type(Target::STATIC_LIBRARY); 12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) b_fwd.SetToolchain(setup.toolchain()); 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b_fwd.visibility().SetPublic(); 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a_fwd.private_deps().push_back(LabelTargetPair(&b_fwd)); 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b_fwd.private_deps().push_back(LabelTargetPair(&c)); 1280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) b_fwd.forward_dependent_configs().push_back(LabelTargetPair(&c)); 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(b_fwd.OnResolved(&err)); 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(a_fwd.OnResolved(&err)); 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // A_fwd should now have both configs. 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(2u, a_fwd.configs().size()); 1350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ(&all, a_fwd.configs()[0].ptr); 1360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ(&direct, a_fwd.configs()[1].ptr); 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(1u, a_fwd.all_dependent_configs().size()); 1380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ(&all, a_fwd.all_dependent_configs()[0].ptr); 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(Target, InheritLibs) { 14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TestWithScope setup; 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Err err; 14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Create a dependency chain: 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // A (executable) -> B (shared lib) -> C (static lib) -> D (source set) 14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) a.set_output_type(Target::EXECUTABLE); 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.visibility().SetPublic(); 15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) a.SetToolchain(setup.toolchain()); 15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) b.set_output_type(Target::SHARED_LIBRARY); 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.visibility().SetPublic(); 15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) b.SetToolchain(setup.toolchain()); 15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) c.set_output_type(Target::STATIC_LIBRARY); 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci c.visibility().SetPublic(); 15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) c.SetToolchain(setup.toolchain()); 15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target d(setup.settings(), Label(SourceDir("//foo/"), "d")); 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) d.set_output_type(Target::SOURCE_SET); 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci d.visibility().SetPublic(); 16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) d.SetToolchain(setup.toolchain()); 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.private_deps().push_back(LabelTargetPair(&b)); 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.private_deps().push_back(LabelTargetPair(&c)); 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci c.private_deps().push_back(LabelTargetPair(&d)); 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(d.OnResolved(&err)); 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(c.OnResolved(&err)); 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(b.OnResolved(&err)); 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(a.OnResolved(&err)); 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // C should have D in its inherited libs. 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const UniqueVector<const Target*>& c_inherited = c.inherited_libraries(); 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1u, c_inherited.size()); 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(c_inherited.IndexOf(&d) != static_cast<size_t>(-1)); 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // B should have C and D in its inherited libs. 1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const UniqueVector<const Target*>& b_inherited = b.inherited_libraries(); 17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(2u, b_inherited.size()); 1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(b_inherited.IndexOf(&c) != static_cast<size_t>(-1)); 1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(b_inherited.IndexOf(&d) != static_cast<size_t>(-1)); 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // A should have B in its inherited libs, but not any others (the shared 18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // library will include the static library and source set). 1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const UniqueVector<const Target*>& a_inherited = a.inherited_libraries(); 186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1u, a_inherited.size()); 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(a_inherited.IndexOf(&b) != static_cast<size_t>(-1)); 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, InheritCompleteStaticLib) { 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestWithScope setup; 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Err err; 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Create a dependency chain: 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // A (executable) -> B (complete static lib) -> C (source set) 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.set_output_type(Target::EXECUTABLE); 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.visibility().SetPublic(); 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.SetToolchain(setup.toolchain()); 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.set_output_type(Target::STATIC_LIBRARY); 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.visibility().SetPublic(); 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.set_complete_static_lib(true); 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.SetToolchain(setup.toolchain()); 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci c.set_output_type(Target::SOURCE_SET); 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci c.visibility().SetPublic(); 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci c.SetToolchain(setup.toolchain()); 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.public_deps().push_back(LabelTargetPair(&b)); 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.public_deps().push_back(LabelTargetPair(&c)); 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(c.OnResolved(&err)); 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(b.OnResolved(&err)); 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(a.OnResolved(&err)); 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // B should have C in its inherited libs. 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const UniqueVector<const Target*>& b_inherited = b.inherited_libraries(); 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1u, b_inherited.size()); 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(b_inherited.IndexOf(&c) != static_cast<size_t>(-1)); 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // A should have B in its inherited libs, but not any others (the complete 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // static library will include the source set). 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const UniqueVector<const Target*>& a_inherited = a.inherited_libraries(); 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1u, a_inherited.size()); 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(a_inherited.IndexOf(&b) != static_cast<size_t>(-1)); 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, InheritCompleteStaticLibNoDirectStaticLibDeps) { 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestWithScope setup; 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Err err; 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Create a dependency chain: 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // A (complete static lib) -> B (static lib) 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.set_output_type(Target::STATIC_LIBRARY); 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.visibility().SetPublic(); 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.set_complete_static_lib(true); 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.SetToolchain(setup.toolchain()); 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.set_output_type(Target::STATIC_LIBRARY); 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.visibility().SetPublic(); 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.SetToolchain(setup.toolchain()); 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.public_deps().push_back(LabelTargetPair(&b)); 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(b.OnResolved(&err)); 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_FALSE(a.OnResolved(&err)); 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, InheritCompleteStaticLibNoIheritedStaticLibDeps) { 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestWithScope setup; 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Err err; 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Create a dependency chain: 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // A (complete static lib) -> B (source set) -> C (static lib) 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.set_output_type(Target::STATIC_LIBRARY); 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.visibility().SetPublic(); 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.set_complete_static_lib(true); 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.SetToolchain(setup.toolchain()); 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.set_output_type(Target::SOURCE_SET); 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.visibility().SetPublic(); 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.SetToolchain(setup.toolchain()); 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci c.set_output_type(Target::STATIC_LIBRARY); 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci c.visibility().SetPublic(); 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci c.SetToolchain(setup.toolchain()); 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.public_deps().push_back(LabelTargetPair(&b)); 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.public_deps().push_back(LabelTargetPair(&c)); 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(c.OnResolved(&err)); 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(b.OnResolved(&err)); 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_FALSE(a.OnResolved(&err)); 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 27703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(Target, GetComputedOutputName) { 27803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TestWithScope setup; 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Err err; 28003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 28103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Basic target with no prefix (executable type tool in the TestWithScope has 28203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // no prefix) or output name. 28303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target basic(setup.settings(), Label(SourceDir("//foo/"), "bar")); 28403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) basic.set_output_type(Target::EXECUTABLE); 28503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) basic.SetToolchain(setup.toolchain()); 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(basic.OnResolved(&err)); 28703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("bar", basic.GetComputedOutputName(false)); 28803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("bar", basic.GetComputedOutputName(true)); 28903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 29003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Target with no prefix but an output name. 29103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target with_name(setup.settings(), Label(SourceDir("//foo/"), "bar")); 29203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) with_name.set_output_type(Target::EXECUTABLE); 29303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) with_name.set_output_name("myoutput"); 29403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) with_name.SetToolchain(setup.toolchain()); 2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(with_name.OnResolved(&err)); 29603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("myoutput", with_name.GetComputedOutputName(false)); 29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("myoutput", with_name.GetComputedOutputName(true)); 29803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 29903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Target with a "lib" prefix (the static library tool in the TestWithScope 30003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // should specify a "lib" output prefix). 30103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target with_prefix(setup.settings(), Label(SourceDir("//foo/"), "bar")); 30203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) with_prefix.set_output_type(Target::STATIC_LIBRARY); 30303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) with_prefix.SetToolchain(setup.toolchain()); 3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(with_prefix.OnResolved(&err)); 30503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("bar", with_prefix.GetComputedOutputName(false)); 30603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("libbar", with_prefix.GetComputedOutputName(true)); 30703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 30803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Target with a "lib" prefix that already has it applied. The prefix should 30903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // not duplicate something already in the target name. 31003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target dup_prefix(setup.settings(), Label(SourceDir("//foo/"), "bar")); 31103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) dup_prefix.set_output_type(Target::STATIC_LIBRARY); 31203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) dup_prefix.set_output_name("libbar"); 31303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) dup_prefix.SetToolchain(setup.toolchain()); 3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(dup_prefix.OnResolved(&err)); 31503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("libbar", dup_prefix.GetComputedOutputName(false)); 31603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("libbar", dup_prefix.GetComputedOutputName(true)); 31703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test visibility failure case. 3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, VisibilityFails) { 3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestWithScope setup; 3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Err err; 3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target b(setup.settings(), Label(SourceDir("//private/"), "b")); 3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.set_output_type(Target::STATIC_LIBRARY); 3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.SetToolchain(setup.toolchain()); 3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.visibility().SetPrivate(b.label().dir()); 3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(b.OnResolved(&err)); 3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Make a target depending on "b". The dependency must have an origin to mark 3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // it as user-set so we check visibility. This check should fail. 3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target a(setup.settings(), Label(SourceDir("//app/"), "a")); 3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.set_output_type(Target::EXECUTABLE); 3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.private_deps().push_back(LabelTargetPair(&b)); 3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IdentifierNode origin; // Dummy origin. 3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.private_deps()[0].origin = &origin; 3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.SetToolchain(setup.toolchain()); 3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_FALSE(a.OnResolved(&err)); 3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test visibility with a single data_dep. 3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, VisibilityDatadeps) { 3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestWithScope setup; 3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Err err; 3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target b(setup.settings(), Label(SourceDir("//public/"), "b")); 3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.set_output_type(Target::STATIC_LIBRARY); 3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.SetToolchain(setup.toolchain()); 3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.visibility().SetPublic(); 3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(b.OnResolved(&err)); 3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Make a target depending on "b". The dependency must have an origin to mark 3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // it as user-set so we check visibility. This check should fail. 3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target a(setup.settings(), Label(SourceDir("//app/"), "a")); 3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.set_output_type(Target::EXECUTABLE); 3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.data_deps().push_back(LabelTargetPair(&b)); 3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IdentifierNode origin; // Dummy origin. 3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.data_deps()[0].origin = &origin; 3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.SetToolchain(setup.toolchain()); 3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(a.OnResolved(&err)) << err.help_text(); 3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that A -> Group -> B where the group is visible from A but B isn't, 3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// passes visibility even though the group's deps get expanded into A. 3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, VisibilityGroup) { 3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestWithScope setup; 3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Err err; 3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IdentifierNode origin; // Dummy origin. 3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // B has private visibility. This lets the group see it since the group is in 3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the same directory. 3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target b(setup.settings(), Label(SourceDir("//private/"), "b")); 3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.set_output_type(Target::STATIC_LIBRARY); 3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.SetToolchain(setup.toolchain()); 3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b.visibility().SetPrivate(b.label().dir()); 3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(b.OnResolved(&err)); 3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The group has public visibility and depends on b. 3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target g(setup.settings(), Label(SourceDir("//private/"), "g")); 3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci g.set_output_type(Target::GROUP); 3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci g.SetToolchain(setup.toolchain()); 3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci g.private_deps().push_back(LabelTargetPair(&b)); 3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci g.private_deps()[0].origin = &origin; 3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci g.visibility().SetPublic(); 3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(b.OnResolved(&err)); 3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Make a target depending on "g". This should succeed. 3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target a(setup.settings(), Label(SourceDir("//app/"), "a")); 3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.set_output_type(Target::EXECUTABLE); 3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.private_deps().push_back(LabelTargetPair(&g)); 3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.private_deps()[0].origin = &origin; 3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a.SetToolchain(setup.toolchain()); 3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(a.OnResolved(&err)); 3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Verifies that only testonly targets can depend on other testonly targets. 3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Many of the above dependency checking cases covered the non-testonly 3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// case. 4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, Testonly) { 4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestWithScope setup; 4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Err err; 4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // "testlib" is a test-only library. 4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target testlib(setup.settings(), Label(SourceDir("//test/"), "testlib")); 4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci testlib.set_testonly(true); 4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci testlib.set_output_type(Target::STATIC_LIBRARY); 4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci testlib.visibility().SetPublic(); 4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci testlib.SetToolchain(setup.toolchain()); 4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(testlib.OnResolved(&err)); 4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // "test" is a test-only executable depending on testlib, this is OK. 4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target test(setup.settings(), Label(SourceDir("//test/"), "test")); 4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test.set_testonly(true); 4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test.set_output_type(Target::EXECUTABLE); 4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test.private_deps().push_back(LabelTargetPair(&testlib)); 4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test.SetToolchain(setup.toolchain()); 4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(test.OnResolved(&err)); 4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // "product" is a non-test depending on testlib. This should fail. 4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target product(setup.settings(), Label(SourceDir("//app/"), "product")); 4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci product.set_testonly(false); 4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci product.set_output_type(Target::EXECUTABLE); 4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci product.private_deps().push_back(LabelTargetPair(&testlib)); 4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci product.SetToolchain(setup.toolchain()); 4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_FALSE(product.OnResolved(&err)); 4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, PublicConfigs) { 4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestWithScope setup; 4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Err err; 4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Label pub_config_label(SourceDir("//a/"), "pubconfig"); 4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Config pub_config(setup.settings(), pub_config_label); 4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This is the destination target that has a public config. 4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target dest(setup.settings(), Label(SourceDir("//a/"), "a")); 4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dest.set_output_type(Target::SOURCE_SET); 4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dest.visibility().SetPublic(); 4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dest.SetToolchain(setup.toolchain()); 4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dest.public_configs().push_back(LabelConfigPair(&pub_config)); 4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(dest.OnResolved(&err)); 4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This target has a public dependency on dest. 4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target pub(setup.settings(), Label(SourceDir("//a/"), "pub")); 4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pub.set_output_type(Target::SOURCE_SET); 4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pub.visibility().SetPublic(); 4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pub.SetToolchain(setup.toolchain()); 4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pub.public_deps().push_back(LabelTargetPair(&dest)); 4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(pub.OnResolved(&err)); 4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Depending on the target with the public dependency should forward dest's 4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // to the current target. 4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target dep_on_pub(setup.settings(), Label(SourceDir("//a/"), "dop")); 4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dep_on_pub.set_output_type(Target::SOURCE_SET); 4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dep_on_pub.visibility().SetPublic(); 4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dep_on_pub.SetToolchain(setup.toolchain()); 4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dep_on_pub.private_deps().push_back(LabelTargetPair(&pub)); 4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(dep_on_pub.OnResolved(&err)); 4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(1u, dep_on_pub.configs().size()); 4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(&pub_config, dep_on_pub.configs()[0].ptr); 4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This target has a private dependency on dest for forwards configs. 4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target forward(setup.settings(), Label(SourceDir("//a/"), "f")); 4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci forward.set_output_type(Target::SOURCE_SET); 4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci forward.visibility().SetPublic(); 4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci forward.SetToolchain(setup.toolchain()); 4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci forward.private_deps().push_back(LabelTargetPair(&dest)); 4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci forward.forward_dependent_configs().push_back(LabelTargetPair(&dest)); 4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(forward.OnResolved(&err)); 4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Depending on the forward target should apply the config. 4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target dep_on_forward(setup.settings(), Label(SourceDir("//a/"), "dof")); 4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dep_on_forward.set_output_type(Target::SOURCE_SET); 4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dep_on_forward.visibility().SetPublic(); 4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dep_on_forward.SetToolchain(setup.toolchain()); 4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dep_on_forward.private_deps().push_back(LabelTargetPair(&forward)); 4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(dep_on_forward.OnResolved(&err)); 4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(1u, dep_on_forward.configs().size()); 4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(&pub_config, dep_on_forward.configs()[0].ptr); 4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that different link/depend outputs work for solink tools. 4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, LinkAndDepOutputs) { 4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestWithScope setup; 4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Err err; 4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Toolchain toolchain(setup.settings(), Label(SourceDir("//tc/"), "tc")); 4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<Tool> solink_tool(new Tool()); 4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci solink_tool->set_output_prefix("lib"); 4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci solink_tool->set_default_output_extension(".so"); 4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char kLinkPattern[] = 4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "{{root_out_dir}}/{{target_output_name}}{{output_extension}}"; 4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SubstitutionPattern link_output = SubstitutionPattern::MakeForTest( 4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kLinkPattern); 4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci solink_tool->set_link_output(link_output); 4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char kDependPattern[] = 5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "{{root_out_dir}}/{{target_output_name}}{{output_extension}}.TOC"; 5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SubstitutionPattern depend_output = SubstitutionPattern::MakeForTest( 5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kDependPattern); 5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci solink_tool->set_depend_output(depend_output); 5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci solink_tool->set_outputs(SubstitutionList::MakeForTest( 5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kLinkPattern, kDependPattern)); 5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci toolchain.SetTool(Toolchain::TYPE_SOLINK, solink_tool.Pass()); 5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Target target(setup.settings(), Label(SourceDir("//a/"), "a")); 5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci target.set_output_type(Target::SHARED_LIBRARY); 5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci target.SetToolchain(&toolchain); 5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(target.OnResolved(&err)); 5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("./liba.so", target.link_output_file().value()); 5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("./liba.so.TOC", target.dependency_output_file().value()); 5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 519