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

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

Issue 1083663007: Propagate GN public shared libraries through shared libraries (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: more docs Created 5 years, 8 months 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
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 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 119
120 // Copy our own libs and lib_dirs to the final set. This will be from our 120 // Copy our own libs and lib_dirs to the final set. This will be from our
121 // target and all of our configs. We do this specially since these must be 121 // target and all of our configs. We do this specially since these must be
122 // inherited through the dependency tree (other flags don't work this way). 122 // inherited through the dependency tree (other flags don't work this way).
123 for (ConfigValuesIterator iter(this); !iter.done(); iter.Next()) { 123 for (ConfigValuesIterator iter(this); !iter.done(); iter.Next()) {
124 const ConfigValues& cur = iter.cur(); 124 const ConfigValues& cur = iter.cur();
125 all_lib_dirs_.append(cur.lib_dirs().begin(), cur.lib_dirs().end()); 125 all_lib_dirs_.append(cur.lib_dirs().begin(), cur.lib_dirs().end());
126 all_libs_.append(cur.libs().begin(), cur.libs().end()); 126 all_libs_.append(cur.libs().begin(), cur.libs().end());
127 } 127 }
128 128
129 PullDependentTargetInfo(); 129 PullDependentTargets();
130 PullForwardedDependentConfigs(); 130 PullForwardedDependentConfigs();
131 PullRecursiveHardDeps(); 131 PullRecursiveHardDeps();
132 132
133 FillOutputFiles(); 133 FillOutputFiles();
134 134
135 if (!CheckVisibility(err)) 135 if (!CheckVisibility(err))
136 return false; 136 return false;
137 if (!CheckTestonly(err)) 137 if (!CheckTestonly(err))
138 return false; 138 return false;
139 if (!CheckNoNestedStaticLibs(err)) 139 if (!CheckNoNestedStaticLibs(err))
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 "Alas, I can not continue.", 201 "Alas, I can not continue.",
202 label().GetUserVisibleName(false).c_str(), 202 label().GetUserVisibleName(false).c_str(),
203 GetStringForOutputType(output_type_), 203 GetStringForOutputType(output_type_),
204 label().GetToolchainLabel().GetUserVisibleName(false).c_str(), 204 label().GetToolchainLabel().GetUserVisibleName(false).c_str(),
205 Toolchain::ToolTypeToName( 205 Toolchain::ToolTypeToName(
206 toolchain->GetToolTypeForTargetFinalOutput(this)).c_str())); 206 toolchain->GetToolTypeForTargetFinalOutput(this)).c_str()));
207 } 207 }
208 return false; 208 return false;
209 } 209 }
210 210
211 void Target::PullDependentTargetInfo() { 211 void Target::PullDependentTarget(const Target* dep, bool is_public) {
212 // Gather info from our dependents we need. 212 MergeAllDependentConfigsFrom(dep, &configs_, &all_dependent_configs_);
213 for (const auto& pair : GetDeps(DEPS_LINKED)) { 213 MergePublicConfigsFrom(dep, &configs_);
214 const Target* dep = pair.ptr;
215 MergeAllDependentConfigsFrom(dep, &configs_, &all_dependent_configs_);
216 MergePublicConfigsFrom(dep, &configs_);
217 214
218 // Direct dependent libraries. 215 // Direct dependent libraries.
219 if (dep->output_type() == STATIC_LIBRARY || 216 if (dep->output_type() == STATIC_LIBRARY ||
220 dep->output_type() == SHARED_LIBRARY || 217 dep->output_type() == SHARED_LIBRARY ||
221 dep->output_type() == SOURCE_SET) 218 dep->output_type() == SOURCE_SET)
222 inherited_libraries_.push_back(dep); 219 inherited_libraries_.Append(dep, is_public);
223 220
224 // Inherited libraries and flags are inherited across static library 221 if (dep->output_type() == SHARED_LIBRARY) {
225 // boundaries. 222 // Shared library dependendencies are inherited across public shared
226 if (!dep->IsFinal()) { 223 // library boundaries.
227 inherited_libraries_.Append(dep->inherited_libraries().begin(), 224 //
228 dep->inherited_libraries().end()); 225 // In this case:
226 // EXE -> INTERMEDIATE_SHLIB --[public]--> FINAL_SHLIB
227 // The EXE will also link to to FINAL_SHLIB. The public dependeny means
228 // that the EXE can use the headers in FINAL_SHLIB so the FINAL_SHLIB
229 // will need to appear on EXE's link line.
230 //
231 // However, if the dependency is private:
232 // EXE -> INTERMEDIATE_SHLIB --[private]--> FINAL_SHLIB
233 // the dependency will not be propogated because INTERMEDIATE_SHLIB is
234 // not granting permission to call functiosn from FINAL_SHLIB. If EXE
235 // wants to use functions (and link to) FINAL_SHLIB, it will need to do
236 // so explicitly.
237 //
238 // Static libraries and source sets aren't inherited across shared
239 // library boundaries because they will be linked into the shared
240 // library.
241 inherited_libraries_.AppendPublicSharedLibraries(
242 dep->inherited_libraries(), is_public);
243 } else if (!dep->IsFinal()) {
244 // The current target isn't linked, so propogate linked deps and
245 // libraries up the dependency tree.
246 inherited_libraries_.AppendInherited(dep->inherited_libraries(), is_public);
229 247
230 // Inherited library settings. 248 // Inherited library settings.
231 all_lib_dirs_.append(dep->all_lib_dirs()); 249 all_lib_dirs_.append(dep->all_lib_dirs());
232 all_libs_.append(dep->all_libs()); 250 all_libs_.append(dep->all_libs());
233 }
234 } 251 }
235 } 252 }
236 253
254 void Target::PullDependentTargets() {
255 for (const auto& dep : public_deps_)
256 PullDependentTarget(dep.ptr, true);
257 for (const auto& dep : private_deps_)
258 PullDependentTarget(dep.ptr, false);
259 }
260
237 void Target::PullForwardedDependentConfigs() { 261 void Target::PullForwardedDependentConfigs() {
238 // Pull public configs from each of our dependency's public deps. 262 // Pull public configs from each of our dependency's public deps.
239 for (const auto& dep : public_deps_) 263 for (const auto& dep : public_deps_)
240 PullForwardedDependentConfigsFrom(dep.ptr); 264 PullForwardedDependentConfigsFrom(dep.ptr);
241 265
242 // Forward public configs if explicitly requested. 266 // Forward public configs if explicitly requested.
243 for (const auto& dep : forward_dependent_configs_) { 267 for (const auto& dep : forward_dependent_configs_) {
244 const Target* from_target = dep.ptr; 268 const Target* from_target = dep.ptr;
245 269
246 // The forward_dependent_configs_ must be in the deps (public or private) 270 // The forward_dependent_configs_ must be in the deps (public or private)
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 394
371 // Verify no deps are static libraries. 395 // Verify no deps are static libraries.
372 for (const auto& pair : GetDeps(DEPS_ALL)) { 396 for (const auto& pair : GetDeps(DEPS_ALL)) {
373 if (pair.ptr->output_type() == Target::STATIC_LIBRARY) { 397 if (pair.ptr->output_type() == Target::STATIC_LIBRARY) {
374 *err = MakeStaticLibDepsError(this, pair.ptr); 398 *err = MakeStaticLibDepsError(this, pair.ptr);
375 return false; 399 return false;
376 } 400 }
377 } 401 }
378 402
379 // Verify no inherited libraries are static libraries. 403 // Verify no inherited libraries are static libraries.
380 for (const auto& lib : inherited_libraries()) { 404 for (const auto& lib : inherited_libraries().GetOrdered()) {
381 if (lib->output_type() == Target::STATIC_LIBRARY) { 405 if (lib->output_type() == Target::STATIC_LIBRARY) {
382 *err = MakeStaticLibDepsError(this, lib); 406 *err = MakeStaticLibDepsError(this, lib);
383 return false; 407 return false;
384 } 408 }
385 } 409 }
386 return true; 410 return true;
387 } 411 }
OLDNEW
« tools/gn/target.h ('K') | « 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