diff options
author | 2016-08-22 08:48:37 +0000 | |
---|---|---|
committer | 2016-08-22 14:48:38 +0000 | |
commit | 4e844f0d0dfe00f36568b890808585139a7005ff (patch) | |
tree | 027e644ab10ff010cb184baac66489cf24c0850e /src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java | |
parent | 981cca2b08d40961dfcc5c934c56ab533b107661 (diff) |
Instead of filtering for dynamic libraries when creating solib symlinks, assert that solib symlinks always point to dynamic libraries.
Note that this makes it possible to crash Bazel with a malicious CROSSTOOL file, but since we are migrating to cc_toolchain_suite which raises a user-friendly error earlier, this is okay.
--
MOS_MIGRATED_REVID=130915262
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java | 55 |
1 files changed, 14 insertions, 41 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java index b09ff13cc4..ee2b08d68a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java @@ -20,7 +20,6 @@ import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.ActionOwner; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.MiddlemanFactory; -import com.google.devtools.build.lib.analysis.AnalysisEnvironment; import com.google.devtools.build.lib.analysis.AnalysisUtils; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; @@ -460,73 +459,47 @@ public class CppHelper { static List<Artifact> getAggregatingMiddlemanForCppRuntimes(RuleContext ruleContext, String purpose, TransitiveInfoCollection dep, String solibDirOverride, BuildConfiguration configuration) { - return getMiddlemanInternal( - ruleContext.getAnalysisEnvironment(), ruleContext, ruleContext.getActionOwner(), purpose, + return getMiddlemanInternal(ruleContext, ruleContext.getActionOwner(), purpose, dep, true, true, solibDirOverride, configuration); } @VisibleForTesting - public static List<Artifact> getAggregatingMiddlemanForTesting(AnalysisEnvironment env, + public static List<Artifact> getAggregatingMiddlemanForTesting( RuleContext ruleContext, ActionOwner owner, String purpose, TransitiveInfoCollection dep, boolean useSolibSymlinks, BuildConfiguration configuration) { return getMiddlemanInternal( - env, ruleContext, owner, purpose, dep, useSolibSymlinks, false, null, configuration); + ruleContext, owner, purpose, dep, useSolibSymlinks, false, null, configuration); } /** * Internal implementation for getAggregatingMiddlemanForCppRuntimes. */ - private static List<Artifact> getMiddlemanInternal(AnalysisEnvironment env, + private static List<Artifact> getMiddlemanInternal( RuleContext ruleContext, ActionOwner actionOwner, String purpose, TransitiveInfoCollection dep, boolean useSolibSymlinks, boolean isCppRuntime, String solibDirOverride, BuildConfiguration configuration) { if (dep == null) { return ImmutableList.of(); } - MiddlemanFactory factory = env.getMiddlemanFactory(); + MiddlemanFactory factory = ruleContext.getAnalysisEnvironment().getMiddlemanFactory(); Iterable<Artifact> artifacts = dep.getProvider(FileProvider.class).getFilesToBuild(); if (useSolibSymlinks) { List<Artifact> symlinkedArtifacts = new ArrayList<>(); for (Artifact artifact : artifacts) { - symlinkedArtifacts.add(solibArtifactMaybe( - ruleContext, artifact, isCppRuntime, solibDirOverride, configuration)); + Preconditions.checkState(Link.SHARED_LIBRARY_FILETYPES.matches(artifact.getFilename())); + symlinkedArtifacts.add(isCppRuntime + ? SolibSymlinkAction.getCppRuntimeSymlink( + ruleContext, artifact, solibDirOverride, configuration) + : SolibSymlinkAction.getDynamicLibrarySymlink( + ruleContext, artifact, false, true, configuration)); } artifacts = symlinkedArtifacts; purpose += "_with_solib"; } return ImmutableList.of( - factory.createMiddlemanAllowMultiple(env, actionOwner, ruleContext.getPackageDirectory(), - purpose, artifacts, configuration.getMiddlemanDirectory( - ruleContext.getRule().getRepository()))); - } - - /** - * If the artifact is a shared library, returns the solib symlink artifact associated with it. - * - * @param ruleContext the context of the rule that creates the symlink - * @param artifact the library the solib symlink should point to - * @param isCppRuntime whether the library is a C++ runtime - * @param solibDirOverride if not null, forces the solib symlink to be in this directory - */ - private static Artifact solibArtifactMaybe(RuleContext ruleContext, Artifact artifact, - boolean isCppRuntime, String solibDirOverride, BuildConfiguration configuration) { - if (SHARED_LIBRARY_FILETYPES.matches(artifact.getFilename())) { - return isCppRuntime - ? SolibSymlinkAction.getCppRuntimeSymlink( - ruleContext, artifact, solibDirOverride, configuration) - : SolibSymlinkAction.getDynamicLibrarySymlink( - ruleContext, artifact, false, true, configuration); - } else { - return artifact; - } - } - - /** - * Returns the type of archives being used. - */ - public static Link.ArchiveType archiveType(BuildConfiguration config) { - CppConfiguration cppConfig = config.getFragment(CppConfiguration.class); - return cppConfig.archiveType(); + factory.createMiddlemanAllowMultiple(ruleContext.getAnalysisEnvironment(), actionOwner, + ruleContext.getPackageDirectory(), purpose, artifacts, + configuration.getMiddlemanDirectory(ruleContext.getRule().getRepository()))); } /** |