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