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