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"
8d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/scheduler.h"
9d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
10d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochnamespace {
11d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
12d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochvoid TargetResolvedThunk(const base::Callback<void(const Target*)>& cb,
13d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                         const Target* t) {
14d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  cb.Run(t);
15d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
16d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}  // namespace
18d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
19d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochTarget::Target(const Settings* settings, const Label& label)
20d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    : Item(label),
21d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      settings_(settings),
22d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      output_type_(NONE),
23d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      generated_(false),
24d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      generator_function_(NULL) {
25d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
26d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
27d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochTarget::~Target() {
28d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
29d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
30d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochTarget* Target::AsTarget() {
31d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return this;
32d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
33d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
34d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochconst Target* Target::AsTarget() const {
35d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return this;
36d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
37d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
38d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochvoid Target::OnResolved() {
39d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // Gather info from our dependents we need.
40d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  for (size_t dep = 0; dep < deps_.size(); dep++) {
41d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    // All dependent configs get pulled to us, and to our dependents.
42d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    const std::vector<const Config*>& all =
43d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        deps_[dep]->all_dependent_configs();
44d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    for (size_t i = 0; i < all.size(); i++) {
45d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      configs_.push_back(all[i]);
46d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      all_dependent_configs_.push_back(all[i]);
47d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
48d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
49d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    // Direct dependent configs get pulled only to us.
50d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    const std::vector<const Config*>& direct =
51d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        deps_[dep]->direct_dependent_configs();
52d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    for (size_t i = 0; i < direct.size(); i++)
53d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      configs_.push_back(direct[i]);
54d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
55d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    // Direct dependent libraries.
56d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (deps_[dep]->output_type() == STATIC_LIBRARY ||
57d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        deps_[dep]->output_type() == SHARED_LIBRARY ||
58d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        deps_[dep]->output_type() == LOADABLE_MODULE)
59d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      inherited_libraries_.insert(deps_[dep]);
60d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
61d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    // Inherited libraries. DOn't pull transitive libraries from shared
62d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    // libraries, since obviously those shouldn't be linked directly into
63d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    // later deps unless explicitly specified.
64d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (deps_[dep]->output_type() != SHARED_LIBRARY &&
65d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        deps_[dep]->output_type() != LOADABLE_MODULE &&
66d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        deps_[dep]->output_type() != EXECUTABLE) {
67d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      const std::set<const Target*> inherited =
68d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          deps_[dep]->inherited_libraries();
69d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      for (std::set<const Target*>::const_iterator i = inherited.begin();
70d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch           i != inherited.end(); ++i)
71d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        inherited_libraries_.insert(*i);
72d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
73d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
74d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
75d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (!settings_->build_settings()->target_resolved_callback().is_null()) {
76d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    g_scheduler->ScheduleWork(base::Bind(&TargetResolvedThunk,
77d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        settings_->build_settings()->target_resolved_callback(),
78d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        this));
79d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
80d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
81d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
82d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochbool Target::HasBeenGenerated() const {
83d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return generated_;
84d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
85d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
86d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochvoid Target::SetGenerated(const Token* token) {
87d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  DCHECK(!generated_);
88d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  generated_ = true;
89d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  generator_function_ = token;
90d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
91d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
92d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochbool Target::IsLinkable() const {
93d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return output_type_ == STATIC_LIBRARY || output_type_ == SHARED_LIBRARY;
94d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
95