diff options
author | allevato <allevato@google.com> | 2018-02-27 09:13:35 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-02-27 09:15:31 -0800 |
commit | d85aaea5d606c659807fff7cfef75781a59860bc (patch) | |
tree | 7ac4ebb22c6de0e6b81e600f2d90815e4c23c6a3 /src/main/java/com | |
parent | 48794a6edac0944ad2ecffc495b765ed10a2a3c9 (diff) |
Add --incompatible_strict_objc_module_maps.
This flag changes the behavior of objc_library module map propagation so that module maps are only propagated to direct dependents, not transitive dependents. swift_library targets that import Objective-C code must then list those dependencies directly in its deps instead of depending on them being transitively present.
PiperOrigin-RevId: 187184692
Diffstat (limited to 'src/main/java/com')
3 files changed, 31 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java index 64637c39d8..c836e345fe 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java @@ -304,13 +304,26 @@ public class ObjcCommandLineOptions extends FragmentOptions { defaultValue = "null", converter = LabelConverter.class, documentationCategory = OptionDocumentationCategory.TOOLCHAIN, - effectTags = {OptionEffectTag.CHANGES_INPUTS, OptionEffectTag.LOADING_AND_ANALYSIS}, + effectTags = {OptionEffectTag.AFFECTS_OUTPUTS, OptionEffectTag.LOADING_AND_ANALYSIS}, help = "Location of target that will provide the appropriate Apple SDK for the current build " + "configuration." ) public Label appleSdk; + @Option( + name = "incompatible_strict_objc_module_maps", + category = "incompatible changes", + defaultValue = "false", + documentationCategory = OptionDocumentationCategory.TOOLCHAIN, + metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE}, + effectTags = {OptionEffectTag.CHANGES_INPUTS, OptionEffectTag.LOADING_AND_ANALYSIS}, + help = + "Propagates Objective-C module maps only to direct dependencies in the 'objc' provider, " + + "not to all transitive dependencies." + ) + public boolean strictObjcModuleMaps; + @Override public FragmentOptions getHost() { ObjcCommandLineOptions host = (ObjcCommandLineOptions) super.getHost(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java index 3019d7a1a3..fbfa23e121 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java @@ -545,8 +545,13 @@ public final class ObjcCommon { if (umbrellaHeader.isPresent()) { objcProvider.add(UMBRELLA_HEADER, umbrellaHeader.get()); } - objcProvider.add(MODULE_MAP, moduleMap.getArtifact()); - objcProvider.add(TOP_LEVEL_MODULE_MAP, moduleMap); + if (context.getFragment(ObjcConfiguration.class).useStrictObjcModuleMaps()) { + objcProvider.addForDirectDependents(MODULE_MAP, moduleMap.getArtifact()); + objcProvider.addForDirectDependents(TOP_LEVEL_MODULE_MAP, moduleMap); + } else { + objcProvider.add(MODULE_MAP, moduleMap.getArtifact()); + objcProvider.add(TOP_LEVEL_MODULE_MAP, moduleMap); + } } objcProvider diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java index 6139c2a541..d95e40ca7c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java @@ -80,6 +80,7 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment { private final int objcHeaderThinningPartitionSize; private final Label objcHeaderScannerTool; private final Label appleSdk; + private final boolean strictObjcModuleMaps; ObjcConfiguration(ObjcCommandLineOptions objcOptions, BuildConfiguration.Options options) { this.iosSimulatorDevice = @@ -115,6 +116,7 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment { this.objcHeaderThinningPartitionSize = objcOptions.objcHeaderThinningPartitionSize; this.objcHeaderScannerTool = objcOptions.objcHeaderScannerTool; this.appleSdk = objcOptions.appleSdk; + this.strictObjcModuleMaps = objcOptions.strictObjcModuleMaps; } @AutoCodec.Instantiator @@ -142,7 +144,8 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment { boolean experimentalHeaderThinning, int objcHeaderThinningPartitionSize, Label objcHeaderScannerTool, - Label appleSdk) { + Label appleSdk, + boolean strictObjcModuleMaps) { this.iosSimulatorVersion = iosSimulatorVersion; this.iosSimulatorDevice = iosSimulatorDevice; this.watchosSimulatorVersion = watchosSimulatorVersion; @@ -167,6 +170,7 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment { this.objcHeaderThinningPartitionSize = objcHeaderThinningPartitionSize; this.objcHeaderScannerTool = objcHeaderScannerTool; this.appleSdk = appleSdk; + this.strictObjcModuleMaps = strictObjcModuleMaps; } /** @@ -375,4 +379,9 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment { public Label getAppleSdk() { return appleSdk; } + + /** Returns true if Objective-C module maps should only be propagated to direct dependencies. */ + public boolean useStrictObjcModuleMaps() { + return strictObjcModuleMaps; + } } |