diff options
author | Chris Parsons <cparsons@google.com> | 2016-09-29 21:55:45 +0000 |
---|---|---|
committer | Yun Peng <pcloudy@google.com> | 2016-09-30 08:15:01 +0000 |
commit | 1eac7e8195158a1b88dd6d1f11e5690ec387e077 (patch) | |
tree | dd8082c264e969c6f84ec5d10c6f89cccc29df1a /src/main/java | |
parent | 29dc3f7dabc24f9e032ffc3602c0f928babdf1ad (diff) |
Use minimum OS flags for watchOS and tvOS actions.
Also:
- Move minimum os information into AppleConfiguration
- Update watchos and tvos minimum version defaulting behavior
such that, if unspecified in flags, the minimum OS is equal
to the SDK version.
- Expose Apple Platform to apple_common in skylark
--
MOS_MIGRATED_REVID=134712763
Diffstat (limited to 'src/main/java')
19 files changed, 168 insertions, 150 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java index 9d3fc545ed..5d2830a049 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java @@ -35,6 +35,9 @@ import java.util.List; */ public class AppleCommandLineOptions extends FragmentOptions { + @VisibleForTesting + public static final String DEFAULT_MINIMUM_IOS = "7.0"; + @Option( name = "xcode_version", defaultValue = "null", @@ -84,6 +87,33 @@ public class AppleCommandLineOptions extends FragmentOptions { ) public DottedVersion macOsXSdkVersion; + @Option( + name = "ios_minimum_os", + defaultValue = DEFAULT_MINIMUM_IOS, + category = "flags", + converter = DottedVersionConverter.class, + help = "Minimum compatible iOS version for target simulators and devices." + ) + public DottedVersion iosMinimumOs; + + @Option( + name = "watchos_minimum_os", + defaultValue = "null", + category = "flags", + converter = DottedVersionConverter.class, + help = "Minimum compatible watchOS version for target simulators and devices." + ) + public DottedVersion watchosMinimumOs; + + @Option( + name = "tvos_minimum_os", + defaultValue = "null", + category = "flags", + converter = DottedVersionConverter.class, + help = "Minimum compatible tvOS version for target simulators and devices." + ) + public DottedVersion tvosMinimumOs; + @VisibleForTesting public static final String DEFAULT_IOS_SDK_VERSION = "8.4"; @VisibleForTesting public static final String DEFAULT_WATCHOS_SDK_VERSION = "2.0"; @VisibleForTesting public static final String DEFAULT_MACOSX_SDK_VERSION = "10.10"; diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java index 45cb8faf21..59a6fc1403 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java @@ -68,9 +68,12 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { private static final DottedVersion MINIMUM_BITCODE_XCODE_VERSION = DottedVersion.fromString("7"); private final DottedVersion iosSdkVersion; - private final DottedVersion watchOsSdkVersion; - private final DottedVersion tvOsSdkVersion; - private final DottedVersion macOsXSdkVersion; + private final DottedVersion iosMinimumOs; + private final DottedVersion watchosSdkVersion; + private final DottedVersion watchosMinimumOs; + private final DottedVersion tvosSdkVersion; + private final DottedVersion tvosMinimumOs; + private final DottedVersion macosXSdkVersion; private final String iosCpu; private final String appleSplitCpu; private final PlatformType applePlatformType; @@ -87,16 +90,24 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { AppleConfiguration(AppleCommandLineOptions appleOptions, Optional<DottedVersion> xcodeVersionOverride, DottedVersion iosSdkVersion, - DottedVersion watchOsSdkVersion, - DottedVersion tvOsSdkVersion, - DottedVersion macOsXSdkVersion) { + DottedVersion watchosSdkVersion, + DottedVersion watchosMinimumOs, + DottedVersion tvosSdkVersion, + DottedVersion tvosMinimumOs, + DottedVersion macosXSdkVersion) { this.iosSdkVersion = Preconditions.checkNotNull(iosSdkVersion, "iosSdkVersion"); - this.watchOsSdkVersion = - Preconditions.checkNotNull(watchOsSdkVersion, "watchOsSdkVersion"); - this.tvOsSdkVersion = - Preconditions.checkNotNull(tvOsSdkVersion, "tvOsSdkVersion"); - this.macOsXSdkVersion = - Preconditions.checkNotNull(macOsXSdkVersion, "macOsXSdkVersion"); + this.iosMinimumOs = Preconditions.checkNotNull(appleOptions.iosMinimumOs, "iosMinimumOs"); + this.watchosSdkVersion = + Preconditions.checkNotNull(watchosSdkVersion, "watchOsSdkVersion"); + this.watchosMinimumOs = + Preconditions.checkNotNull(watchosMinimumOs, "watchOsMinimumOs"); + this.tvosSdkVersion = + Preconditions.checkNotNull(tvosSdkVersion, "tvOsSdkVersion"); + this.tvosMinimumOs = + Preconditions.checkNotNull(tvosMinimumOs, "tvOsMinimumOs"); + + this.macosXSdkVersion = + Preconditions.checkNotNull(macosXSdkVersion, "macOsXSdkVersion"); this.xcodeVersion = Preconditions.checkNotNull(xcodeVersionOverride); this.iosCpu = Preconditions.checkNotNull(appleOptions.iosCpu, "iosCpu"); @@ -120,6 +131,36 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { } /** + * Returns the minimum iOS version supported by binaries and libraries. Any dependencies on newer + * iOS version features or libraries will become weak dependencies which are only loaded if the + * runtime OS supports them. + */ + @SkylarkCallable(name = "ios_minimum_os", structField = true, + doc = "The minimum compatible iOS version for target simulators and devices.") + public DottedVersion getMinimumOs() { + // TODO(bazel-team): Deprecate in favor of getMinimumOsForPlatformType(IOS). + return iosMinimumOs; + } + + @SkylarkCallable( + name = "minimum_os_for_platform_type", + doc = "The minimum compatible OS version for target simulator and devices for a particular " + + "platform type.") + public DottedVersion getMinimumOsForPlatformType(PlatformType platformType) { + switch (platformType) { + case IOS: + return iosMinimumOs; + case TVOS: + return tvosMinimumOs; + case WATCHOS: + return watchosMinimumOs; + default: + throw new IllegalArgumentException("Unhandled platform: " + platformType); + } + } + + + /** * Returns the SDK version for ios SDKs (whether they be for simulator or device). This is * directly derived from --ios_sdk_version. * @@ -141,12 +182,12 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { return iosSdkVersion; case TVOS_DEVICE: case TVOS_SIMULATOR: - return tvOsSdkVersion; + return tvosSdkVersion; case WATCHOS_DEVICE: case WATCHOS_SIMULATOR: - return watchOsSdkVersion; + return watchosSdkVersion; case MACOS_X: - return macOsXSdkVersion; + return macosXSdkVersion; } throw new AssertionError(); @@ -497,15 +538,22 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { DottedVersion iosSdkVersion = (appleOptions.iosSdkVersion != null) ? appleOptions.iosSdkVersion : xcodeVersionProperties.getDefaultIosSdkVersion(); + // TODO(cparsons): Look into ios_minimum_os matching the defaulting behavior of the other + // platforms. DottedVersion watchosSdkVersion = (appleOptions.watchOsSdkVersion != null) ? appleOptions.watchOsSdkVersion : xcodeVersionProperties.getDefaultWatchosSdkVersion(); + DottedVersion watchosMinimumOsVersion = (appleOptions.watchosMinimumOs != null) + ? appleOptions.watchosMinimumOs : watchosSdkVersion; DottedVersion tvosSdkVersion = (appleOptions.tvOsSdkVersion != null) ? appleOptions.tvOsSdkVersion : xcodeVersionProperties.getDefaultTvosSdkVersion(); + DottedVersion tvosMinimumOsVersion = (appleOptions.tvosMinimumOs != null) + ? appleOptions.tvosMinimumOs : tvosSdkVersion; DottedVersion macosxSdkVersion = (appleOptions.macOsXSdkVersion != null) ? appleOptions.macOsXSdkVersion : xcodeVersionProperties.getDefaultMacosxSdkVersion(); AppleConfiguration configuration = new AppleConfiguration(appleOptions, xcodeVersionProperties.getXcodeVersion(), - iosSdkVersion, watchosSdkVersion, tvosSdkVersion, macosxSdkVersion); + iosSdkVersion, watchosSdkVersion, watchosMinimumOsVersion, + tvosSdkVersion, tvosMinimumOsVersion, macosxSdkVersion); validate(configuration); return configuration; diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/Platform.java b/src/main/java/com/google/devtools/build/lib/rules/apple/Platform.java index dfedd90cf2..691a1f3823 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/Platform.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/Platform.java @@ -21,7 +21,6 @@ import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; import com.google.devtools.build.lib.util.Preconditions; - import java.util.HashMap; import java.util.Locale; import java.util.Set; @@ -35,13 +34,13 @@ import javax.annotation.Nullable; ) public enum Platform { - IOS_DEVICE("iPhoneOS", PlatformType.IOS, true), - IOS_SIMULATOR("iPhoneSimulator", PlatformType.IOS, false), - MACOS_X("MacOSX", PlatformType.MACOSX, true), - TVOS_DEVICE("AppleTVOS", PlatformType.TVOS, true), - TVOS_SIMULATOR("AppleTVSimulator", PlatformType.TVOS, false), - WATCHOS_DEVICE("WatchOS", PlatformType.WATCHOS, true), - WATCHOS_SIMULATOR("WatchSimulator", PlatformType.WATCHOS, false); + IOS_DEVICE("ios_device", "iPhoneOS", PlatformType.IOS, true), + IOS_SIMULATOR("ios_simulator", "iPhoneSimulator", PlatformType.IOS, false), + MACOS_X("macos_x", "MacOSX", PlatformType.MACOSX, true), + TVOS_DEVICE("tvos_device", "AppleTVOS", PlatformType.TVOS, true), + TVOS_SIMULATOR("tvos_simulator", "AppleTVSimulator", PlatformType.TVOS, false), + WATCHOS_DEVICE("watchos_device", "WatchOS", PlatformType.WATCHOS, true), + WATCHOS_SIMULATOR("watchos_simulator", "WatchSimulator", PlatformType.WATCHOS, false); private static final Set<String> IOS_SIMULATOR_TARGET_CPUS = ImmutableSet.of("ios_x86_64", "ios_i386"); @@ -58,11 +57,13 @@ public enum Platform { private static final Set<String> MACOSX_TARGET_CPUS = ImmutableSet.of("darwin_x86_64"); + private final String skylarkKey; private final String nameInPlist; private final PlatformType platformType; private final boolean isDevice; - Platform(String nameInPlist, PlatformType platformType, boolean isDevice) { + Platform(String skylarkKey, String nameInPlist, PlatformType platformType, boolean isDevice) { + this.skylarkKey = skylarkKey; this.nameInPlist = Preconditions.checkNotNull(nameInPlist); this.platformType = platformType; this.isDevice = isDevice; @@ -165,6 +166,17 @@ public enum Platform { return forTargetCpuNullable(targetCpu) != null; } + /** Returns a Skylark struct that contains the instances of this enum. */ + public static SkylarkClassObject getSkylarkStruct() { + SkylarkClassObjectConstructor constructor = + SkylarkClassObjectConstructor.createNative("platforms"); + HashMap<String, Object> fields = new HashMap<>(); + for (Platform type : values()) { + fields.put(type.skylarkKey, type); + } + return new SkylarkClassObject(constructor, fields); + } + /** * Value used to describe Apple platform "type". A {@link Platform} is implied from a platform * type (for example, watchOS) together with a cpu value (for example, armv7). diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java index ed5b6d8d40..5583c4ece6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java @@ -17,6 +17,7 @@ package com.google.devtools.build.lib.rules.objc; import com.google.common.annotations.VisibleForTesting; import com.google.devtools.build.lib.packages.SkylarkClassObject; import com.google.devtools.build.lib.rules.apple.AppleToolchain; +import com.google.devtools.build.lib.rules.apple.Platform; import com.google.devtools.build.lib.rules.apple.Platform.PlatformType; import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key; import com.google.devtools.build.lib.skylarkinterface.Param; @@ -26,7 +27,6 @@ import com.google.devtools.build.lib.skylarkinterface.SkylarkSignature; import com.google.devtools.build.lib.syntax.BuiltinFunction; import com.google.devtools.build.lib.syntax.SkylarkDict; import com.google.devtools.build.lib.syntax.SkylarkSignatureProcessor; - import java.util.Map.Entry; import javax.annotation.Nullable; @@ -64,6 +64,8 @@ public class AppleSkylarkCommon { @Nullable private SkylarkClassObject platformType; + @Nullable + private SkylarkClassObject platform; @SkylarkCallable( name = "apple_toolchain", @@ -89,6 +91,21 @@ public class AppleSkylarkCommon { return platformType; } + @SkylarkCallable( + name = "platform", + doc = "Returns a struct containing fields corresponding to Apple platforms. These values " + + "can be passed to methods that expect a platform, like the 'apple' configuration " + + "fragment's 'sdk_version_for_platform' method. Each platform_type except for macosx " + + "has two platform types -- one for device, and one for simulator.", + structField = true + ) + public SkylarkClassObject getPlatformStruct() { + if (platform == null) { + platform = Platform.getSkylarkStruct(); + } + return platform; + } + @SkylarkSignature( name = "new_objc_provider", objectType = AppleSkylarkCommon.class, diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java index f214487e05..9e72c42549 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java @@ -122,7 +122,6 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory Optional<XcTestAppProvider> xcTestAppProvider; Optional<RunfilesSupport> maybeRunfilesSupport = Optional.absent(); - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); switch (hasReleaseBundlingSupport) { case YES: AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); @@ -133,7 +132,7 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory objcProvider, LinkedBinary.LOCAL_AND_DEPENDENCIES, ReleaseBundlingSupport.APP_BUNDLE_DIR_FORMAT, - objcConfiguration.getMinimumOs(), + appleConfiguration.getMinimumOsForPlatformType(PlatformType.IOS), appleConfiguration.getSingleArchPlatform()); releaseBundlingSupport .registerActions(DsymOutputType.APP) 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 31322dbb34..fa16aaf3f9 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 @@ -1799,11 +1799,11 @@ public final class CompilationSupport { switch (platform) { case IOS_SIMULATOR: builder.add("-mios-simulator-version-min=" - + objcConfiguration.getMinimumOsForPlatformType(platform.getType())); + + appleConfiguration.getMinimumOsForPlatformType(platform.getType())); break; case IOS_DEVICE: builder.add("-miphoneos-version-min=" - + objcConfiguration.getMinimumOsForPlatformType(platform.getType())); + + appleConfiguration.getMinimumOsForPlatformType(platform.getType())); break; case WATCHOS_SIMULATOR: // TODO(bazel-team): Use the value from --watchos-minimum-os instead of tying to the SDK @@ -1819,11 +1819,11 @@ public final class CompilationSupport { break; case TVOS_SIMULATOR: builder.add("-mtvos-simulator-version-min=" - + objcConfiguration.getMinimumOsForPlatformType(platform.getType())); + + appleConfiguration.getMinimumOsForPlatformType(platform.getType())); break; case TVOS_DEVICE: builder.add("-mtvos-version-min=" - + objcConfiguration.getMinimumOsForPlatformType(platform.getType())); + + appleConfiguration.getMinimumOsForPlatformType(platform.getType())); break; default: throw new IllegalArgumentException("Unhandled platform " + platform); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtension.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtension.java index f4435d4a0f..184dcdced5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtension.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtension.java @@ -25,10 +25,11 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.config.BuildOptions; import com.google.devtools.build.lib.packages.Attribute.SplitTransition; import com.google.devtools.build.lib.rules.apple.AppleCommandLineOptions; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher; import com.google.devtools.build.lib.rules.apple.DottedVersion; +import com.google.devtools.build.lib.rules.apple.Platform.PlatformType; import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.SplitArchTransition; - import java.io.Serializable; /** @@ -60,7 +61,9 @@ public class IosExtension extends ReleaseBundlingTargetFactory { @Override protected DottedVersion bundleMinimumOsVersion(RuleContext ruleContext) { - return determineMinimumOsVersion(ObjcRuleClasses.objcConfiguration(ruleContext).getMinimumOs(), + return determineMinimumOsVersion( + ruleContext.getFragment(AppleConfiguration.class) + .getMinimumOsForPlatformType(PlatformType.IOS), EXTENSION_MINIMUM_OS_VERSION); } @@ -110,11 +113,11 @@ public class IosExtension extends ReleaseBundlingTargetFactory { @Override protected ImmutableList<BuildOptions> defaultOptions(BuildOptions originalOptions) { - ObjcCommandLineOptions objcOptions = originalOptions.get(ObjcCommandLineOptions.class); - DottedVersion newMinimumVersion = determineMinimumOsVersion(objcOptions.iosMinimumOs, + AppleCommandLineOptions appleOptions = originalOptions.get(AppleCommandLineOptions.class); + DottedVersion newMinimumVersion = determineMinimumOsVersion(appleOptions.iosMinimumOs, minimumOSVersion); - if (newMinimumVersion.equals(objcOptions.iosMinimumOs)) { + if (newMinimumVersion.equals(appleOptions.iosMinimumOs)) { return ImmutableList.of(); } @@ -127,7 +130,7 @@ public class IosExtension extends ReleaseBundlingTargetFactory { @Override protected void setAdditionalOptions(BuildOptions splitOptions, BuildOptions originalOptions) { - DottedVersion fromFlag = originalOptions.get(ObjcCommandLineOptions.class).iosMinimumOs; + DottedVersion fromFlag = originalOptions.get(AppleCommandLineOptions.class).iosMinimumOs; setMinimumOsVersion(splitOptions, determineMinimumOsVersion(fromFlag, minimumOSVersion)); } @@ -137,7 +140,7 @@ public class IosExtension extends ReleaseBundlingTargetFactory { } private void setMinimumOsVersion(BuildOptions splitOptions, DottedVersion newMinimumVersion) { - splitOptions.get(ObjcCommandLineOptions.class).iosMinimumOs = newMinimumVersion; + splitOptions.get(AppleCommandLineOptions.class).iosMinimumOs = newMinimumVersion; } } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosFramework.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosFramework.java index 4de6706c1f..0bd68c41b1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosFramework.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosFramework.java @@ -31,8 +31,10 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.actions.SymlinkAction; import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher; import com.google.devtools.build.lib.rules.apple.DottedVersion; +import com.google.devtools.build.lib.rules.apple.Platform.PlatformType; import com.google.devtools.build.lib.rules.cpp.CcCommon; import com.google.devtools.build.lib.util.Pair; import com.google.devtools.build.lib.vfs.PathFragment; @@ -72,7 +74,8 @@ public class IosFramework extends ReleaseBundlingTargetFactory { // minimum iOS version of less than 8.0 may contain frameworks in their bundle, the framework // itself needs to be built with 8.0 or higher. This logic overrides (if necessary) any // flag-set minimum iOS version for framework only so that this requirement is not violated. - DottedVersion fromFlag = ObjcRuleClasses.objcConfiguration(ruleContext).getMinimumOs(); + DottedVersion fromFlag = ruleContext.getFragment(AppleConfiguration.class) + .getMinimumOsForPlatformType(PlatformType.IOS); return Ordering.natural().max(fromFlag, MINIMUM_OS_VERSION); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java index be3e6639ba..b1c4389202 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java @@ -163,14 +163,13 @@ public final class IosTest implements RuleConfiguredTargetFactory { .addXcodeSettings(xcodeProviderBuilder, common) .validateAttributes(); - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); new ReleaseBundlingSupport( ruleContext, common.getObjcProvider(), LinkedBinary.LOCAL_AND_DEPENDENCIES, bundleFormat, - objcConfiguration.getMinimumOs(), + appleConfiguration.getMinimumOsForPlatformType(PlatformType.IOS), appleConfiguration.getMultiArchPlatform(PlatformType.IOS)) .registerActions(DsymOutputType.TEST) .addXcodeSettings(xcodeProviderBuilder) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java index cbc74ea862..b8f691cf94 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java @@ -27,11 +27,11 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; +import com.google.devtools.build.lib.rules.apple.Platform.PlatformType; import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes; import com.google.devtools.build.lib.rules.objc.TargetDeviceFamily.InvalidFamilyNameException; import com.google.devtools.build.lib.rules.objc.TargetDeviceFamily.RepeatedFamilyNameException; import com.google.devtools.build.lib.syntax.Type; - import java.util.List; /** @@ -84,7 +84,6 @@ public class ObjcBundleLibrary implements RuleConfiguredTargetFactory { private Bundling bundling(RuleContext ruleContext, ObjcCommon common) { IntermediateArtifacts intermediateArtifacts = ObjcRuleClasses.intermediateArtifacts(ruleContext); - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); ImmutableSet<TargetDeviceFamily> families = null; @@ -106,7 +105,7 @@ public class ObjcBundleLibrary implements RuleConfiguredTargetFactory { .setObjcProvider(common.getObjcProvider()) .addInfoplistInputFromRule(ruleContext) .setIntermediateArtifacts(intermediateArtifacts) - .setMinimumOsVersion(objcConfiguration.getMinimumOs()) + .setMinimumOsVersion(appleConfiguration.getMinimumOsForPlatformType(PlatformType.IOS)) .setTargetDeviceFamilies(families) .build(); } 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 3efdc8b4d4..ab1e96bd1b 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 @@ -14,7 +14,6 @@ package com.google.devtools.build.lib.rules.objc; -import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.LabelConverter; import com.google.devtools.build.lib.analysis.config.BuildOptions; @@ -98,33 +97,6 @@ public class ObjcCommandLineOptions extends FragmentOptions { help = "Additional options to pass to Objective C compilation.") public List<String> copts; - @Option( - name = "ios_minimum_os", - defaultValue = DEFAULT_MINIMUM_IOS, - category = "flags", - converter = DottedVersionConverter.class, - help = "Minimum compatible iOS version for target simulators and devices." - ) - public DottedVersion iosMinimumOs; - - @Option( - name = "watchos_minimum_os", - defaultValue = DEFAULT_MINIMUM_WATCHOS, - category = "flags", - converter = DottedVersionConverter.class, - help = "Minimum compatible watchOS version for target simulators and devices." - ) - public DottedVersion watchosMinimumOs; - - @Option( - name = "tvos_minimum_os", - defaultValue = DEFAULT_MINIMUM_TVOS, - category = "flags", - converter = DottedVersionConverter.class, - help = "Minimum compatible tvOS version for target simulators and devices." - ) - public DottedVersion tvosMinimumOs; - @Option(name = "ios_memleaks", defaultValue = "false", category = "misc", @@ -248,7 +220,7 @@ public class ObjcCommandLineOptions extends FragmentOptions { category = "undocumented" ) public boolean experimentalObjcLibrary; - + @Option( name = "objc_use_dotd_pruning", defaultValue = "false", @@ -258,10 +230,6 @@ public class ObjcCommandLineOptions extends FragmentOptions { + "compiles." ) public boolean useDotdPruning; - - @VisibleForTesting static final String DEFAULT_MINIMUM_IOS = "7.0"; - @VisibleForTesting static final String DEFAULT_MINIMUM_WATCHOS = "2.0"; - @VisibleForTesting static final String DEFAULT_MINIMUM_TVOS = "9.0"; @SuppressWarnings("unchecked") @Override 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 ebe35c5212..b773269a97 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 @@ -53,13 +53,10 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment { ImmutableList.of( "-Os", "-DNDEBUG=1", "-Wno-unused-variable", "-Winit-self", "-Wno-extra"); - private final DottedVersion iosMinimumOs; private final DottedVersion iosSimulatorVersion; private final String iosSimulatorDevice; - private final DottedVersion watchosMinimumOs; private final DottedVersion watchosSimulatorVersion; private final String watchosSimulatorDevice; - private final DottedVersion tvosMinimumOs; private final DottedVersion tvosSimulatorVersion; private final String tvosSimulatorDevice; private final boolean generateDsym; @@ -83,18 +80,14 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment { ObjcConfiguration(ObjcCommandLineOptions objcOptions, BuildConfiguration.Options options, @Nullable BlazeDirectories directories) { - this.iosMinimumOs = Preconditions.checkNotNull(objcOptions.iosMinimumOs, "iosMinimumOs"); this.iosSimulatorDevice = Preconditions.checkNotNull(objcOptions.iosSimulatorDevice, "iosSimulatorDevice"); this.iosSimulatorVersion = Preconditions.checkNotNull(objcOptions.iosSimulatorVersion, "iosSimulatorVersion"); - this.watchosMinimumOs = - Preconditions.checkNotNull(objcOptions.watchosMinimumOs, "watchosMinimumOs"); this.watchosSimulatorDevice = Preconditions.checkNotNull(objcOptions.watchosSimulatorDevice, "watchosSimulatorDevice"); this.watchosSimulatorVersion = Preconditions.checkNotNull(objcOptions.watchosSimulatorVersion, "watchosSimulatorVersion"); - this.tvosMinimumOs = Preconditions.checkNotNull(objcOptions.tvosMinimumOs, "tvosMinimumOs"); this.tvosSimulatorDevice = Preconditions.checkNotNull(objcOptions.tvosSimulatorDevice, "tvosSimulatorDevice"); this.tvosSimulatorVersion = @@ -123,18 +116,6 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment { } /** - * Returns the minimum iOS version supported by binaries and libraries. Any dependencies on newer - * iOS version features or libraries will become weak dependencies which are only loaded if the - * runtime OS supports them. - */ - @SkylarkCallable(name = "ios_minimum_os", structField = true, - doc = "The minimum compatible iOS version for target simulators and devices.") - public DottedVersion getMinimumOs() { - // TODO(bazel-team): Deprecate in favor of getMinimumOsForPlatformType(IOS). - return iosMinimumOs; - } - - /** * Returns the type of device (e.g. 'iPhone 6') to simulate when running on the simulator. */ @SkylarkCallable(name = "ios_simulator_device", structField = true, @@ -152,23 +133,6 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment { } @SkylarkCallable( - name = "minimum_os_for_platform_type", - doc = "The minimum compatible OS version for target simulator and devices for a particular " - + "platform type.") - public DottedVersion getMinimumOsForPlatformType(PlatformType platformType) { - switch (platformType) { - case IOS: - return iosMinimumOs; - case TVOS: - return tvosMinimumOs; - case WATCHOS: - return watchosMinimumOs; - default: - throw new IllegalArgumentException("Unhandled platform: " + platformType); - } - } - - @SkylarkCallable( name = "simulator_device_for_platform_type", doc = "The type of device (e.g., 'iPhone 6' to simulate when running on the simulator.") public String getSimulatorDeviceForPlatformType(PlatformType platformType) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java index 51b47ef153..6e13ff79bd 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java @@ -23,7 +23,6 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.Platform; -import com.google.devtools.build.lib.rules.apple.Platform.PlatformType; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables.ValueSequence; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables.VariablesExtension; @@ -52,7 +51,6 @@ class ObjcVariablesExtension implements VariablesExtension { private final BuildConfiguration buildConfiguration; private final AppleConfiguration appleConfiguration; - private final ObjcConfiguration objcConfiguration; public ObjcVariablesExtension( RuleContext ruleContext, @@ -67,7 +65,6 @@ class ObjcVariablesExtension implements VariablesExtension { this.fullyLinkArchive = fullyLinkArchive; this.intermediateArtifacts = intermediateArtifacts; this.buildConfiguration = buildConfiguration; - this.objcConfiguration = buildConfiguration.getFragment(ObjcConfiguration.class); this.appleConfiguration = buildConfiguration.getFragment(AppleConfiguration.class); } @@ -118,27 +115,8 @@ class ObjcVariablesExtension implements VariablesExtension { private void addArchVariables(CcToolchainFeatures.Variables.Builder builder) { Platform platform = appleConfiguration.getSingleArchPlatform(); - switch (platform.getType()) { - case IOS: - builder.addVariable( - VERSION_MIN_VARIABLE_NAME, - objcConfiguration.getMinimumOsForPlatformType(PlatformType.IOS).toString()); - break; - case TVOS: - builder.addVariable( - VERSION_MIN_VARIABLE_NAME, - objcConfiguration.getMinimumOsForPlatformType(PlatformType.TVOS).toString()); - break; - case WATCHOS: - // TODO(bazel-team): Use the minimum OS version derived from the flag as is done for the - // other platform types. - builder.addVariable( - VERSION_MIN_VARIABLE_NAME, - appleConfiguration.getSdkVersionForPlatform(platform).toString()); - break; - default: - throw new IllegalArgumentException("Unhandled platform: " + platform); - } + builder.addVariable(VERSION_MIN_VARIABLE_NAME, + appleConfiguration.getMinimumOsForPlatformType(platform.getType()).toString()); } private void addArchiveVariables(CcToolchainFeatures.Variables.Builder builder) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java index 54ba369ca0..5af53b3587 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java @@ -125,7 +125,8 @@ public abstract class ReleaseBundlingTargetFactory implements RuleConfiguredTarg * configuration). */ protected DottedVersion bundleMinimumOsVersion(RuleContext ruleContext) { - return ObjcRuleClasses.objcConfiguration(ruleContext).getMinimumOs(); + return ruleContext.getFragment(AppleConfiguration.class) + .getMinimumOsForPlatformType(PlatformType.IOS); } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/Watch2ExtensionSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/Watch2ExtensionSupport.java index a0aa241320..12c0819451 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/Watch2ExtensionSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/Watch2ExtensionSupport.java @@ -37,11 +37,9 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; -import com.google.devtools.build.lib.rules.apple.Platform; import com.google.devtools.build.lib.rules.apple.Platform.PlatformType; import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.LinkedBinary; import com.google.devtools.build.lib.syntax.Type; - import javax.annotation.Nullable; /** @@ -112,7 +110,6 @@ public class Watch2ExtensionSupport { } AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); - Platform appPlatform = appleConfiguration.getMultiArchPlatform(PlatformType.WATCHOS); ReleaseBundlingSupport releaseBundlingSupport = new ReleaseBundlingSupport( @@ -121,7 +118,7 @@ public class Watch2ExtensionSupport { LinkedBinary.DEPENDENCIES_ONLY, ReleaseBundlingSupport.EXTENSION_BUNDLE_DIR_FORMAT, bundleName, - appleConfiguration.getSdkVersionForPlatform(appPlatform), + appleConfiguration.getMinimumOsForPlatformType(PlatformType.WATCHOS), releaseBundling.build(), appleConfiguration.getMultiArchPlatform(PlatformType.WATCHOS)); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/WatchApplicationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/WatchApplicationSupport.java index cff817f088..a5b5992b9e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/WatchApplicationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/WatchApplicationSupport.java @@ -191,11 +191,10 @@ final class WatchApplicationSupport { PlatformType appPlatformType = watchOSVersion == WatchOSVersion.OS1 ? PlatformType.IOS : PlatformType.WATCHOS; - Platform appPlatform = appleConfiguration.getMultiArchPlatform(appPlatformType); DottedVersion minimumOsVersion = appPlatformType == PlatformType.IOS ? WatchUtils.determineMinimumIosVersion( - ObjcRuleClasses.objcConfiguration(ruleContext).getMinimumOs()) - : appleConfiguration.getSdkVersionForPlatform(appPlatform); + appleConfiguration.getMinimumOsForPlatformType(PlatformType.IOS)) + : appleConfiguration.getMinimumOsForPlatformType(PlatformType.WATCHOS); ReleaseBundlingSupport releaseBundlingSupport = new ReleaseBundlingSupport( diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/WatchExtensionSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/WatchExtensionSupport.java index 9de8689085..d988343f44 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/WatchExtensionSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/WatchExtensionSupport.java @@ -143,7 +143,7 @@ public class WatchExtensionSupport { ReleaseBundlingSupport.EXTENSION_BUNDLE_DIR_FORMAT, bundleName, WatchUtils.determineMinimumIosVersion( - ObjcRuleClasses.objcConfiguration(ruleContext).getMinimumOs()), + appleConfiguration.getMinimumOsForPlatformType(PlatformType.IOS)), releaseBundling.build(), appleConfiguration.getMultiArchPlatform(PlatformType.IOS)); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/WatchUtils.java b/src/main/java/com/google/devtools/build/lib/rules/objc/WatchUtils.java index 228445f443..f0df7f5ab8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/WatchUtils.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/WatchUtils.java @@ -193,7 +193,8 @@ final class WatchUtils { XcodeprojBuildSetting.newBuilder() .setName("IPHONEOS_DEPLOYMENT_TARGET") .setValue(determineMinimumIosVersion( - ObjcRuleClasses.objcConfiguration(ruleContext).getMinimumOs()).toString()) + ruleContext.getFragment(AppleConfiguration.class) + .getMinimumOsForPlatformType(PlatformType.IOS)).toString()) .build()); return xcodeSettings.build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeSupport.java index d179d75f95..9d75d1168e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeSupport.java @@ -30,11 +30,11 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher; +import com.google.devtools.build.lib.rules.apple.Platform.PlatformType; import com.google.devtools.build.lib.rules.objc.XcodeProvider.Builder; import com.google.devtools.build.lib.rules.objc.XcodeProvider.Project; import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos; import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos.XcodeprojBuildSetting; - import java.io.InputStream; import java.util.List; @@ -273,7 +273,7 @@ public final class XcodeSupport { this.workspaceRoot = objcConfiguration.getXcodeWorkspaceRoot(); this.appleCpus = appleConfiguration.getMultiArchitectures( appleConfiguration.getSingleArchPlatform().getType()); - this.minimumOs = objcConfiguration.getMinimumOs().toString(); + this.minimumOs = appleConfiguration.getMinimumOsForPlatformType(PlatformType.IOS).toString(); this.generateDebugSymbols = objcConfiguration.generateDsym(); } |