Skip to content

Commit e22ef9f

Browse files
hlopkocopybara-github
authored andcommitted
Do not use CppConfiguration from CcToolchainProvider for --force_pic
In order to implement this correctly (without changing the existing API) we need to thread CppConfiguration passed in cc_common.configure_feature along with FeatureConfiguration to cc_toolchain.use_pic_for_binaries. Hence FeatureConfigurationForStarlark wrapper class. This workaround will be removed once #7260 is flipped. Progress towards #6516. RELNOTES: None. PiperOrigin-RevId: 240177498
1 parent acaca5a commit e22ef9f

16 files changed

+164
-71
lines changed

src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
2323
import com.google.devtools.build.lib.rules.cpp.CcLinkingHelper.LinkingInfo;
2424
import com.google.devtools.build.lib.rules.cpp.CcModule;
2525
import com.google.devtools.build.lib.rules.cpp.CcToolchainConfigInfo;
26-
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
2726
import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
2827
import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables;
28+
import com.google.devtools.build.lib.rules.cpp.FeatureConfigurationForStarlark;
2929
import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
3030
import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
3131
import com.google.devtools.build.lib.skylarkbuildapi.cpp.BazelCcModuleApi;
@@ -44,7 +44,7 @@ public class BazelCcModule extends CcModule
4444
Artifact,
4545
SkylarkRuleContext,
4646
CcToolchainProvider,
47-
FeatureConfiguration,
47+
FeatureConfigurationForStarlark,
4848
CompilationInfo,
4949
CcCompilationContext,
5050
CcCompilationOutputs,
@@ -57,7 +57,7 @@ public class BazelCcModule extends CcModule
5757
@Override
5858
public CompilationInfo compile(
5959
SkylarkRuleContext skylarkRuleContext,
60-
FeatureConfiguration skylarkFeatureConfiguration,
60+
FeatureConfigurationForStarlark skylarkFeatureConfiguration,
6161
CcToolchainProvider skylarkCcToolchainProvider,
6262
SkylarkList<Artifact> sources,
6363
SkylarkList<Artifact> headers,
@@ -87,7 +87,7 @@ public CompilationInfo compile(
8787
@Override
8888
public LinkingInfo link(
8989
SkylarkRuleContext skylarkRuleContext,
90-
FeatureConfiguration skylarkFeatureConfiguration,
90+
FeatureConfigurationForStarlark skylarkFeatureConfiguration,
9191
CcToolchainProvider skylarkCcToolchainProvider,
9292
CcCompilationOutputs ccCompilationOutputs,
9393
Object skylarkLinkopts,

src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ private static Runfiles collectRunfiles(
154154
RuleContext ruleContext,
155155
FeatureConfiguration featureConfiguration,
156156
CcToolchainProvider toolchain,
157+
CppConfiguration cppConfiguration,
157158
List<LibraryToLink> libraries,
158159
CcLinkingOutputs ccLibraryLinkingOutputs,
159160
CcCompilationContext ccCompilationContext,
@@ -233,7 +234,7 @@ private static Runfiles collectRunfiles(
233234
builder.addSymlinksToArtifacts(ccCompilationContext.getAdditionalInputs());
234235
builder.addSymlinksToArtifacts(
235236
ccCompilationContext.getTransitiveModules(
236-
usePic(ruleContext, toolchain, featureConfiguration)));
237+
usePic(ruleContext, toolchain, cppConfiguration, featureConfiguration)));
237238
}
238239
return builder.build();
239240
}
@@ -431,7 +432,7 @@ public static ConfiguredTarget init(CppSemantics semantics, RuleContext ruleCont
431432
}
432433
}
433434

434-
boolean usePic = usePic(ruleContext, ccToolchain, featureConfiguration);
435+
boolean usePic = usePic(ruleContext, ccToolchain, cppConfiguration, featureConfiguration);
435436

436437
// On Windows, if GENERATE_PDB_FILE feature is enabled
437438
// then a pdb file will be built along with the executable.
@@ -523,7 +524,7 @@ public static ConfiguredTarget init(CppSemantics semantics, RuleContext ruleCont
523524
Artifact dwpFile =
524525
ruleContext.getImplicitOutputArtifact(CppRuleClasses.CC_BINARY_DEBUG_PACKAGE);
525526
createDebugPackagerActions(
526-
ruleContext, ccToolchain, featureConfiguration, dwpFile, dwoArtifacts);
527+
ruleContext, ccToolchain, cppConfiguration, featureConfiguration, dwpFile, dwoArtifacts);
527528

