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