diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build')
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. */ |