1d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// found in the LICENSE file. 4d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 5d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/target.h" 6d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 7d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "base/bind.h" 803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/strings/string_util.h" 903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/strings/stringprintf.h" 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "tools/gn/config_values_extractors.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "tools/gn/deps_iterator.h" 1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "tools/gn/filesystem_utils.h" 13d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/scheduler.h" 1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "tools/gn/substitution_writer.h" 15d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 16d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochnamespace { 17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)typedef std::set<const Config*> ConfigSet; 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Merges the public configs from the given target to the given config list. 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid MergePublicConfigsFrom(const Target* from_target, 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci UniqueVector<LabelConfigPair>* dest) { 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const UniqueVector<LabelConfigPair>& pub = from_target->public_configs(); 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dest->Append(pub.begin(), pub.end()); 253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Like MergePublicConfigsFrom above except does the "all dependent" ones. This 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// additionally adds all configs to the all_dependent_configs_ of the dest 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// target given in *all_dest. 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void MergeAllDependentConfigsFrom(const Target* from_target, 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UniqueVector<LabelConfigPair>* dest, 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UniqueVector<LabelConfigPair>* all_dest) { 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const UniqueVector<LabelConfigPair>& all = 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) from_target->all_dependent_configs(); 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for (size_t i = 0; i < all.size(); i++) { 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) all_dest->push_back(all[i]); 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) dest->push_back(all[i]); 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciErr MakeTestOnlyError(const Target* from, const Target* to) { 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return Err(from->defined_from(), "Test-only dependency not allowed.", 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci from->label().GetUserVisibleName(false) + "\n" 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "which is NOT marked testonly can't depend on\n" + 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci to->label().GetUserVisibleName(false) + "\n" 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "which is marked testonly. Only targets with \"testonly = true\"\n" 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "can depend on other test-only targets.\n" 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "\n" 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "Either mark it test-only or don't do this dependency."); 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciErr MakeStaticLibDepsError(const Target* from, const Target* to) { 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return Err(from->defined_from(), 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "Complete static libraries can't depend on static libraries.", 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci from->label().GetUserVisibleName(false) + 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "\n" 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "which is a complete static library can't depend on\n" + 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci to->label().GetUserVisibleName(false) + 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "\n" 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "which is a static library.\n" 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "\n" 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "Use source sets for intermediate targets instead."); 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 65d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} // namespace 66d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 67d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochTarget::Target(const Settings* settings, const Label& label) 680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) : Item(settings, label), 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) output_type_(UNKNOWN), 70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch all_headers_public_(true), 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci check_includes_(true), 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci complete_static_lib_(false), 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci testonly_(false), 7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) hard_dep_(false), 7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) toolchain_(NULL) { 76d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 77d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 78d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochTarget::~Target() { 79d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 80d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// static 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char* Target::GetStringForOutputType(OutputType type) { 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) switch (type) { 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case UNKNOWN: 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return "Unknown"; 863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case GROUP: 873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return "Group"; 883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case EXECUTABLE: 893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return "Executable"; 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case SHARED_LIBRARY: 913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return "Shared library"; 923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case STATIC_LIBRARY: 933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return "Static library"; 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case SOURCE_SET: 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "Source set"; 963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case COPY_FILES: 973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return "Copy"; 9823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) case ACTION: 9923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return "Action"; 10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) case ACTION_FOREACH: 10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return "ActionForEach"; 1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) default: 1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return ""; 1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 107d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochTarget* Target::AsTarget() { 108d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return this; 109d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 110d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 111d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochconst Target* Target::AsTarget() const { 112d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return this; 113d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 114d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool Target::OnResolved(Err* err) { 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(output_type_ != UNKNOWN); 11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(toolchain_) << "Toolchain should have been set before resolving."; 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Copy our own dependent configs to the list of configs applying to us. 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) configs_.Append(all_dependent_configs_.begin(), all_dependent_configs_.end()); 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MergePublicConfigsFrom(this, &configs_); 122d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Copy our own libs and lib_dirs to the final set. This will be from our 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // target and all of our configs. We do this specially since these must be 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // inherited through the dependency tree (other flags don't work this way). 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (ConfigValuesIterator iter(this); !iter.done(); iter.Next()) { 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const ConfigValues& cur = iter.cur(); 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) all_lib_dirs_.append(cur.lib_dirs().begin(), cur.lib_dirs().end()); 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) all_libs_.append(cur.libs().begin(), cur.libs().end()); 130d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 131d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PullDependentTargetInfo(); 1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu PullForwardedDependentConfigs(); 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PullRecursiveHardDeps(); 13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) FillOutputFiles(); 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!CheckVisibility(err)) 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!CheckTestonly(err)) 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!CheckNoNestedStaticLibs(err)) 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 146d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 147d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 148d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochbool Target::IsLinkable() const { 149d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return output_type_ == STATIC_LIBRARY || output_type_ == SHARED_LIBRARY; 150d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool Target::IsFinal() const { 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return output_type_ == EXECUTABLE || output_type_ == SHARED_LIBRARY || 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (output_type_ == STATIC_LIBRARY && complete_static_lib_); 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)std::string Target::GetComputedOutputName(bool include_prefix) const { 15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(toolchain_) 15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) << "Toolchain must be specified before getting the computed output name."; 16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string& name = output_name_.empty() ? label().name() 16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : output_name_; 16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::string result; 16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (include_prefix) { 16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const Tool* tool = toolchain_->GetToolForTargetFinalOutput(this); 16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string& prefix = tool->output_prefix(); 16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Only add the prefix if the name doesn't already have it. 16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!StartsWithASCII(name, prefix, true)) 17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) result = prefix; 17103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 17203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) result.append(name); 17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return result; 17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool Target::SetToolchain(const Toolchain* toolchain, Err* err) { 17803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!toolchain_); 17903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK_NE(UNKNOWN, output_type_); 18003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) toolchain_ = toolchain; 18103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const Tool* tool = toolchain->GetToolForTargetFinalOutput(this); 18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (tool) 18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return true; 18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 18603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Tool not specified for this target type. 18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (err) { 18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) *err = Err(defined_from(), "This target uses an undefined tool.", 18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::StringPrintf( 19003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "The target %s\n" 19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "of type \"%s\"\n" 19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "uses toolchain %s\n" 19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "which doesn't have the tool \"%s\" defined.\n\n" 19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "Alas, I can not continue.", 19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) label().GetUserVisibleName(false).c_str(), 19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GetStringForOutputType(output_type_), 19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) label().GetToolchainLabel().GetUserVisibleName(false).c_str(), 19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Toolchain::ToolTypeToName( 19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) toolchain->GetToolTypeForTargetFinalOutput(this)).c_str())); 20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return false; 20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 20303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void Target::PullDependentTargetInfo() { 20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Gather info from our dependents we need. 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (DepsIterator iter(this, DepsIterator::LINKED_ONLY); !iter.done(); 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci iter.Advance()) { 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const Target* dep = iter.target(); 2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MergeAllDependentConfigsFrom(dep, &configs_, &all_dependent_configs_); 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MergePublicConfigsFrom(dep, &configs_); 21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Direct dependent libraries. 21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (dep->output_type() == STATIC_LIBRARY || 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dep->output_type() == SHARED_LIBRARY || 2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dep->output_type() == SOURCE_SET) 2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) inherited_libraries_.push_back(dep); 21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Inherited libraries and flags are inherited across static library 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // boundaries. 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!dep->IsFinal()) { 2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) inherited_libraries_.Append(dep->inherited_libraries().begin(), 2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) dep->inherited_libraries().end()); 22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Inherited library settings. 2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) all_lib_dirs_.append(dep->all_lib_dirs()); 2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) all_libs_.append(dep->all_libs()); 22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 2295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid Target::PullForwardedDependentConfigs() { 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Pull public configs from each of our dependency's public deps. 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t dep = 0; dep < public_deps_.size(); dep++) 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PullForwardedDependentConfigsFrom(public_deps_[dep].ptr); 23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Forward public configs if explicitly requested. 23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t dep = 0; dep < forward_dependent_configs_.size(); dep++) { 2380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const Target* from_target = forward_dependent_configs_[dep].ptr; 23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The forward_dependent_configs_ must be in the deps (public or private) 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // already, so we don't need to bother copying to our configs, only 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // forwarding. 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(std::find_if(private_deps_.begin(), private_deps_.end(), 2440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) LabelPtrPtrEquals<Target>(from_target)) != 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private_deps_.end() || 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::find_if(public_deps_.begin(), public_deps_.end(), 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci LabelPtrPtrEquals<Target>(from_target)) != 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public_deps_.end()); 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PullForwardedDependentConfigsFrom(from_target); 25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid Target::PullForwardedDependentConfigsFrom(const Target* from) { 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public_configs_.Append(from->public_configs().begin(), 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci from->public_configs().end()); 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void Target::PullRecursiveHardDeps() { 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (DepsIterator iter(this, DepsIterator::LINKED_ONLY); !iter.done(); 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci iter.Advance()) { 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (iter.target()->hard_dep()) 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci recursive_hard_deps_.insert(iter.target()); 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Android STL doesn't like insert(begin, end) so do it manually. 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(brettw) this can be changed to 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // insert(iter.target()->begin(), iter.target()->end()) 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // when Android uses a better STL. 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (std::set<const Target*>::const_iterator cur = 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci iter.target()->recursive_hard_deps().begin(); 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cur != iter.target()->recursive_hard_deps().end(); ++cur) 272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) recursive_hard_deps_.insert(*cur); 273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 27503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 27603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void Target::FillOutputFiles() { 27703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const Tool* tool = toolchain_->GetToolForTargetFinalOutput(this); 27803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) switch (output_type_) { 27903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) case GROUP: 28003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) case SOURCE_SET: 28103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) case COPY_FILES: 28203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) case ACTION: 28303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) case ACTION_FOREACH: { 28403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // These don't get linked to and use stamps which should be the first 28503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // entry in the outputs. These stamps are named 28603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // "<target_out_dir>/<targetname>.stamp". 28703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) dependency_output_file_ = GetTargetOutputDirAsOutputFile(this); 28803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) dependency_output_file_.value().append(GetComputedOutputName(true)); 28903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) dependency_output_file_.value().append(".stamp"); 29003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) break; 29103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 29203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) case EXECUTABLE: 29303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Executables don't get linked to, but the first output is used for 29403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // dependency management. 29503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CHECK_GE(tool->outputs().list().size(), 1u); 29603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) dependency_output_file_ = 29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionWriter::ApplyPatternToLinkerAsOutputFile( 29803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) this, tool, tool->outputs().list()[0]); 29903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) break; 30003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) case STATIC_LIBRARY: 30103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Static libraries both have dependencies and linking going off of the 30203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // first output. 30303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CHECK(tool->outputs().list().size() >= 1); 30403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) link_output_file_ = dependency_output_file_ = 30503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionWriter::ApplyPatternToLinkerAsOutputFile( 30603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) this, tool, tool->outputs().list()[0]); 30703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) break; 30803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) case SHARED_LIBRARY: 30903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CHECK(tool->outputs().list().size() >= 1); 31003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (tool->link_output().empty() && tool->depend_output().empty()) { 31103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Default behavior, use the first output file for both. 31203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) link_output_file_ = dependency_output_file_ = 31303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionWriter::ApplyPatternToLinkerAsOutputFile( 31403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) this, tool, tool->outputs().list()[0]); 31503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } else { 31603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Use the tool-specified ones. 31703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!tool->link_output().empty()) { 31803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) link_output_file_ = 31903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionWriter::ApplyPatternToLinkerAsOutputFile( 32003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) this, tool, tool->link_output()); 32103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 32203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!tool->depend_output().empty()) { 32303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) dependency_output_file_ = 32403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionWriter::ApplyPatternToLinkerAsOutputFile( 3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this, tool, tool->depend_output()); 32603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 32703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 32803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) break; 32903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) case UNKNOWN: 33003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) default: 33103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) NOTREACHED(); 33203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 33303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool Target::CheckVisibility(Err* err) const { 3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (DepsIterator iter(this); !iter.done(); iter.Advance()) { 3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!Visibility::CheckItemVisibility(this, iter.target(), err)) 3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool Target::CheckTestonly(Err* err) const { 3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If the current target is marked testonly, it can include both testonly 3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // and non-testonly targets, so there's nothing to check. 3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (testonly()) 3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Verify no deps have "testonly" set. 3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (DepsIterator iter(this); !iter.done(); iter.Advance()) { 3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (iter.target()->testonly()) { 3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *err = MakeTestOnlyError(this, iter.target()); 3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool Target::CheckNoNestedStaticLibs(Err* err) const { 3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If the current target is not a complete static library, it can depend on 3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // static library targets with no problem. 3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!(output_type() == Target::STATIC_LIBRARY && complete_static_lib())) 3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Verify no deps are static libraries. 3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (DepsIterator iter(this); !iter.done(); iter.Advance()) { 3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (iter.target()->output_type() == Target::STATIC_LIBRARY) { 3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *err = MakeStaticLibDepsError(this, iter.target()); 3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Verify no inherited libraries are static libraries. 3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t i = 0; i < inherited_libraries().size(); ++i) { 3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (inherited_libraries()[i]->output_type() == Target::STATIC_LIBRARY) { 3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *err = MakeStaticLibDepsError(this, inherited_libraries()[i]); 3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 383