Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(139)

Side by Side Diff: tools/gn/target.cc

Issue 1518663003: Make GN public configs apply libs to targets. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tools/gn/target.h ('k') | tools/gn/target_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "tools/gn/target.h" 5 #include "tools/gn/target.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/strings/string_util.h" 8 #include "base/strings/string_util.h"
9 #include "base/strings/stringprintf.h" 9 #include "base/strings/stringprintf.h"
10 #include "tools/gn/config_values_extractors.h" 10 #include "tools/gn/config_values_extractors.h"
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 return this; 153 return this;
154 } 154 }
155 155
156 bool Target::OnResolved(Err* err) { 156 bool Target::OnResolved(Err* err) {
157 DCHECK(output_type_ != UNKNOWN); 157 DCHECK(output_type_ != UNKNOWN);
158 DCHECK(toolchain_) << "Toolchain should have been set before resolving."; 158 DCHECK(toolchain_) << "Toolchain should have been set before resolving.";
159 159
160 ScopedTrace trace(TraceItem::TRACE_ON_RESOLVED, label()); 160 ScopedTrace trace(TraceItem::TRACE_ON_RESOLVED, label());
161 trace.SetToolchain(settings()->toolchain_label()); 161 trace.SetToolchain(settings()->toolchain_label());
162 162
163 // Copy our own dependent configs to the list of configs applying to us. 163 // Copy this target's own dependent and public configs to the list of configs
164 // applying to it.
164 configs_.Append(all_dependent_configs_.begin(), all_dependent_configs_.end()); 165 configs_.Append(all_dependent_configs_.begin(), all_dependent_configs_.end());
165 MergePublicConfigsFrom(this, &configs_); 166 MergePublicConfigsFrom(this, &configs_);
166 167
168 // Copy public configs from all dependencies into the list of configs
169 // applying to this target (configs_).
170 PullDependentTargetConfigs();
171
172 // Copies public dependencies' public configs to this target's public
173 // configs. These configs have already been applied to this target by
174 // PullDependentTargetConfigs above, along with the public configs from
175 // private deps. This step re-exports them as public configs for targets that
176 // depend on this one.
177 for (const auto& dep : public_deps_) {
178 public_configs_.Append(dep.ptr->public_configs().begin(),
179 dep.ptr->public_configs().end());
180 }
181
167 // Copy our own libs and lib_dirs to the final set. This will be from our 182 // Copy our own libs and lib_dirs to the final set. This will be from our
168 // target and all of our configs. We do this specially since these must be 183 // target and all of our configs. We do this specially since these must be
169 // inherited through the dependency tree (other flags don't work this way). 184 // inherited through the dependency tree (other flags don't work this way).
185 //
186 // This needs to happen after we pull dependent target configs for the
187 // public config's libs to be included here. And it needs to happen
188 // before pulling the dependent target libs so the libs are in the correct
189 // order (local ones first, then the dependency's).
170 for (ConfigValuesIterator iter(this); !iter.done(); iter.Next()) { 190 for (ConfigValuesIterator iter(this); !iter.done(); iter.Next()) {
171 const ConfigValues& cur = iter.cur(); 191 const ConfigValues& cur = iter.cur();
172 all_lib_dirs_.append(cur.lib_dirs().begin(), cur.lib_dirs().end()); 192 all_lib_dirs_.append(cur.lib_dirs().begin(), cur.lib_dirs().end());
173 all_libs_.append(cur.libs().begin(), cur.libs().end()); 193 all_libs_.append(cur.libs().begin(), cur.libs().end());
174 } 194 }
175 195
176 PullDependentTargets(); 196 PullDependentTargetLibs();
177 PullPublicConfigs();
178 PullRecursiveHardDeps(); 197 PullRecursiveHardDeps();
179 if (!ResolvePrecompiledHeaders(err)) 198 if (!ResolvePrecompiledHeaders(err))
180 return false; 199 return false;
181 200
182 FillOutputFiles(); 201 FillOutputFiles();
183 202
184 if (settings()->build_settings()->check_for_bad_items()) { 203 if (settings()->build_settings()->check_for_bad_items()) {
185 if (!CheckVisibility(err)) 204 if (!CheckVisibility(err))
186 return false; 205 return false;
187 if (!CheckTestonly(err)) 206 if (!CheckTestonly(err))
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 "Alas, I can not continue.", 278 "Alas, I can not continue.",
260 label().GetUserVisibleName(false).c_str(), 279 label().GetUserVisibleName(false).c_str(),
261 GetStringForOutputType(output_type_), 280 GetStringForOutputType(output_type_),
262 label().GetToolchainLabel().GetUserVisibleName(false).c_str(), 281 label().GetToolchainLabel().GetUserVisibleName(false).c_str(),
263 Toolchain::ToolTypeToName( 282 Toolchain::ToolTypeToName(
264 toolchain->GetToolTypeForTargetFinalOutput(this)).c_str())); 283 toolchain->GetToolTypeForTargetFinalOutput(this)).c_str()));
265 } 284 }
266 return false; 285 return false;
267 } 286 }
268 287
269 void Target::PullDependentTarget(const Target* dep, bool is_public) { 288 void Target::PullDependentTargetConfigsFrom(const Target* dep) {
270 MergeAllDependentConfigsFrom(dep, &configs_, &all_dependent_configs_); 289 MergeAllDependentConfigsFrom(dep, &configs_, &all_dependent_configs_);
271 MergePublicConfigsFrom(dep, &configs_); 290 MergePublicConfigsFrom(dep, &configs_);
291 }
272 292
293 void Target::PullDependentTargetConfigs() {
294 for (const auto& pair : GetDeps(DEPS_LINKED))
295 PullDependentTargetConfigsFrom(pair.ptr);
296 }
297
298 void Target::PullDependentTargetLibsFrom(const Target* dep, bool is_public) {
273 // Direct dependent libraries. 299 // Direct dependent libraries.
274 if (dep->output_type() == STATIC_LIBRARY || 300 if (dep->output_type() == STATIC_LIBRARY ||
275 dep->output_type() == SHARED_LIBRARY || 301 dep->output_type() == SHARED_LIBRARY ||
276 dep->output_type() == SOURCE_SET) 302 dep->output_type() == SOURCE_SET)
277 inherited_libraries_.Append(dep, is_public); 303 inherited_libraries_.Append(dep, is_public);
278 304
279 if (dep->output_type() == SHARED_LIBRARY) { 305 if (dep->output_type() == SHARED_LIBRARY) {
280 // Shared library dependendencies are inherited across public shared 306 // Shared library dependendencies are inherited across public shared
281 // library boundaries. 307 // library boundaries.
282 // 308 //
(...skipping 19 matching lines...) Expand all
302 // The current target isn't linked, so propogate linked deps and 328 // The current target isn't linked, so propogate linked deps and
303 // libraries up the dependency tree. 329 // libraries up the dependency tree.
304 inherited_libraries_.AppendInherited(dep->inherited_libraries(), is_public); 330 inherited_libraries_.AppendInherited(dep->inherited_libraries(), is_public);
305 331
306 // Inherited library settings. 332 // Inherited library settings.
307 all_lib_dirs_.append(dep->all_lib_dirs()); 333 all_lib_dirs_.append(dep->all_lib_dirs());
308 all_libs_.append(dep->all_libs()); 334 all_libs_.append(dep->all_libs());
309 } 335 }
310 } 336 }
311 337
312 void Target::PullDependentTargets() { 338 void Target::PullDependentTargetLibs() {
313 for (const auto& dep : public_deps_) 339 for (const auto& dep : public_deps_)
314 PullDependentTarget(dep.ptr, true); 340 PullDependentTargetLibsFrom(dep.ptr, true);
315 for (const auto& dep : private_deps_) 341 for (const auto& dep : private_deps_)
316 PullDependentTarget(dep.ptr, false); 342 PullDependentTargetLibsFrom(dep.ptr, false);
317 }
318
319 void Target::PullPublicConfigs() {
320 // Pull public configs from each of our dependency's public deps.
321 for (const auto& dep : public_deps_)
322 PullPublicConfigsFrom(dep.ptr);
323 }
324
325 void Target::PullPublicConfigsFrom(const Target* from) {
326 public_configs_.Append(from->public_configs().begin(),
327 from->public_configs().end());
328 } 343 }
329 344
330 void Target::PullRecursiveHardDeps() { 345 void Target::PullRecursiveHardDeps() {
331 for (const auto& pair : GetDeps(DEPS_LINKED)) { 346 for (const auto& pair : GetDeps(DEPS_LINKED)) {
332 // Direct hard dependencies. 347 // Direct hard dependencies.
333 if (pair.ptr->hard_dep()) 348 if (pair.ptr->hard_dep())
334 recursive_hard_deps_.insert(pair.ptr); 349 recursive_hard_deps_.insert(pair.ptr);
335 350
336 // Recursive hard dependencies of all dependencies. 351 // Recursive hard dependencies of all dependencies.
337 recursive_hard_deps_.insert(pair.ptr->recursive_hard_deps().begin(), 352 recursive_hard_deps_.insert(pair.ptr->recursive_hard_deps().begin(),
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 return; // Not in output dir, this is OK. 560 return; // Not in output dir, this is OK.
546 561
547 // Tell the scheduler about unknown files. This will be noted for later so 562 // Tell the scheduler about unknown files. This will be noted for later so
548 // the list of files written by the GN build itself (often response files) 563 // the list of files written by the GN build itself (often response files)
549 // can be filtered out of this list. 564 // can be filtered out of this list.
550 OutputFile out_file(settings()->build_settings(), source); 565 OutputFile out_file(settings()->build_settings(), source);
551 std::set<const Target*> seen_targets; 566 std::set<const Target*> seen_targets;
552 if (!EnsureFileIsGeneratedByDependency(this, out_file, true, &seen_targets)) 567 if (!EnsureFileIsGeneratedByDependency(this, out_file, true, &seen_targets))
553 g_scheduler->AddUnknownGeneratedInput(this, source); 568 g_scheduler->AddUnknownGeneratedInput(this, source);
554 } 569 }
OLDNEW
« no previous file with comments | « tools/gn/target.h ('k') | tools/gn/target_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698