diff options
author | 2016-07-27 07:40:21 +0000 | |
---|---|---|
committer | 2016-07-27 11:15:19 +0000 | |
commit | ddb6a1f2671f3c2c36090a61609054287b7e44ba (patch) | |
tree | 2da6bcffa0a1a10bb5201da7a4adf865e6ac1179 /src | |
parent | 81dca61ad115d6c776233323e642d628414450f2 (diff) |
Use a marker provider to determine of a rule is linked statically for the purposes of license checking instead of having a bespoke method in BuildConfiguration.Fragment and encoding knowledge about static linking in buildtool/ .
--
MOS_MIGRATED_REVID=128557444
Diffstat (limited to 'src')
7 files changed, 59 insertions, 36 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/StaticallyLinkedMarkerProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/StaticallyLinkedMarkerProvider.java new file mode 100644 index 0000000000..e27c0b5003 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/analysis/StaticallyLinkedMarkerProvider.java @@ -0,0 +1,35 @@ +// Copyright 2016 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.analysis; + +import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; + +/** + * A marker provider for rules that are to be linked statically. + * + * Used in license checking. + */ +@Immutable +public class StaticallyLinkedMarkerProvider implements TransitiveInfoProvider { + private final boolean isLinkedStatically; + + public StaticallyLinkedMarkerProvider(boolean isLinkedStatically) { + this.isLinkedStatically = isLinkedStatically; + } + + public boolean isLinkedStatically() { + return isLinkedStatically; + } +} diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java index aa7ee956ec..01d09fc12d 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java @@ -196,14 +196,6 @@ public final class BuildConfiguration { } /** - * Return true if the fragment performs static linking. This information is needed for - * lincence checking. - */ - public boolean performsStaticLink() { - return false; - } - - /** * Add items to the shell environment. */ @SuppressWarnings("unused") @@ -2341,18 +2333,6 @@ public final class BuildConfiguration { } /** - * Returns true if the configuration performs static linking. - */ - public boolean performsStaticLink() { - for (Fragment fragment : fragments.values()) { - if (fragment.performsStaticLink()) { - return true; - } - } - return false; - } - - /** * Collects executables defined by fragments. */ private ImmutableMap<String, PathFragment> collectExecutables() { diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java index 8272143f9f..ae5314433d 100644 --- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java +++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java @@ -24,12 +24,11 @@ import com.google.devtools.build.lib.analysis.AnalysisPhaseCompleteEvent; import com.google.devtools.build.lib.analysis.BuildInfoEvent; import com.google.devtools.build.lib.analysis.BuildView; import com.google.devtools.build.lib.analysis.BuildView.AnalysisResult; -import com.google.devtools.build.lib.analysis.ConfiguredAttributeMapper; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.LicensesProvider; import com.google.devtools.build.lib.analysis.LicensesProvider.TargetLicense; import com.google.devtools.build.lib.analysis.MakeEnvironmentEvent; -import com.google.devtools.build.lib.analysis.RuleConfiguredTarget; +import com.google.devtools.build.lib.analysis.StaticallyLinkedMarkerProvider; import com.google.devtools.build.lib.analysis.ViewCreationFailedException; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection; @@ -56,7 +55,6 @@ import com.google.devtools.build.lib.packages.License; import com.google.devtools.build.lib.packages.License.DistributionType; import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.NoSuchTargetException; -import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.pkgcache.LoadedPackageProvider; @@ -68,7 +66,6 @@ import com.google.devtools.build.lib.profiler.ProfilePhase; import com.google.devtools.build.lib.profiler.Profiler; import com.google.devtools.build.lib.runtime.BlazeRuntime; import com.google.devtools.build.lib.runtime.CommandEnvironment; -import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.AbruptExitException; import com.google.devtools.build.lib.util.ExitCode; import com.google.devtools.build.lib.util.Preconditions; @@ -563,12 +560,9 @@ public final class BuildTool { } final Set<DistributionType> distribs = target.getDistributions(); - BuildConfiguration config = configuredTarget.getConfiguration(); - boolean staticallyLinked = (config != null) && config.performsStaticLink(); - staticallyLinked |= (config != null) && (target instanceof Rule) - && ((Rule) target).getRuleClassObject().hasAttr("linkopts", Type.STRING_LIST) - && ConfiguredAttributeMapper.of((RuleConfiguredTarget) configuredTarget) - .get("linkopts", Type.STRING_LIST).contains("-static"); + StaticallyLinkedMarkerProvider markerProvider = + configuredTarget.getProvider(StaticallyLinkedMarkerProvider.class); + boolean staticallyLinked = markerProvider != null && markerProvider.isLinkedStatically(); LicensesProvider provider = configuredTarget.getProvider(LicensesProvider.class); if (provider != null) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java index eef2b319de..f25fc94e79 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java @@ -671,6 +671,8 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory { .addOutputGroup( OutputGroupProvider.COMPILATION_PREREQUISITES, CcCommon.collectCompilationPrerequisites(ruleContext, cppCompilationContext)); + + CppHelper.maybeAddStaticLinkMarkerProvider(builder, ruleContext); } private static NestedSet<Artifact> collectHiddenTopLevelArtifacts(RuleContext ruleContext) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java index 896ead8c13..82918e3889 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java @@ -34,7 +34,6 @@ import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction; import com.google.devtools.build.lib.packages.RawAttributeMapper; -import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration; import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType; @@ -271,6 +270,7 @@ public abstract class CcLibrary implements RuleConfiguredTargetFactory { instrumentedObjectFiles.addAll(info.getCcCompilationOutputs().getObjectFiles(true)); InstrumentedFilesProvider instrumentedFilesProvider = common.getInstrumentedFilesProvider(instrumentedObjectFiles, /*withBaselineCoverage=*/true); + CppHelper.maybeAddStaticLinkMarkerProvider(targetBuilder, ruleContext); targetBuilder .setFilesToBuild(filesToBuild) .addProviders(info.getProviders()) diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java index 477d4bb831..5924885fea 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java @@ -2019,11 +2019,6 @@ public class CppConfiguration extends BuildConfiguration.Fragment { return getToolchainIdentifier(); } - @Override - public boolean performsStaticLink() { - return getLinkOptions().contains("-static"); - } - public boolean alwaysAttachExtraActions() { return true; } 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 b3367f4048..4c18120f97 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 @@ -24,7 +24,9 @@ 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; +import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.analysis.StaticallyLinkedMarkerProvider; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; @@ -578,4 +580,19 @@ public class CppHelper { .setMnemonic("CcStrip") .build(context)); } + + public static void maybeAddStaticLinkMarkerProvider(RuleConfiguredTargetBuilder builder, + RuleContext ruleContext) { + boolean staticallyLinked = false; + if (ruleContext.getFragment(CppConfiguration.class).getLinkOptions().contains("-static")) { + staticallyLinked = true; + } else if (ruleContext.attributes().has("linkopts", Type.STRING_LIST) + && ruleContext.attributes().get("linkopts", Type.STRING_LIST).contains("-static")) { + staticallyLinked = true; + } + + if (staticallyLinked) { + builder.add(StaticallyLinkedMarkerProvider.class, new StaticallyLinkedMarkerProvider(true)); + } + } } |