C++: Refactor WrapCcHelper.
Makes it non-instantiable so that it's easier to migrate SWIG rules to Skylark.
RELNOTES:none
PiperOrigin-RevId: 202136054
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 f38d0fb..47bc2b0 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
@@ -880,8 +880,7 @@
CcCompilationHelper.collectHeaderTokens(ruleContext, ccCompilationOutputs);
NestedSet<Artifact> filesToCompile =
ccCompilationOutputs.getFilesToCompile(
- cppConfiguration.processHeadersInDependencies(),
- CppHelper.usePicForDynamicLibraries(ruleContext, toolchain));
+ cppConfiguration.processHeadersInDependencies(), toolchain.usePicForDynamicLibraries());
CcCompilationInfo.Builder ccCompilationInfoBuilder = CcCompilationInfo.Builder.create();
ccCompilationInfoBuilder.setCcCompilationContext(ccCompilationContext);
@@ -954,7 +953,7 @@
private static boolean usePic(RuleContext ruleContext, CcToolchainProvider ccToolchainProvider) {
if (isLinkShared(ruleContext)) {
- return CppHelper.usePicForDynamicLibraries(ruleContext, ccToolchainProvider);
+ return ccToolchainProvider.usePicForDynamicLibraries();
} else {
return CppHelper.usePicForBinaries(ruleContext, ccToolchainProvider);
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
index d4ad88a..7528d3c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
@@ -292,10 +292,10 @@
this.cppConfiguration =
Preconditions.checkNotNull(ruleContext.getFragment(CppConfiguration.class));
setGenerateNoPicAction(
- !CppHelper.usePicForDynamicLibraries(ruleContext, ccToolchain)
+ !ccToolchain.usePicForDynamicLibraries()
|| !CppHelper.usePicForBinaries(ruleContext, ccToolchain));
setGeneratePicAction(
- CppHelper.usePicForDynamicLibraries(ruleContext, ccToolchain)
+ ccToolchain.usePicForDynamicLibraries()
|| CppHelper.usePicForBinaries(ruleContext, ccToolchain));
}
@@ -767,7 +767,7 @@
outputGroups.put(OutputGroupInfo.TEMP_FILES, ccOutputs.getTemps());
if (emitCompileProviders) {
boolean processHeadersInDependencies = cppConfiguration.processHeadersInDependencies();
- boolean usePic = CppHelper.usePicForDynamicLibraries(ruleContext, ccToolchain);
+ boolean usePic = ccToolchain.usePicForDynamicLibraries();
outputGroups.put(
OutputGroupInfo.FILES_TO_COMPILE,
ccOutputs.getFilesToCompile(processHeadersInDependencies, usePic));
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 7025f3c..e1719827 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
@@ -362,7 +362,7 @@
NestedSetBuilder<Artifact> artifactsToForceBuilder = NestedSetBuilder.stableOrder();
CppConfiguration cppConfiguration = ruleContext.getFragment(CppConfiguration.class);
boolean processHeadersInDependencies = cppConfiguration.processHeadersInDependencies();
- boolean usePic = CppHelper.usePicForDynamicLibraries(ruleContext, toolchain);
+ boolean usePic = toolchain.usePicForDynamicLibraries();
artifactsToForceBuilder.addTransitive(
ccCompilationOutputs.getFilesToCompile(processHeadersInDependencies, usePic));
for (OutputGroupInfo dep :
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
index 855c9cb..36b41fd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
@@ -693,7 +693,7 @@
CcLinkingOutputs.Builder result = new CcLinkingOutputs.Builder();
AnalysisEnvironment env = ruleContext.getAnalysisEnvironment();
boolean usePicForBinaries = CppHelper.usePicForBinaries(ruleContext, ccToolchain);
- boolean usePicForDynamicLibs = CppHelper.usePicForDynamicLibraries(ruleContext, ccToolchain);
+ boolean usePicForDynamicLibs = ccToolchain.usePicForDynamicLibraries();
PathFragment labelName = PathFragment.create(ruleContext.getLabel().getName());
String libraryIdentifier =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
index 307cb100..f8cd4d6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
@@ -256,6 +256,19 @@
}
/**
+ * Determines if we should apply -fPIC for this rule's C++ compilations. This determination is
+ * generally made by the global C++ configuration settings "needsPic" and "usePicForBinaries".
+ * However, an individual rule may override these settings by applying -fPIC" to its "nocopts"
+ * attribute. This allows incompatible rules to "opt out" of global PIC settings (see bug:
+ * "Provide a way to turn off -fPIC for targets that can't be built that way").
+ *
+ * @return true if this rule's compilations should apply -fPIC, false otherwise
+ */
+ public boolean usePicForDynamicLibraries() {
+ return getCppConfiguration().forcePic() || toolchainNeedsPic();
+ }
+
+ /**
* Returns true if Fission is specified and supported by the CROSSTOOL for the build implied by
* the given configuration and toolchain.
*/
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 e94f303..8574da0 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
@@ -684,21 +684,6 @@
// TODO(bazel-team): figure out a way to merge these 2 methods. See the Todo in
// CcCommonConfiguredTarget.noCoptsMatches().
- /**
- * Determines if we should apply -fPIC for this rule's C++ compilations. This determination is
- * generally made by the global C++ configuration settings "needsPic" and "usePicForBinaries".
- * However, an individual rule may override these settings by applying -fPIC" to its "nocopts"
- * attribute. This allows incompatible rules to "opt out" of global PIC settings (see bug:
- * "Provide a way to turn off -fPIC for targets that can't be built that way").
- *
- * @param ruleContext the context of the rule to check
- * @return true if this rule's compilations should apply -fPIC, false otherwise
- */
- public static boolean usePicForDynamicLibraries(
- RuleContext ruleContext, CcToolchainProvider toolchain) {
- return ruleContext.getFragment(CppConfiguration.class).forcePic()
- || toolchain.toolchainNeedsPic();
- }
/** Returns whether binaries must be compiled with position independent code. */
public static boolean usePicForBinaries(RuleContext ruleContext, CcToolchainProvider toolchain) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
index 4a05540..8d0425e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
@@ -274,8 +274,7 @@
if (builder.hasLtoBitcodeInputs() && featureConfiguration.isEnabled(CppRuleClasses.THIN_LTO)) {
builder.setLtoIndexing(true);
- builder.setUsePicForLtoBackendActions(
- CppHelper.usePicForDynamicLibraries(ruleContext, toolchain));
+ builder.setUsePicForLtoBackendActions(toolchain.usePicForDynamicLibraries());
CppLinkAction indexAction = builder.build();
if (indexAction != null) {
ruleContext.registerAction(indexAction);