in src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java [1995:2235]
protected Tuple compile(
StarlarkActionFactory starlarkActionFactoryApi,
FeatureConfigurationForStarlark starlarkFeatureConfiguration,
CcToolchainProvider starlarkCcToolchainProvider,
Sequence<?> sourcesUnchecked, // <Artifact> expected
Sequence<?> publicHeadersUnchecked, // <Artifact> expected
Sequence<?> privateHeadersUnchecked, // <Artifact> expected
Object textualHeadersStarlarkObject,
Object additionalExportedHeadersObject,
Sequence<?> includes, // <String> expected
Object starlarkIncludes,
Sequence<?> quoteIncludes, // <String> expected
Sequence<?> systemIncludes, // <String> expected
Sequence<?> frameworkIncludes, // <String> expected
Sequence<?> defines, // <String> expected
Sequence<?> localDefines, // <String> expected
String includePrefix,
String stripIncludePrefix,
Sequence<?> userCompileFlags, // <String> expected
Sequence<?> ccCompilationContexts, // <CcCompilationContext> expected
Object implementationCcCompilationContextsObject,
String name,
boolean disallowPicOutputs,
boolean disallowNopicOutputs,
Artifact grepIncludes,
List<Artifact> headersForClifDoNotUseThisParam,
Sequence<?> additionalInputs,
Object moduleMapNoneable,
Object additionalModuleMapsNoneable,
Object propagateModuleMapToCompileActionObject,
Object doNotGenerateModuleMapObject,
Object codeCoverageEnabledObject,
Object hdrsCheckingModeObject,
Object variablesExtension,
Object languageObject,
Object purposeObject,
Object coptsFilterObject,
StarlarkThread thread)
throws EvalException, InterruptedException {
if (checkObjectsBound(
moduleMapNoneable,
additionalModuleMapsNoneable,
additionalExportedHeadersObject,
propagateModuleMapToCompileActionObject,
doNotGenerateModuleMapObject,
codeCoverageEnabledObject,
purposeObject,
hdrsCheckingModeObject,
implementationCcCompilationContextsObject,
coptsFilterObject,
starlarkIncludes)) {
CcModule.checkPrivateStarlarkificationAllowlist(thread);
}
StarlarkActionFactory actions = starlarkActionFactoryApi;
CcToolchainProvider ccToolchainProvider =
convertFromNoneable(starlarkCcToolchainProvider, null);
ImmutableList<String> looseIncludes = asClassImmutableList(starlarkIncludes);
CppModuleMap moduleMap = convertFromNoneable(moduleMapNoneable, /* defaultValue= */ null);
ImmutableList<CppModuleMap> additionalModuleMaps =
asClassImmutableList(additionalModuleMapsNoneable);
CoptsFilter coptsFilter = convertFromNoneable(coptsFilterObject, /* defaultValue= */ null);
Object textualHeadersObject =
asClassImmutableListOrNestedSet(
textualHeadersStarlarkObject, Artifact.class, "textual_headers");
String languageString = convertFromNoneable(languageObject, Language.CPP.getRepresentation());
Language language = parseLanguage(languageString);
ImmutableList<String> additionalExportedHeaders =
asClassImmutableList(additionalExportedHeadersObject);
boolean propagateModuleMapToCompileAction =
convertFromNoneable(propagateModuleMapToCompileActionObject, /* defaultValue= */ true);
boolean doNotGenerateModuleMap =
convertFromNoneable(doNotGenerateModuleMapObject, /* defaultValue= */ false);
boolean codeCoverageEnabled =
convertFromNoneable(codeCoverageEnabledObject, /* defaultValue= */ false);
String hdrsCheckingMode =
convertFromNoneable(
hdrsCheckingModeObject,
getSemantics(language)
.determineStarlarkHeadersCheckingMode(
actions.getRuleContext(),
actions
.getActionConstructionContext()
.getConfiguration()
.getFragment(CppConfiguration.class),
ccToolchainProvider)
.toString());
String purpose = convertFromNoneable(purposeObject, null);
ImmutableList<CcCompilationContext> implementationContexts =
asClassImmutableList(implementationCcCompilationContextsObject);
boolean tuple =
checkAllSourcesContainTuplesOrNoneOfThem(
ImmutableList.of(sourcesUnchecked, privateHeadersUnchecked, publicHeadersUnchecked));
if (tuple) {
CcModule.checkPrivateStarlarkificationAllowlist(thread);
}
FeatureConfigurationForStarlark featureConfiguration =
convertFromNoneable(starlarkFeatureConfiguration, null);
Label label = getCallerLabel(actions, name);
FdoContext fdoContext = ccToolchainProvider.getFdoContext();
if (disallowNopicOutputs && disallowPicOutputs) {
throw Starlark.errorf("Either PIC or no PIC actions have to be created.");
}
SourceCategory sourceCategory =
(language == Language.CPP) ? SourceCategory.CC : SourceCategory.CC_AND_OBJC;
CcCommon common = new CcCommon(actions.getRuleContext(), ccToolchainProvider);
BuildConfigurationValue configuration =
actions.getActionConstructionContext().getConfiguration();
CcCompilationHelper helper =
new CcCompilationHelper(
actions.asActionRegistry(actions),
actions.getActionConstructionContext(),
label,
grepIncludes,
getSemantics(language),
featureConfiguration.getFeatureConfiguration(),
sourceCategory,
ccToolchainProvider,
fdoContext,
actions.getActionConstructionContext().getConfiguration(),
TargetUtils.getExecutionInfo(
actions.getRuleContext().getRule(),
actions.getRuleContext().isAllowTagsPropagation()),
/* shouldProcessHeaders= */ ccToolchainProvider.shouldProcessHeaders(
featureConfiguration.getFeatureConfiguration(),
configuration.getFragment(CppConfiguration.class)));
if (tuple) {
ImmutableList<Pair<Artifact, Label>> sources = convertSequenceTupleToPair(sourcesUnchecked);
ImmutableList<Pair<Artifact, Label>> publicHeaders =
convertSequenceTupleToPair(publicHeadersUnchecked);
ImmutableList<Pair<Artifact, Label>> privateHeaders =
convertSequenceTupleToPair(privateHeadersUnchecked);
helper.addPublicHeaders(publicHeaders).addPrivateHeaders(privateHeaders).addSources(sources);
} else {
List<Artifact> sources = Sequence.cast(sourcesUnchecked, Artifact.class, "srcs");
List<Artifact> publicHeaders =
Sequence.cast(publicHeadersUnchecked, Artifact.class, "public_hdrs");
List<Artifact> privateHeaders =
Sequence.cast(privateHeadersUnchecked, Artifact.class, "private_hdrs");
helper.addPublicHeaders(publicHeaders).addPrivateHeaders(privateHeaders).addSources(sources);
}
helper
.addCcCompilationContexts(
Sequence.cast(
ccCompilationContexts, CcCompilationContext.class, "compilation_contexts"))
.addImplementationDepsCcCompilationContexts(implementationContexts)
.addIncludeDirs(
Sequence.cast(includes, String.class, "includes").stream()
.map(PathFragment::create)
.collect(ImmutableList.toImmutableList()))
.addQuoteIncludeDirs(
Sequence.cast(quoteIncludes, String.class, "quote_includes").stream()
.map(PathFragment::create)
.collect(ImmutableList.toImmutableList()))
.addSystemIncludeDirs(
Sequence.cast(systemIncludes, String.class, "system_includes").stream()
.map(PathFragment::create)
.collect(ImmutableList.toImmutableList()))
.addFrameworkIncludeDirs(
Sequence.cast(frameworkIncludes, String.class, "framework_includes").stream()
.map(PathFragment::create)
.collect(ImmutableList.toImmutableList()))
.addDefines(Sequence.cast(defines, String.class, "defines"))
.addNonTransitiveDefines(Sequence.cast(localDefines, String.class, "local_defines"))
.setCopts(
ImmutableList.copyOf(
Sequence.cast(userCompileFlags, String.class, "user_compile_flags")))
.addAdditionalCompilationInputs(headersForClifDoNotUseThisParam)
.addAdditionalCompilationInputs(
Sequence.cast(additionalInputs, Artifact.class, "additional_inputs"))
.addAditionalIncludeScanningRoots(headersForClifDoNotUseThisParam)
.setPurpose(common.getPurpose(getSemantics(language)))
.addAdditionalExportedHeaders(
additionalExportedHeaders.stream()
.map(PathFragment::create)
.collect(ImmutableList.toImmutableList()))
.setPropagateModuleMapToCompileAction(propagateModuleMapToCompileAction)
.setCodeCoverageEnabled(codeCoverageEnabled)
.setHeadersCheckingMode(HeadersCheckingMode.getValue(hdrsCheckingMode));
ImmutableList<PathFragment> looseIncludeDirs =
looseIncludes.stream().map(PathFragment::create).collect(ImmutableList.toImmutableList());
if (!looseIncludeDirs.isEmpty()) {
helper.setLooseIncludeDirs(ImmutableSet.copyOf(looseIncludeDirs));
}
if (textualHeadersObject instanceof NestedSet) {
helper.addPublicTextualHeaders((NestedSet<Artifact>) textualHeadersObject);
} else {
helper.addPublicTextualHeaders((List<Artifact>) textualHeadersObject);
}
if (doNotGenerateModuleMap) {
helper.doNotGenerateModuleMap();
}
if (moduleMap != null) {
helper.setCppModuleMap(moduleMap);
}
if (coptsFilter != null) {
helper.setCoptsFilter(coptsFilter);
}
for (CppModuleMap additionalModuleMap : additionalModuleMaps) {
helper.registerAdditionalModuleMap(additionalModuleMap);
}
if (disallowNopicOutputs) {
helper.setGenerateNoPicAction(false);
}
if (disallowPicOutputs) {
helper.setGeneratePicAction(false);
helper.setGenerateNoPicAction(true);
}
if (!Strings.isNullOrEmpty(includePrefix)) {
helper.setIncludePrefix(includePrefix);
}
if (!Strings.isNullOrEmpty(stripIncludePrefix)) {
helper.setStripIncludePrefix(stripIncludePrefix);
}
if (!asDict(variablesExtension).isEmpty()) {
helper.addVariableExtension(new UserVariablesExtension(asDict(variablesExtension)));
}
if (purpose != null) {
helper.setPurpose(purpose);
}
try {
RuleContext ruleContext = actions.getRuleContext();
CompilationInfo compilationInfo = helper.compile(ruleContext);
return Tuple.of(
compilationInfo.getCcCompilationContext(), compilationInfo.getCcCompilationOutputs());
} catch (RuleErrorException e) {
throw Starlark.errorf("%s", e.getMessage());
}
}