528529
// The debug package should include the dwp file only if it was explicitly requested.
529530
Artifact explicitDwpFile = dwpFile;
@@ -571,6 +572,7 @@ public static ConfiguredTarget init(CppSemantics semantics, RuleContext ruleCont
571572
ruleContext,
572573
featureConfiguration,
573574
ccToolchain,
575+
cppConfiguration,
574576
libraries,
575577
ccLinkingOutputs,
576578
ccCompilationContext,
@@ -843,10 +845,13 @@ private static DwoArtifactsCollector collectTransitiveDwoArtifacts(
843845
public static Iterable<Artifact> getDwpInputs(
844846
RuleContext context,
845847
CcToolchainProvider toolchain,
848+
CppConfiguration cppConfiguration,
846849
FeatureConfiguration featureConfiguration,
847850
NestedSet<Artifact> picDwoArtifacts,
848851
NestedSet<Artifact> dwoArtifacts) {
849-
return usePic(context, toolchain, featureConfiguration) ? picDwoArtifacts : dwoArtifacts;
852+
return usePic(context, toolchain, cppConfiguration, featureConfiguration)
853+
? picDwoArtifacts
854+
: dwoArtifacts;
850855
}
851856

852857
/**
@@ -855,13 +860,15 @@ public static Iterable<Artifact> getDwpInputs(
855860
private static void createDebugPackagerActions(
856861
RuleContext context,
857862
CcToolchainProvider toolchain,
863+
CppConfiguration cppConfiguration,
858864
FeatureConfiguration featureConfiguration,
859865
Artifact dwpOutput,
860866
DwoArtifactsCollector dwoArtifactsCollector) {
861867
Iterable<Artifact> allInputs =
862868
getDwpInputs(
863869
context,
864870
toolchain,
871+
cppConfiguration,
865872
featureConfiguration,
866873
dwoArtifactsCollector.getPicDwoArtifacts(),
867874
dwoArtifactsCollector.getDwoArtifacts());
@@ -1053,7 +1060,7 @@ private static void addTransitiveInfoProviders(
10531060
NestedSet<Artifact> filesToCompile =
10541061
ccCompilationOutputs.getFilesToCompile(
10551062
cppConfiguration.processHeadersInDependencies(),
1056-
toolchain.usePicForDynamicLibraries(featureConfiguration));
1063+
toolchain.usePicForDynamicLibraries(cppConfiguration, featureConfiguration));
10571064

10581065
builder
10591066
.setFilesToBuild(filesToBuild)
@@ -1094,11 +1101,13 @@ private static NestedSet<LibraryToLink> collectTransitiveCcNativeLibraries(
10941101
private static boolean usePic(
10951102
RuleContext ruleContext,
10961103
CcToolchainProvider ccToolchainProvider,
1104+
CppConfiguration cppConfiguration,
10971105
FeatureConfiguration featureConfiguration) {
10981106
if (isLinkShared(ruleContext)) {
1099-
return ccToolchainProvider.usePicForDynamicLibraries(featureConfiguration);
1107+
return ccToolchainProvider.usePicForDynamicLibraries(cppConfiguration, featureConfiguration);
11001108
} else {
1101-
return CppHelper.usePicForBinaries(ccToolchainProvider, featureConfiguration);
1109+
return CppHelper.usePicForBinaries(
1110+
ccToolchainProvider, cppConfiguration, featureConfiguration);
11021111
}
11031112
}
11041113
}

src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -292,11 +292,11 @@ public CcCompilationHelper(
292292
this.configuration = buildConfiguration;
293293
this.cppConfiguration = configuration.getFragment(CppConfiguration.class);
294294
setGenerateNoPicAction(
295-
!ccToolchain.usePicForDynamicLibraries(featureConfiguration)
296-
|| !CppHelper.usePicForBinaries(ccToolchain, featureConfiguration));
295+
!ccToolchain.usePicForDynamicLibraries(cppConfiguration, featureConfiguration)
296+
|| !CppHelper.usePicForBinaries(ccToolchain, cppConfiguration, featureConfiguration));
297297
setGeneratePicAction(
298-
ccToolchain.usePicForDynamicLibraries(featureConfiguration)
299-
|| CppHelper.usePicForBinaries(ccToolchain, featureConfiguration));
298+
ccToolchain.usePicForDynamicLibraries(cppConfiguration, featureConfiguration)
299+
|| CppHelper.usePicForBinaries(ccToolchain, cppConfiguration, featureConfiguration));
300300
this.ruleErrorConsumer = actionConstructionContext.getRuleErrorConsumer();
301301
this.actionRegistry = Preconditions.checkNotNull(actionRegistry);
302302
this.label = Preconditions.checkNotNull(label);
@@ -715,7 +715,7 @@ public static Map<String, NestedSet<Artifact>> buildOutputGroupsForEmittingCompi
715715
Map<String, NestedSet<Artifact>> outputGroups = new TreeMap<>();
716716
outputGroups.put(OutputGroupInfo.TEMP_FILES, ccCompilationOutputs.getTemps());
717717
boolean processHeadersInDependencies = cppConfiguration.processHeadersInDependencies();
718-
boolean usePic = ccToolchain.usePicForDynamicLibraries(featureConfiguration);
718+
boolean usePic = ccToolchain.usePicForDynamicLibraries(cppConfiguration, featureConfiguration);
719719
outputGroups.put(
720720
OutputGroupInfo.FILES_TO_COMPILE,
721721
ccCompilationOutputs.getFilesToCompile(processHeadersInDependencies, usePic));

src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ private static NestedSet<Artifact> collectHiddenTopLevelArtifacts(
481481
NestedSetBuilder<Artifact> artifactsToForceBuilder = NestedSetBuilder.stableOrder();
482482
CppConfiguration cppConfiguration = ruleContext.getFragment(CppConfiguration.class);
483483
boolean processHeadersInDependencies = cppConfiguration.processHeadersInDependencies();
484-
boolean usePic = toolchain.usePicForDynamicLibraries(featureConfiguration);
484+
boolean usePic = toolchain.usePicForDynamicLibraries(cppConfiguration, featureConfiguration);
485485
artifactsToForceBuilder.addTransitive(
486486
ccCompilationOutputs.getFilesToCompile(processHeadersInDependencies, usePic));
487487
for (OutputGroupInfo dep :

src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,8 +404,10 @@ private CcLinkingOutputs createCcLinkActions(CcCompilationOutputs ccOutputs)
404404
"can only handle static links");
405405

406406
LibraryToLink.Builder libraryToLinkBuilder = LibraryToLink.builder();
407-
boolean usePicForBinaries = CppHelper.usePicForBinaries(ccToolchain, featureConfiguration);
408-
boolean usePicForDynamicLibs = ccToolchain.usePicForDynamicLibraries(featureConfiguration);
407+
boolean usePicForBinaries =
408+
CppHelper.usePicForBinaries(ccToolchain, cppConfiguration, featureConfiguration);
409+
boolean usePicForDynamicLibs =
410+
ccToolchain.usePicForDynamicLibraries(cppConfiguration, featureConfiguration);
409411

410412
PathFragment labelName = PathFragment.create(label.getName());
411413
String libraryIdentifier =

src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.EnvEntry;
4444
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.EnvSet;
4545
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Feature;
46-
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
4746
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Flag;
4847
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FlagGroup;
4948
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FlagSet;
@@ -83,7 +82,7 @@
8382
public class CcModule
8483
implements CcModuleApi<
8584
CcToolchainProvider,
86-
FeatureConfiguration,
85+
FeatureConfigurationForStarlark,
8786
CcCompilationContext,
8887
CcLinkingContext,
8988
LibraryToLink,
@@ -132,7 +131,7 @@ public Provider getCcToolchainProvider() {
132131
}
133132

134133
@Override
135-
public FeatureConfiguration configureFeatures(
134+
public FeatureConfigurationForStarlark configureFeatures(
136135
Object ruleContextOrNone,
137136
CcToolchainProvider toolchain,
138137
SkylarkList<String> requestedFeatures,
@@ -150,51 +149,62 @@ public FeatureConfiguration configureFeatures(
150149
+ "Please add 'ctx' as a named parameter. See "
151150
+ "https://github.com/bazelbuild/bazel/issues/7793 for details.");
152151
}
153-
return CcCommon.configureFeaturesOrThrowEvalException(
154-
ImmutableSet.copyOf(requestedFeatures),
155-
ImmutableSet.copyOf(unsupportedFeatures),
156-
toolchain,
152+
CppConfiguration cppConfiguration =
157153
ruleContext == null
158154
? toolchain.getCppConfigurationEvenThoughItCanBeDifferentThatWhatTargetHas()
159-
: ruleContext.getRuleContext().getFragment(CppConfiguration.class));
155+
: ruleContext.getRuleContext().getFragment(CppConfiguration.class);
156+
return FeatureConfigurationForStarlark.from(
157+
CcCommon.configureFeaturesOrThrowEvalException(
158+
ImmutableSet.copyOf(requestedFeatures),
159+
ImmutableSet.copyOf(unsupportedFeatures),
160+
toolchain,
161+
cppConfiguration),
162+
cppConfiguration);
160163
}
161164

162165
@Override
163-
public String getToolForAction(FeatureConfiguration featureConfiguration, String actionName) {
164-
return featureConfiguration.getToolPathForAction(actionName);
166+
public String getToolForAction(
167+
FeatureConfigurationForStarlark featureConfiguration, String actionName) {
168+
return featureConfiguration.getFeatureConfiguration().getToolPathForAction(actionName);
165169
}
166170

167171
@Override
168-
public boolean isEnabled(FeatureConfiguration featureConfiguration, String featureName) {
169-
return featureConfiguration.isEnabled(featureName);
172+
public boolean isEnabled(
173+
FeatureConfigurationForStarlark featureConfiguration, String featureName) {
174+
return featureConfiguration.getFeatureConfiguration().isEnabled(featureName);
170175
}
171176

172177
@Override
173-
public boolean actionIsEnabled(FeatureConfiguration featureConfiguration, String actionName) {
174-
return featureConfiguration.actionIsConfigured(actionName);
178+
public boolean actionIsEnabled(
179+
FeatureConfigurationForStarlark featureConfiguration, String actionName) {
180+
return featureConfiguration.getFeatureConfiguration().actionIsConfigured(actionName);
175181
}
176182

177183
@Override
178184
public SkylarkList<String> getCommandLine(
179-
FeatureConfiguration featureConfiguration,
185+
FeatureConfigurationForStarlark featureConfiguration,
180186
String actionName,
181187
CcToolchainVariables variables) {
182-
return SkylarkList.createImmutable(featureConfiguration.getCommandLine(actionName, variables));
188+
return SkylarkList.createImmutable(
189+
featureConfiguration.getFeatureConfiguration().getCommandLine(actionName, variables));
183190
}
184191

185192
@Override
186193
public SkylarkDict<String, String> getEnvironmentVariable(
187-
FeatureConfiguration featureConfiguration,
194+
FeatureConfigurationForStarlark featureConfiguration,
188195
String actionName,
189196
CcToolchainVariables variables) {
190197
return SkylarkDict.copyOf(
191-
null, featureConfiguration.getEnvironmentVariables(actionName, variables));
198+
null,
199+
featureConfiguration
200+
.getFeatureConfiguration()
201+
.getEnvironmentVariables(actionName, variables));
192202
}
193203

194204
@Override
195205
public CcToolchainVariables getCompileBuildVariables(
196206
CcToolchainProvider ccToolchainProvider,
197-
FeatureConfiguration featureConfiguration,
207+
FeatureConfigurationForStarlark featureConfiguration,
198208
Object sourceFile,
199209
Object outputFile,
200210
Object userCompileFlags,
@@ -206,7 +216,7 @@ public CcToolchainVariables getCompileBuildVariables(
206216
boolean addLegacyCxxOptions)
207217
throws EvalException {
208218
return CompileBuildVariables.setupVariablesOrThrowEvalException(
209-
featureConfiguration,
219+
featureConfiguration.getFeatureConfiguration(),
210220
ccToolchainProvider,
211221
convertFromNoneable(sourceFile, /* defaultValue= */ null),
212222
convertFromNoneable(outputFile, /* defaultValue= */ null),
@@ -234,7 +244,7 @@ public CcToolchainVariables getCompileBuildVariables(
234244
@Override
235245
public CcToolchainVariables getLinkBuildVariables(
236246
CcToolchainProvider ccToolchainProvider,
237-
FeatureConfiguration featureConfiguration,
247+
FeatureConfigurationForStarlark featureConfiguration,
238248
Object librarySearchDirectories,
239249
Object runtimeLibrarySearchDirectories,
240250
Object userLinkFlags,
@@ -257,9 +267,9 @@ public CcToolchainVariables getLinkBuildVariables(
257267
/* thinltoMergedObjectFile= */ null,
258268
mustKeepDebug,
259269
ccToolchainProvider,
260-
// TODO(b/117917928): We cannot use cpp configuration from cc toolchain. Fix.
261-
ccToolchainProvider.getCppConfiguration(),
262-
featureConfiguration,
270+
featureConfiguration
271+
.getCppConfigurationFromFeatureConfigurationCreatedForStarlark_andIKnowWhatImDoing(),
272+
featureConfiguration.getFeatureConfiguration(),
263273
useTestOnlyFlags,
264274
/* isLtoIndexing= */ false,
265275
userFlagsToIterable(userLinkFlags),
@@ -354,8 +364,8 @@ public LibraryToLink createLibraryLinkerInput(
354364
throws EvalException, InterruptedException {
355365
SkylarkActionFactory skylarkActionFactory =
356366
nullIfNone(actionsObject, SkylarkActionFactory.class);
357-
FeatureConfiguration featureConfiguration =
358-
nullIfNone(featureConfigurationObject, FeatureConfiguration.class);
367+
FeatureConfigurationForStarlark featureConfiguration =
368+
nullIfNone(featureConfigurationObject, FeatureConfigurationForStarlark.class);
359369
CcToolchainProvider ccToolchainProvider =
360370
nullIfNone(ccToolchainProviderObject, CcToolchainProvider.class);
361371
Artifact staticLibrary = nullIfNone(staticLibraryObject, Artifact.class);
@@ -425,7 +435,7 @@ public LibraryToLink createLibraryLinkerInput(
425435

426436
Artifact resolvedSymlinkDynamicLibrary = null;
427437
Artifact resolvedSymlinkInterfaceLibrary = null;
428-
if (!featureConfiguration.isEnabled(CppRuleClasses.TARGETS_WINDOWS)) {
438+
if (!featureConfiguration.getFeatureConfiguration().isEnabled(CppRuleClasses.TARGETS_WINDOWS)) {
429439
if (dynamicLibrary != null) {
430440
resolvedSymlinkDynamicLibrary = dynamicLibrary;
431441
dynamicLibrary =
@@ -598,7 +608,7 @@ protected static CompilationInfo compile(
598608
RuleContext ruleContext = skylarkRuleContext.getRuleContext();
599609
SkylarkActionFactory actions = skylarkRuleContext.actions();
600610
CcToolchainProvider ccToolchainProvider = convertFromNoneable(skylarkCcToolchainProvider, null);
601-
FeatureConfiguration featureConfiguration =
611+
FeatureConfigurationForStarlark featureConfiguration =
602612
convertFromNoneable(skylarkFeatureConfiguration, null);
603613
Pair<List<Artifact>, List<Artifact>> separatedHeadersAndSources =
604614
separateSourcesFromHeaders(sources);
@@ -616,7 +626,7 @@ protected static CompilationInfo compile(
616626
? ruleContext.getPrerequisiteArtifact("$grep_includes", Mode.HOST)
617627
: null,
618628
cppSemantics,
619-
featureConfiguration,
629+
featureConfiguration.getFeatureConfiguration(),
620630
ccToolchainProvider,
621631
fdoContext)
622632
.addPublicHeaders(headers)
@@ -685,7 +695,7 @@ protected static LinkingInfo link(
685695
CcCommon.checkRuleWhitelisted(skylarkRuleContext);
686696
RuleContext ruleContext = skylarkRuleContext.getRuleContext();
687697
CcToolchainProvider ccToolchainProvider = convertFromNoneable(skylarkCcToolchainProvider, null);
688-
FeatureConfiguration featureConfiguration =
698+
FeatureConfigurationForStarlark featureConfiguration =
689699
convertFromNoneable(skylarkFeatureConfiguration, null);
690700
FdoContext fdoContext = ccToolchainProvider.getFdoContext();
691701
NestedSet<String> linkopts =
@@ -694,7 +704,7 @@ protected static LinkingInfo link(
694704
new CcLinkingHelper(
695705
ruleContext,
696706
cppSemantics,
697-
featureConfiguration,
707+
featureConfiguration.getFeatureConfiguration(),
698708
ccToolchainProvider,
699709
fdoContext,
700710
ruleContext.getConfiguration())

src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables.StringValueParser;
3939
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
4040
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
41-
import com.google.devtools.build.lib.skylarkbuildapi.cpp.FeatureConfigurationApi;
4241
import com.google.devtools.build.lib.syntax.EvalException;
4342
import com.google.devtools.build.lib.util.Pair;
4443
import com.google.devtools.build.lib.util.StringUtil;
@@ -1208,7 +1207,7 @@ public String getArtifactName(String baseName) {
12081207
/** Captures the set of enabled features and action configs for a rule. */
12091208
@Immutable
12101209
@AutoCodec
1211-
public static class FeatureConfiguration implements FeatureConfigurationApi {
1210+
public static class FeatureConfiguration {
12121211
private static final Interner<FeatureConfiguration> FEATURE_CONFIGURATION_INTERNER =
12131212
BlazeInterners.newWeakInterner();
12141213

0 commit comments

Comments
 (0)