aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Lukacs Berki <lberki@google.com>2016-07-27 07:40:21 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2016-07-27 11:15:19 +0000
commitddb6a1f2671f3c2c36090a61609054287b7e44ba (patch)
tree2da6bcffa0a1a10bb5201da7a4adf865e6ac1179 /src
parent81dca61ad115d6c776233323e642d628414450f2 (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/StaticallyLinkedMarkerProvider.java35
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java17
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));
+ }
+ }
}