| Index: tools/gn/target.cc
|
| diff --git a/tools/gn/target.cc b/tools/gn/target.cc
|
| index 4a93abc240cd36655d24a9ec8e0a9d52749e8543..16a0ba4eb8ff65ba6fa328b9df61a22546a74321 100644
|
| --- a/tools/gn/target.cc
|
| +++ b/tools/gn/target.cc
|
| @@ -160,21 +160,40 @@ bool Target::OnResolved(Err* err) {
|
| ScopedTrace trace(TraceItem::TRACE_ON_RESOLVED, label());
|
| trace.SetToolchain(settings()->toolchain_label());
|
|
|
| - // Copy our own dependent configs to the list of configs applying to us.
|
| + // Copy this target's own dependent and public configs to the list of configs
|
| + // applying to it.
|
| configs_.Append(all_dependent_configs_.begin(), all_dependent_configs_.end());
|
| MergePublicConfigsFrom(this, &configs_);
|
|
|
| + // Copy public configs from all dependencies into the list of configs
|
| + // applying to this target (configs_).
|
| + PullDependentTargetConfigs();
|
| +
|
| + // Copies public dependencies' public configs to this target's public
|
| + // configs. These configs have already been applied to this target by
|
| + // PullDependentTargetConfigs above, along with the public configs from
|
| + // private deps. This step re-exports them as public configs for targets that
|
| + // depend on this one.
|
| + for (const auto& dep : public_deps_) {
|
| + public_configs_.Append(dep.ptr->public_configs().begin(),
|
| + dep.ptr->public_configs().end());
|
| + }
|
| +
|
| // Copy our own libs and lib_dirs to the final set. This will be from our
|
| // target and all of our configs. We do this specially since these must be
|
| // inherited through the dependency tree (other flags don't work this way).
|
| + //
|
| + // This needs to happen after we pull dependent target configs for the
|
| + // public config's libs to be included here. And it needs to happen
|
| + // before pulling the dependent target libs so the libs are in the correct
|
| + // order (local ones first, then the dependency's).
|
| for (ConfigValuesIterator iter(this); !iter.done(); iter.Next()) {
|
| const ConfigValues& cur = iter.cur();
|
| all_lib_dirs_.append(cur.lib_dirs().begin(), cur.lib_dirs().end());
|
| all_libs_.append(cur.libs().begin(), cur.libs().end());
|
| }
|
|
|
| - PullDependentTargets();
|
| - PullPublicConfigs();
|
| + PullDependentTargetLibs();
|
| PullRecursiveHardDeps();
|
| if (!ResolvePrecompiledHeaders(err))
|
| return false;
|
| @@ -266,10 +285,17 @@ bool Target::SetToolchain(const Toolchain* toolchain, Err* err) {
|
| return false;
|
| }
|
|
|
| -void Target::PullDependentTarget(const Target* dep, bool is_public) {
|
| +void Target::PullDependentTargetConfigsFrom(const Target* dep) {
|
| MergeAllDependentConfigsFrom(dep, &configs_, &all_dependent_configs_);
|
| MergePublicConfigsFrom(dep, &configs_);
|
| +}
|
| +
|
| +void Target::PullDependentTargetConfigs() {
|
| + for (const auto& pair : GetDeps(DEPS_LINKED))
|
| + PullDependentTargetConfigsFrom(pair.ptr);
|
| +}
|
|
|
| +void Target::PullDependentTargetLibsFrom(const Target* dep, bool is_public) {
|
| // Direct dependent libraries.
|
| if (dep->output_type() == STATIC_LIBRARY ||
|
| dep->output_type() == SHARED_LIBRARY ||
|
| @@ -309,22 +335,11 @@ void Target::PullDependentTarget(const Target* dep, bool is_public) {
|
| }
|
| }
|
|
|
| -void Target::PullDependentTargets() {
|
| +void Target::PullDependentTargetLibs() {
|
| for (const auto& dep : public_deps_)
|
| - PullDependentTarget(dep.ptr, true);
|
| + PullDependentTargetLibsFrom(dep.ptr, true);
|
| for (const auto& dep : private_deps_)
|
| - PullDependentTarget(dep.ptr, false);
|
| -}
|
| -
|
| -void Target::PullPublicConfigs() {
|
| - // Pull public configs from each of our dependency's public deps.
|
| - for (const auto& dep : public_deps_)
|
| - PullPublicConfigsFrom(dep.ptr);
|
| -}
|
| -
|
| -void Target::PullPublicConfigsFrom(const Target* from) {
|
| - public_configs_.Append(from->public_configs().begin(),
|
| - from->public_configs().end());
|
| + PullDependentTargetLibsFrom(dep.ptr, false);
|
| }
|
|
|
| void Target::PullRecursiveHardDeps() {
|
|
|