aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java26
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java74
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java27
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java81
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java7
9 files changed, 175 insertions, 79 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
index 7cc659e1b5..1c7d0d1e99 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
@@ -76,19 +76,19 @@ public final class CcCommon {
}
};
- /**
- * Features we request to enable unless a rule explicitly doesn't support them.
- */
- private static final ImmutableSet<String> DEFAULT_FEATURES = ImmutableSet.of(
- CppRuleClasses.DEPENDENCY_FILE,
- CppRuleClasses.COMPILE_ACTION_FLAGS_IN_FLAG_SET,
- CppRuleClasses.RANDOM_SEED,
- CppRuleClasses.MODULE_MAPS,
- CppRuleClasses.MODULE_MAP_HOME_CWD,
- CppRuleClasses.INCLUDE_PATHS,
- CppRuleClasses.PIC,
- CppRuleClasses.PER_OBJECT_DEBUG_INFO,
- CppRuleClasses.PREPROCESSOR_DEFINES);
+ /** Features we request to enable unless a rule explicitly doesn't support them. */
+ private static final ImmutableSet<String> DEFAULT_FEATURES =
+ ImmutableSet.of(
+ CppRuleClasses.DEPENDENCY_FILE,
+ CppRuleClasses.COMPILE_ACTION_FLAGS_IN_FLAG_SET,
+ CppRuleClasses.RANDOM_SEED,
+ CppRuleClasses.MODULE_MAPS,
+ CppRuleClasses.MODULE_MAP_HOME_CWD,
+ CppRuleClasses.HEADER_MODULE_COMPILE,
+ CppRuleClasses.INCLUDE_PATHS,
+ CppRuleClasses.PIC,
+ CppRuleClasses.PER_OBJECT_DEBUG_INFO,
+ CppRuleClasses.PREPROCESSOR_DEFINES);
/** C++ configuration */
private final CppConfiguration cppConfiguration;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
index c49d82fa0a..6fd34e7157 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
@@ -482,8 +482,12 @@ public final class CcLibraryHelper {
}
private boolean shouldProcessHeaders() {
- return featureConfiguration.isEnabled(CppRuleClasses.PREPROCESS_HEADERS)
- || featureConfiguration.isEnabled(CppRuleClasses.PARSE_HEADERS);
+ CppConfiguration cppConfiguration = ruleContext.getFragment(CppConfiguration.class);
+ // If parse_headers_verifies_modules is switched on, we verify that headers are
+ // self-contained by building the module instead.
+ return !cppConfiguration.getParseHeadersVerifiesModules()
+ && (featureConfiguration.isEnabled(CppRuleClasses.PREPROCESS_HEADERS)
+ || featureConfiguration.isEnabled(CppRuleClasses.PARSE_HEADERS));
}
/**
@@ -1161,8 +1165,6 @@ public final class CcLibraryHelper {
/** Create context for cc compile action from generated inputs. */
private CppCompilationContext initializeCppCompilationContext(CppModel model) {
- PublicHeaders publicHeaders = computePublicHeaders();
-
CppCompilationContext.Builder contextBuilder = new CppCompilationContext.Builder(ruleContext);
// Setup the include path; local include directories come before those inherited from deps or
@@ -1186,6 +1188,7 @@ public final class CcLibraryHelper {
contextBuilder.addIncludeDir(includeDir);
}
+ PublicHeaders publicHeaders = computePublicHeaders();
if (publicHeaders.getVirtualIncludePath() != null) {
contextBuilder.addIncludeDir(publicHeaders.getVirtualIncludePath());
}
@@ -1228,38 +1231,67 @@ public final class CcLibraryHelper {
if (featureConfiguration.isEnabled(CppRuleClasses.MODULE_MAPS)) {
if (cppModuleMap == null) {
- cppModuleMap = CppHelper.createDefaultCppModuleMap(ruleContext);
+ cppModuleMap = CppHelper.createDefaultCppModuleMap(ruleContext, /*suffix=*/ "");
}
contextBuilder.setPropagateCppModuleMapAsActionInput(propagateModuleMapToCompileAction);
contextBuilder.setCppModuleMap(cppModuleMap);
- CppModuleMapAction action =
- new CppModuleMapAction(
- ruleContext.getActionOwner(),
- cppModuleMap,
- featureConfiguration.isEnabled(CppRuleClasses.EXCLUDE_PRIVATE_HEADERS_IN_MODULE_MAPS)
- ? ImmutableList.<Artifact>of()
- : privateHeaders,
- publicHeaders.getHeaders(),
- collectModuleMaps(),
- additionalExportedHeaders,
- featureConfiguration.isEnabled(CppRuleClasses.HEADER_MODULES)
- || featureConfiguration.isEnabled(CppRuleClasses.COMPILE_ALL_MODULES),
- featureConfiguration.isEnabled(CppRuleClasses.MODULE_MAP_HOME_CWD),
- featureConfiguration.isEnabled(CppRuleClasses.GENERATE_SUBMODULES),
- !featureConfiguration.isEnabled(CppRuleClasses.MODULE_MAP_WITHOUT_EXTERN_MODULE));
- ruleContext.registerAction(action);
+ // There are different modes for module compilation:
+ // 1. We create the module map and compile the module so that libraries depending on us can
+ // use the resulting module artifacts in their compilation (compiled is true).
+ // 2. We create the module map so that libraries depending on us will include the headers
+ // textually (compiled is false).
+ boolean compiled =
+ featureConfiguration.isEnabled(CppRuleClasses.HEADER_MODULES)
+ || featureConfiguration.isEnabled(CppRuleClasses.COMPILE_ALL_MODULES);
+ Iterable<CppModuleMap> dependentModuleMaps = collectModuleMaps();
+ ruleContext.registerAction(
+ createModuleMapAction(cppModuleMap, publicHeaders, dependentModuleMaps, compiled));
if (model.getGeneratesPicHeaderModule()) {
contextBuilder.setPicHeaderModule(model.getPicHeaderModule(cppModuleMap.getArtifact()));
}
if (model.getGeneratesNoPicHeaderModule()) {
contextBuilder.setHeaderModule(model.getHeaderModule(cppModuleMap.getArtifact()));
}
+ if (!compiled
+ && featureConfiguration.isEnabled(CppRuleClasses.PARSE_HEADERS)
+ && featureConfiguration.isEnabled(CppRuleClasses.USE_HEADER_MODULES)
+ && ruleContext.getFragment(CppConfiguration.class).getParseHeadersVerifiesModules()) {
+ // Here, we are creating a compiled module to verify that headers are self-contained and
+ // modules ready, but we don't use the corresponding module map or compiled file anywhere
+ // else.
+ CppModuleMap verificationMap =
+ CppHelper.createDefaultCppModuleMap(ruleContext, /*suffix=*/ ".verify");
+ ruleContext.registerAction(
+ createModuleMapAction(
+ verificationMap, publicHeaders, dependentModuleMaps, /*compiledModule=*/ true));
+ contextBuilder.setVerificationModuleMap(verificationMap);
+ }
}
semantics.setupCompilationContext(ruleContext, contextBuilder);
return contextBuilder.build();
}
+
+ private CppModuleMapAction createModuleMapAction(
+ CppModuleMap moduleMap,
+ PublicHeaders publicHeaders,
+ Iterable<CppModuleMap> dependentModuleMaps,
+ boolean compiledModule) {
+ return new CppModuleMapAction(
+ ruleContext.getActionOwner(),
+ moduleMap,
+ featureConfiguration.isEnabled(CppRuleClasses.EXCLUDE_PRIVATE_HEADERS_IN_MODULE_MAPS)
+ ? ImmutableList.<Artifact>of()
+ : privateHeaders,
+ publicHeaders.getHeaders(),
+ dependentModuleMaps,
+ additionalExportedHeaders,
+ compiledModule,
+ featureConfiguration.isEnabled(CppRuleClasses.MODULE_MAP_HOME_CWD),
+ featureConfiguration.isEnabled(CppRuleClasses.GENERATE_SUBMODULES),
+ !featureConfiguration.isEnabled(CppRuleClasses.MODULE_MAP_WITHOUT_EXTERN_MODULE));
+ }
/**
* Creates context for cc compile action from generated inputs.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java
index b9d202d8dc..c72388779b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java
@@ -36,6 +36,7 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import javax.annotation.Nullable;
/**
* Immutable store of information needed for C++ compilation that is aggregated
@@ -63,6 +64,8 @@ public final class CppCompilationContext implements TransitiveInfoProvider {
private final ModuleInfo picModuleInfo;
private final CppModuleMap cppModuleMap;
+ private final CppModuleMap verificationModuleMap;
+
private final boolean propagateModuleMapAsActionInput;
// Derived from depsContexts.
@@ -79,6 +82,7 @@ public final class CppCompilationContext implements TransitiveInfoProvider {
ModuleInfo picModuleInfo,
NestedSet<Artifact> directModuleMaps,
CppModuleMap cppModuleMap,
+ @Nullable CppModuleMap verificationModuleMap,
boolean propagateModuleMapAsActionInput) {
Preconditions.checkNotNull(commandLineContext);
this.commandLineContext = commandLineContext;
@@ -90,6 +94,7 @@ public final class CppCompilationContext implements TransitiveInfoProvider {
this.moduleInfo = moduleInfo;
this.picModuleInfo = picModuleInfo;
this.cppModuleMap = cppModuleMap;
+ this.verificationModuleMap = verificationModuleMap;
this.compilationPrerequisites = compilationPrerequisites;
this.propagateModuleMapAsActionInput = propagateModuleMapAsActionInput;
}
@@ -266,6 +271,7 @@ public final class CppCompilationContext implements TransitiveInfoProvider {
context.picModuleInfo,
context.directModuleMaps,
context.cppModuleMap,
+ context.verificationModuleMap,
context.propagateModuleMapAsActionInput);
}
@@ -316,9 +322,10 @@ public final class CppCompilationContext implements TransitiveInfoProvider {
picModuleInfo.build(),
mergeSets(ownerContext.directModuleMaps, libContext.directModuleMaps),
libContext.cppModuleMap,
+ libContext.verificationModuleMap,
libContext.propagateModuleMapAsActionInput);
}
-
+
/**
* Return a nested set containing all elements from {@code s1} and {@code s2}.
*/
@@ -334,6 +341,11 @@ public final class CppCompilationContext implements TransitiveInfoProvider {
return cppModuleMap;
}
+ /** @return the C++ module map of the owner. */
+ public CppModuleMap getVerificationModuleMap() {
+ return verificationModuleMap;
+ }
+
/**
* The parts of the compilation context that influence the command line of
* compilation actions.
@@ -378,6 +390,7 @@ public final class CppCompilationContext implements TransitiveInfoProvider {
private final NestedSetBuilder<Artifact> directModuleMaps = NestedSetBuilder.stableOrder();
private final Set<String> defines = new LinkedHashSet<>();
private CppModuleMap cppModuleMap;
+ private CppModuleMap verificationModuleMap;
private boolean propagateModuleMapAsActionInput = true;
/** The rule that owns the context */
@@ -591,14 +604,18 @@ public final class CppCompilationContext implements TransitiveInfoProvider {
return this;
}
- /**
- * Sets the C++ module map.
- */
+ /** Sets the C++ module map. */
public Builder setCppModuleMap(CppModuleMap cppModuleMap) {
this.cppModuleMap = cppModuleMap;
return this;
}
+ /** Sets the C++ module map used to verify that headers are modules compatible. */
+ public Builder setVerificationModuleMap(CppModuleMap verificationModuleMap) {
+ this.verificationModuleMap = verificationModuleMap;
+ return this;
+ }
+
/**
* Causes the module map to be passed as an action input to dependant compilations.
*/
@@ -609,6 +626,7 @@ public final class CppCompilationContext implements TransitiveInfoProvider {
/**
* Sets the C++ header module in non-pic mode.
+ *
* @param headerModule The .pcm file generated for this library.
*/
public Builder setHeaderModule(Artifact headerModule) {
@@ -660,6 +678,7 @@ public final class CppCompilationContext implements TransitiveInfoProvider {
picModuleInfo.build(),
directModuleMaps.build(),
cppModuleMap,
+ verificationModuleMap,
propagateModuleMapAsActionInput);
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
index 60ed762d1b..5d513a516d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
@@ -212,9 +212,11 @@ public class CppCompileActionBuilder {
return CppCompileAction.CPP_MODULE_COMPILE;
} else if (CppFileTypes.CPP_HEADER.matches(sourcePath)) {
// TODO(bazel-team): Handle C headers that probably don't work in C++ mode.
- if (featureConfiguration.isEnabled(CppRuleClasses.PARSE_HEADERS)) {
+ if (!cppConfiguration.getParseHeadersVerifiesModules()
+ && featureConfiguration.isEnabled(CppRuleClasses.PARSE_HEADERS)) {
return CppCompileAction.CPP_HEADER_PARSING;
- } else if (featureConfiguration.isEnabled(CppRuleClasses.PREPROCESS_HEADERS)) {
+ } else if (!cppConfiguration.getParseHeadersVerifiesModules()
+ && featureConfiguration.isEnabled(CppRuleClasses.PREPROCESS_HEADERS)) {
return CppCompileAction.CPP_HEADER_PREPROCESSING;
} else {
// CcCommon.collectCAndCppSources() ensures we do not add headers to
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 91f05b5022..c5bf84083a 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
@@ -1781,6 +1781,10 @@ public class CppConfiguration extends BuildConfiguration.Fragment {
return cppOptions.pruneCppModules;
}
+ public boolean getParseHeadersVerifiesModules() {
+ return cppOptions.parseHeadersVerifiesModules;
+ }
+
public LibcTop getLibcTop() {
return cppOptions.libcTop;
}
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 4213adcc5c..ed1dc14219 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
@@ -435,16 +435,19 @@ public class CppHelper {
}
/**
- * Creates a CppModuleMap object for pure c++ builds. The module map artifact becomes a
- * candidate input to a CppCompileAction.
+ * Creates a CppModuleMap object for pure c++ builds. The module map artifact becomes a candidate
+ * input to a CppCompileAction.
*/
- public static CppModuleMap createDefaultCppModuleMap(RuleContext ruleContext) {
+ public static CppModuleMap createDefaultCppModuleMap(RuleContext ruleContext, String suffix) {
// Create the module map artifact as a genfile.
- Artifact mapFile = ruleContext.getPackageRelativeArtifact(
- ruleContext.getLabel().getName()
- + Iterables.getOnlyElement(CppFileTypes.CPP_MODULE_MAP.getExtensions()),
- ruleContext.getConfiguration().getGenfilesDirectory(
- ruleContext.getRule().getRepository()));
+ Artifact mapFile =
+ ruleContext.getPackageRelativeArtifact(
+ ruleContext.getLabel().getName()
+ + suffix
+ + Iterables.getOnlyElement(CppFileTypes.CPP_MODULE_MAP.getExtensions()),
+ ruleContext
+ .getConfiguration()
+ .getGenfilesDirectory(ruleContext.getRule().getRepository()));
return new CppModuleMap(mapFile, ruleContext.getLabel().toString());
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
index 4c134a512d..1a2e4d95b2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
@@ -346,6 +346,7 @@ public final class CppModel {
PathFragment autoFdoImportPath,
Artifact gcnoFile,
Artifact dwoFile,
+ CppModuleMap cppModuleMap,
Map<String, String> sourceSpecificBuildVariables) {
CcToolchainFeatures.Variables.Builder buildVariables =
new CcToolchainFeatures.Variables.Builder();
@@ -353,7 +354,6 @@ public final class CppModel {
// TODO(bazel-team): Pull out string constants for all build variables.
CppCompilationContext builderContext = builder.getContext();
- CppModuleMap cppModuleMap = builderContext.getCppModuleMap();
Artifact sourceFile = builder.getSourceFile();
Artifact outputFile = builder.getOutputFile();
String realOutputFilePath;
@@ -469,28 +469,9 @@ public final class CppModel {
AnalysisEnvironment env = ruleContext.getAnalysisEnvironment();
if (shouldProvideHeaderModules()) {
- Artifact moduleMapArtifact = context.getCppModuleMap().getArtifact();
- Label moduleMapLabel = Label.parseAbsoluteUnchecked(context.getCppModuleMap().getName());
- CppCompileActionBuilder builder = initializeCompileAction(moduleMapArtifact, moduleMapLabel);
-
- builder.setSemantics(semantics);
-
- // A header module compile action is just like a normal compile action, but:
- // - the compiled source file is the module map
- // - it creates a header module (.pcm file).
- createSourceAction(
- FileSystemUtils.removeExtension(semantics.getEffectiveSourcePath(moduleMapArtifact))
- .getPathString(),
- result,
- env,
- moduleMapArtifact,
- builder,
- ArtifactCategory.CPP_MODULE,
- /*addObject=*/ false,
- /*enableCoverage=*/ false,
- /*generateDwo=*/ false,
- CppFileTypes.mustProduceDotdFile(moduleMapArtifact.getFilename()),
- ImmutableMap.<String, String>of());
+ createModuleAction(result, context.getCppModuleMap(), /*addHeaderTokenFiles=*/ false);
+ } else if (context.getVerificationModuleMap() != null) {
+ createModuleAction(result, context.getVerificationModuleMap(), /*addHeaderTokenFiles=*/ true);
}
for (CppSource source : sourceFiles) {
@@ -518,6 +499,7 @@ public final class CppModel {
sourceArtifact,
builder,
ArtifactCategory.OBJECT_FILE,
+ context.getCppModuleMap(),
/*addObject=*/ true,
isCodeCoverageEnabled(),
// The source action does not generate dwo when it has bitcode
@@ -525,7 +507,8 @@ public final class CppModel {
// info). In that case the LTOBackendAction will generate the dwo.
/*generateDwo=*/ cppConfiguration.useFission() && !bitcodeOutput,
CppFileTypes.mustProduceDotdFile(sourceArtifact.getFilename()),
- source.getBuildVariables());
+ source.getBuildVariables(), /*addHeaderTokenFile=*/
+ false);
}
}
@@ -549,6 +532,7 @@ public final class CppModel {
/*autoFdoImportPath=*/ null,
/*gcnoFile=*/ null,
/*dwoFile=*/ null,
+ builder.getContext().getCppModuleMap(),
ImmutableMap.<String, String>of());
semantics.finalizeCompileActionBuilder(ruleContext, builder);
CppCompileAction compileAction = builder.build();
@@ -557,6 +541,35 @@ public final class CppModel {
result.addHeaderTokenFile(tokenFile);
}
+ private void createModuleAction(
+ CcCompilationOutputs.Builder result, CppModuleMap cppModuleMap, boolean addHeaderTokenFiles) {
+ AnalysisEnvironment env = ruleContext.getAnalysisEnvironment();
+ Label moduleMapLabel = Label.parseAbsoluteUnchecked(context.getCppModuleMap().getName());
+ Artifact moduleMapArtifact = cppModuleMap.getArtifact();
+ CppCompileActionBuilder builder = initializeCompileAction(moduleMapArtifact, moduleMapLabel);
+
+ builder.setSemantics(semantics);
+
+ // A header module compile action is just like a normal compile action, but:
+ // - the compiled source file is the module map
+ // - it creates a header module (.pcm file).
+ createSourceAction(
+ FileSystemUtils.removeExtension(semantics.getEffectiveSourcePath(moduleMapArtifact))
+ .getPathString(),
+ result,
+ env,
+ moduleMapArtifact,
+ builder,
+ ArtifactCategory.CPP_MODULE,
+ cppModuleMap,
+ /*addObject=*/ false,
+ /*enableCoverage=*/ false,
+ /*generateDwo=*/ false,
+ CppFileTypes.mustProduceDotdFile(moduleMapArtifact.getFilename()),
+ ImmutableMap.<String, String>of(), /*addHeaderTokenFile=*/
+ addHeaderTokenFiles);
+ }
+
private void createClifMatchAction(
String outputName, Builder result, AnalysisEnvironment env, CppCompileActionBuilder builder) {
builder
@@ -573,6 +586,7 @@ public final class CppModel {
/*autoFdoImportPath=*/ null,
/*gcnoFile=*/ null,
/*dwoFile=*/ null,
+ builder.getContext().getCppModuleMap(),
/*sourceSpecificBuildVariables=*/ ImmutableMap.<String, String>of());
semantics.finalizeCompileActionBuilder(ruleContext, builder);
CppCompileAction compileAction = builder.build();
@@ -588,11 +602,13 @@ public final class CppModel {
Artifact sourceArtifact,
CppCompileActionBuilder builder,
ArtifactCategory outputCategory,
+ CppModuleMap cppModuleMap,
boolean addObject,
boolean enableCoverage,
boolean generateDwo,
boolean generateDotd,
- Map<String, String> sourceSpecificBuildVariables) {
+ Map<String, String> sourceSpecificBuildVariables,
+ boolean addHeaderTokenFiles) {
PathFragment ccRelativeName = semantics.getEffectiveSourcePath(sourceArtifact);
if (cppConfiguration.isLipoOptimization()) {
// TODO(bazel-team): we shouldn't be needing this, merging context with the binary
@@ -602,9 +618,7 @@ public final class CppModel {
builder.setContext(CppCompilationContext.mergeForLipo(lipoProvider.getLipoContext(),
context));
}
-
boolean generatePicAction = getGeneratePicActions();
- // If we always need pic for everything, then don't bother to create a no-pic action.
boolean generateNoPicAction = getGenerateNoPicActions();
Preconditions.checkState(generatePicAction || generateNoPicAction);
if (fake) {
@@ -633,6 +647,7 @@ public final class CppModel {
sourceArtifact.getExecPath(),
gcnoFile,
dwoFile,
+ cppModuleMap,
sourceSpecificBuildVariables);
if (maySaveTemps) {
@@ -647,6 +662,9 @@ public final class CppModel {
semantics.finalizeCompileActionBuilder(ruleContext, picBuilder);
CppCompileAction picAction = picBuilder.build();
env.registerAction(picAction);
+ if (addHeaderTokenFiles) {
+ result.addHeaderTokenFile(picAction.getOutputFile());
+ }
if (addObject) {
result.addPicObjectFile(picAction.getOutputFile());
@@ -680,12 +698,13 @@ public final class CppModel {
Artifact noPicDwoFile = generateDwo ? getDwoFile(noPicOutputFile) : null;
setupCompileBuildVariables(
- builder,
+ builder,
/*usePic=*/ false,
ccRelativeName,
sourceArtifact.getExecPath(),
gcnoFile,
noPicDwoFile,
+ cppModuleMap,
sourceSpecificBuildVariables);
if (maySaveTemps) {
@@ -706,6 +725,9 @@ public final class CppModel {
CppCompileAction compileAction = builder.build();
env.registerAction(compileAction);
Artifact objectFile = compileAction.getOutputFile();
+ if (addHeaderTokenFiles) {
+ result.addHeaderTokenFile(objectFile);
+ }
if (addObject) {
result.addObjectFile(objectFile);
if (featureConfiguration.isEnabled(CppRuleClasses.THIN_LTO)
@@ -752,6 +774,7 @@ public final class CppModel {
execPath,
/*gcnoFile=*/ null,
/*dwoFile=*/ null,
+ builder.getContext().getCppModuleMap(),
ImmutableMap.<String, String>of());
semantics.finalizeCompileActionBuilder(ruleContext, builder);
CppCompileAction action = builder.build();
@@ -1086,6 +1109,7 @@ public final class CppModel {
source.getExecPath(),
null,
null,
+ builder.getContext().getCppModuleMap(),
ImmutableMap.<String, String>of());
semantics.finalizeCompileActionBuilder(ruleContext, dBuilder);
CppCompileAction dAction = dBuilder.build();
@@ -1100,6 +1124,7 @@ public final class CppModel {
source.getExecPath(),
null,
null,
+ builder.getContext().getCppModuleMap(),
ImmutableMap.<String, String>of());
semantics.finalizeCompileActionBuilder(ruleContext, sdBuilder);
CppCompileAction sdAction = sdBuilder.build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
index 7382b00ce2..0db208b98f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
@@ -571,6 +571,16 @@ public class CppOptions extends FragmentOptions {
public boolean pruneCppModules;
@Option(
+ name = "parse_headers_verifies_modules",
+ defaultValue = "false",
+ category = "strategy",
+ help =
+ "If enabled, the parse_headers feature verifies that a header module can be built for the "
+ + "target in question instead of doing a separate compile of the header."
+ )
+ public boolean parseHeadersVerifiesModules;
+
+ @Option(
name = "experimental_omitfp",
defaultValue = "false",
category = "semantics",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java
index c06bdf006f..110908c057 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java
@@ -192,11 +192,12 @@ public class CppRuleClasses {
*/
public static final String LAYERING_CHECK = "layering_check";
- /**
- * A string constant for the header_modules feature.
- */
+ /** A string constant for the header_modules feature. */
public static final String HEADER_MODULES = "header_modules";
+ /** A string constant for the header_modules_compile feature. */
+ public static final String HEADER_MODULE_COMPILE = "header_module_compile";
+
/**
* A string constant for the compile_all_modules feature.
*/