diff options
author | Googler <noreply@google.com> | 2017-07-13 19:26:31 +0200 |
---|---|---|
committer | László Csomor <laszlocsomor@google.com> | 2017-07-14 10:52:03 +0200 |
commit | fba07bb72570245d26bd8795709c5a004fc9026a (patch) | |
tree | f00bf33b05ea22c73d050cf1bfae3b27796da53f /src/main/java/com/google/devtools | |
parent | 98375a24ab40bfe0ff124401ca2d95740f67e072 (diff) |
Add module_map attribute to objc_library
This allows users to specify a custom module map.
PiperOrigin-RevId: 161827651
Diffstat (limited to 'src/main/java/com/google/devtools')
6 files changed, 49 insertions, 11 deletions
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 7b7230c27b..e940d57823 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 @@ -303,6 +303,7 @@ public final class CcLibraryHelper { private final FdoSupportProvider fdoSupport; private String linkedArtifactNameSuffix = ""; private boolean useDeps = true; + private boolean generateModuleMap = true; /** * Creates a CcLibraryHelper. @@ -1388,13 +1389,17 @@ public final class CcLibraryHelper { featureConfiguration.isEnabled(CppRuleClasses.HEADER_MODULES) || featureConfiguration.isEnabled(CppRuleClasses.COMPILE_ALL_MODULES); Iterable<CppModuleMap> dependentModuleMaps = collectModuleMaps(); - Optional<Artifact> umbrellaHeader = cppModuleMap.getUmbrellaHeader(); - if (umbrellaHeader.isPresent()) { + + if (generateModuleMap) { + Optional<Artifact> umbrellaHeader = cppModuleMap.getUmbrellaHeader(); + if (umbrellaHeader.isPresent()) { + ruleContext.registerAction( + createUmbrellaHeaderAction(umbrellaHeader.get(), publicHeaders)); + } + ruleContext.registerAction( - createUmbrellaHeaderAction(umbrellaHeader.get(), publicHeaders)); + createModuleMapAction(cppModuleMap, publicHeaders, dependentModuleMaps, compiled)); } - ruleContext.registerAction( - createModuleMapAction(cppModuleMap, publicHeaders, dependentModuleMaps, compiled)); if (model.getGeneratesPicHeaderModule()) { contextBuilder.setPicHeaderModule(model.getPicHeaderModule(cppModuleMap.getArtifact())); } @@ -1594,4 +1599,12 @@ public final class CcLibraryHelper { public void registerAdditionalModuleMap(CppModuleMap cppModuleMap) { this.additionalCppModuleMaps.add(Preconditions.checkNotNull(cppModuleMap)); } + + /** + * Don't generate a module map for this target if a custom module map is provided. + */ + public CcLibraryHelper doNotGenerateModuleMap() { + generateModuleMap = false; + return this; + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java index 5945dbc413..39ed3e564c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java @@ -875,7 +875,7 @@ public abstract class CompilationSupport { } } - if (attributes.enableModules()) { + if (attributes.enableModules() && !getCustomModuleMap(ruleContext).isPresent()) { copts.add("-fmodules"); } if (copts.contains("-fmodules")) { @@ -1484,4 +1484,11 @@ public abstract class CompilationSupport { return null; } } + + public static Optional<Artifact> getCustomModuleMap(RuleContext ruleContext) { + if (ruleContext.attributes().has("module_map", BuildType.LABEL)) { + return Optional.fromNullable(ruleContext.getPrerequisiteArtifact("module_map", Mode.TARGET)); + } + return Optional.absent(); + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java index ad0fed4039..ff1d068a54 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java @@ -464,6 +464,9 @@ public class CrosstoolCompilationSupport extends CompilationSupport { if (!useDeps) { result.doNotUseDeps(); } + if (getCustomModuleMap(ruleContext).isPresent()) { + result.doNotGenerateModuleMap(); + } return result; } @@ -490,7 +493,8 @@ public class CrosstoolCompilationSupport extends CompilationSupport { .add(isHost ? "host" : "nonhost") .add(configuration.getCompilationMode().toString()); - if (configuration.getFragment(ObjcConfiguration.class).moduleMapsEnabled()) { + if (configuration.getFragment(ObjcConfiguration.class).moduleMapsEnabled() + && !getCustomModuleMap(ruleContext).isPresent()) { activatedCrosstoolSelectables.add(OBJC_MODULE_FEATURE_NAME); } if (!CompilationAttributes.Builder.fromRuleContext(ruleContext).build().enableModules()) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java index f6d037b4cb..668790132b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.objc; +import com.google.common.base.Optional; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Root; import com.google.devtools.build.lib.analysis.RuleContext; @@ -440,9 +441,13 @@ public final class IntermediateArtifacts { .replace("@", "") .replace("/", "_") .replace(":", "_"); - // To get Swift to pick up module maps, we need to name them "module.modulemap" and have their - // parent directory in the module map search paths. - if (umbrellaHeaderStrategy == UmbrellaHeaderStrategy.GENERATE) { + + Optional<Artifact> customModuleMap = CompilationSupport.getCustomModuleMap(ruleContext); + if (customModuleMap.isPresent()) { + return new CppModuleMap(customModuleMap.get(), moduleName); + } else if (umbrellaHeaderStrategy == UmbrellaHeaderStrategy.GENERATE) { + // To get Swift to pick up module maps, we need to name them "module.modulemap" and have their + // parent directory in the module map search paths. return new CppModuleMap( appendExtensionInGenfiles(".modulemaps/module.modulemap"), appendExtensionInGenfiles(".modulemaps/umbrella.h"), diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java index 7a703fe818..82de6228ac 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java @@ -335,7 +335,7 @@ public class LegacyCompilationSupport extends CompilationSupport { } // Add module map arguments. - if (moduleMap.isPresent()) { + if (moduleMap.isPresent() && !getCustomModuleMap(ruleContext).isPresent()) { // If modules are enabled for the rule, -fmodules is added to the copts already. (This implies // module map usage). Otherwise, we need to pass -fmodule-maps. if (!attributes.enableModules()) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java index 453776db23..411a7957f7 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java @@ -716,6 +716,15 @@ public class ObjcRuleClasses { @import path_to_package_target; <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/ .add(attr("enable_modules", BOOLEAN)) + /* <!-- #BLAZE_RULE($objc_compiling_rule).ATTRIBUTE(module_map) --> + A custom Clang module map for this target. Use of a custom module map is discouraged. Most + users should use module maps generated by Bazel. + If specified, Bazel will not generate a module map for this target, but will pass the + provided module map to the compiler. + <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/ + .add( + attr("module_map", LABEL) + .allowedFileTypes(FileType.of(".modulemap"))) /* Provides the label for header_scanner tool that is used to scan inclusions for ObjC sources and provide a list of required headers via a .header_list file. |