diff options
author | cpeyser <cpeyser@google.com> | 2017-06-26 16:46:31 +0200 |
---|---|---|
committer | Marcel Hlopko <hlopko@google.com> | 2017-06-26 18:43:04 +0200 |
commit | c9ab594c1f9334fa20e70a9ec1bc0414c10d74a6 (patch) | |
tree | bafcbff6876a089a2a792a38bc21e318d8540b27 /src | |
parent | 192422d2e554d297972c1cdc02127b1ca8be54ab (diff) |
Remove usage of --ios_cpu from Bazel.
PiperOrigin-RevId: 160143322
Diffstat (limited to 'src')
7 files changed, 89 insertions, 22 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 3e5e1e22f6..951b3670de 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 @@ -299,7 +299,7 @@ public class AppleCommandLineOptions extends FragmentOptions { @Option( name = "apple_crosstool_transition", - defaultValue = "false", + defaultValue = "true", optionUsageRestrictions = OptionUsageRestrictions.UNDOCUMENTED, help = "If true, the apple crosstool is used for all apple rules." ) 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 1ca3eedcb2..860afbca2d 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 @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.apple; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Joiner; import com.google.common.base.Optional; import com.google.common.base.Strings; @@ -66,6 +67,12 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { private static final DottedVersion MINIMUM_BITCODE_XCODE_VERSION = DottedVersion.fromString("7"); + /** Prefix for iOS cpu values. */ + public static final String IOS_CPU_PREFIX = "ios_"; + + /** Default cpu for iOS builds. */ + @VisibleForTesting static final String DEFAULT_IOS_CPU = "x86_64"; + @Nullable private final DottedVersion xcodeVersion; private final DottedVersion iosSdkVersion; private final DottedVersion iosMinimumOs; @@ -89,7 +96,9 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { @Nullable private final String xcodeToolchain; @Nullable private final Label defaultProvisioningProfileLabel; - AppleConfiguration(AppleCommandLineOptions appleOptions, + AppleConfiguration( + AppleCommandLineOptions appleOptions, + String cpu, @Nullable DottedVersion xcodeVersion, DottedVersion iosSdkVersion, DottedVersion watchosSdkVersion, @@ -113,7 +122,7 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { this.macosMinimumOs = Preconditions.checkNotNull(macosMinimumOs, "macOsMinimumOs"); this.xcodeVersion = xcodeVersion; - this.iosCpu = Preconditions.checkNotNull(appleOptions.iosCpu, "iosCpu"); + this.iosCpu = iosCpuFromCpu(cpu); this.appleSplitCpu = Preconditions.checkNotNull(appleOptions.appleSplitCpu, "appleSplitCpu"); this.applePlatformType = Preconditions.checkNotNull(appleOptions.applePlatformType, "applePlatformType"); @@ -137,6 +146,15 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { this.xcodeToolchain = appleOptions.xcodeToolchain; } + /** Determines cpu value from apple-specific toolchain identifier. */ + public static String iosCpuFromCpu(String cpu) { + if (cpu.startsWith(IOS_CPU_PREFIX)) { + return cpu.substring(IOS_CPU_PREFIX.length()); + } else { + return DEFAULT_IOS_CPU; + } + } + /** * 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 @@ -593,6 +611,7 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { public AppleConfiguration create(ConfigurationEnvironment env, BuildOptions buildOptions) throws InvalidConfigurationException, InterruptedException { AppleCommandLineOptions appleOptions = buildOptions.get(AppleCommandLineOptions.class); + String cpu = buildOptions.get(BuildConfiguration.Options.class).cpu; XcodeVersionProperties xcodeVersionProperties = getXcodeVersionProperties(env, appleOptions); DottedVersion iosSdkVersion = (appleOptions.iosSdkVersion != null) @@ -612,9 +631,17 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { DottedVersion macosMinimumOsVersion = (appleOptions.macosMinimumOs != null) ? appleOptions.macosMinimumOs : macosSdkVersion; AppleConfiguration configuration = - new AppleConfiguration(appleOptions, xcodeVersionProperties.getXcodeVersion().orNull(), - iosSdkVersion, watchosSdkVersion, watchosMinimumOsVersion, - tvosSdkVersion, tvosMinimumOsVersion, macosSdkVersion, macosMinimumOsVersion); + new AppleConfiguration( + appleOptions, + cpu, + xcodeVersionProperties.getXcodeVersion().orNull(), + iosSdkVersion, + watchosSdkVersion, + watchosMinimumOsVersion, + tvosSdkVersion, + tvosMinimumOsVersion, + macosSdkVersion, + macosMinimumOsVersion); validate(configuration); return configuration; diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolTransition.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolTransition.java index fc22d886d9..e563db5f9f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolTransition.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolTransition.java @@ -14,11 +14,13 @@ package com.google.devtools.build.lib.rules.objc; +import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.BuildOptions; import com.google.devtools.build.lib.analysis.config.PatchTransition; 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.Platform; import com.google.devtools.build.lib.rules.cpp.CppOptions; import com.google.devtools.build.lib.rules.objc.ObjcCommandLineOptions.ObjcCrosstoolMode; @@ -47,11 +49,13 @@ public class AppleCrosstoolTransition implements PatchTransition { return buildOptions; } - // TODO(b/29355778): Once ios_cpu is retired, introduce another top-level flag (perhaps - // --apple_cpu) for toolchain selection in top-level consuming rules. - String cpu = Platform.cpuStringForTarget( - buildOptions.get(AppleCommandLineOptions.class).applePlatformType, - buildOptions.get(AppleCommandLineOptions.class).getSingleArchitecture()); + AppleCommandLineOptions appleOptions = buildOptions.get(AppleCommandLineOptions.class); + BuildConfiguration.Options configOptions = buildOptions.get(BuildConfiguration.Options.class); + + String cpu = + Platform.cpuStringForTarget( + appleOptions.applePlatformType, + determineSingleArchitecture(appleOptions, configOptions)); setAppleCrosstoolTransitionConfiguration(buildOptions, result, cpu); return result; } @@ -92,4 +96,32 @@ public class AppleCrosstoolTransition implements PatchTransition { return (options.get(AppleCommandLineOptions.class).enableAppleCrosstoolTransition || options.get(ObjcCommandLineOptions.class).objcCrosstoolMode != ObjcCrosstoolMode.OFF); } + + /** + * Returns the Apple architecture implied by AppleCommandLineOptions and + * BuildConfiguration.Options + */ + private String determineSingleArchitecture( + AppleCommandLineOptions appleOptions, BuildConfiguration.Options configOptions) { + if (!Strings.isNullOrEmpty(appleOptions.appleSplitCpu)) { + return appleOptions.appleSplitCpu; + } + switch (appleOptions.applePlatformType) { + case IOS: + if (!appleOptions.iosMultiCpus.isEmpty()) { + return appleOptions.iosMultiCpus.get(0); + } else { + return AppleConfiguration.iosCpuFromCpu(configOptions.cpu); + } + case WATCHOS: + return appleOptions.watchosCpus.get(0); + case TVOS: + return appleOptions.tvosCpus.get(0); + case MACOS: + return appleOptions.macosCpus.get(0); + default: + throw new IllegalArgumentException( + "Unhandled platform type " + appleOptions.applePlatformType); + } + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java index 8c72933334..732f7bb3c5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java @@ -22,6 +22,7 @@ import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Options; import com.google.devtools.build.lib.analysis.config.BuildOptions; import com.google.devtools.build.lib.packages.Attribute.SplitTransition; import com.google.devtools.build.lib.packages.Attribute.SplitTransitionProvider; @@ -29,6 +30,7 @@ import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; 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; @@ -167,11 +169,15 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider case IOS: cpus = buildOptions.get(AppleCommandLineOptions.class).iosMultiCpus; if (cpus.isEmpty()) { - cpus = ImmutableList.of(buildOptions.get(AppleCommandLineOptions.class).iosCpu); + cpus = + ImmutableList.of( + AppleConfiguration.iosCpuFromCpu(buildOptions.get(Options.class).cpu)); } configurationDistinguisher = ConfigurationDistinguisher.APPLEBIN_IOS; - actualMinimumOsVersion = minimumOsVersion.isPresent() ? minimumOsVersion.get() - : buildOptions.get(AppleCommandLineOptions.class).iosMinimumOs; + actualMinimumOsVersion = + minimumOsVersion.isPresent() + ? minimumOsVersion.get() + : buildOptions.get(AppleCommandLineOptions.class).iosMinimumOs; break; case WATCHOS: cpus = buildOptions.get(AppleCommandLineOptions.class).watchosCpus; diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java index b5d7dacd89..468ac7528b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java @@ -44,6 +44,7 @@ import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.analysis.actions.SymlinkAction; import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction; import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction.Substitution; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Options; import com.google.devtools.build.lib.analysis.config.BuildOptions; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; @@ -1293,7 +1294,7 @@ public final class ReleaseBundlingSupport { ImmutableList.Builder<BuildOptions> splitBuildOptions = ImmutableList.builder(); for (String iosCpu : iosMultiCpus) { BuildOptions splitOptions = buildOptions.clone(); - setArchitectureOptions(splitOptions, buildOptions, iosCpu); + setIosArchitectureOptions(splitOptions, buildOptions, iosCpu); setAdditionalOptions(splitOptions, buildOptions); splitOptions.get(AppleCommandLineOptions.class).configurationDistinguisher = getConfigurationDistinguisher(); @@ -1321,10 +1322,11 @@ public final class ReleaseBundlingSupport { */ protected void setAdditionalOptions(BuildOptions splitOptions, BuildOptions originalOptions) {} - private static void setArchitectureOptions(BuildOptions splitOptions, - BuildOptions originalOptions, String iosCpu) { + private static void setIosArchitectureOptions( + BuildOptions splitOptions, BuildOptions originalOptions, String iosCpu) { splitOptions.get(AppleCommandLineOptions.class).applePlatformType = PlatformType.IOS; splitOptions.get(AppleCommandLineOptions.class).appleSplitCpu = iosCpu; + splitOptions.get(Options.class).cpu = AppleConfiguration.IOS_CPU_PREFIX + iosCpu; splitOptions.get(AppleCommandLineOptions.class).iosCpu = iosCpu; if (splitOptions.get(ObjcCommandLineOptions.class).enableCcDeps) { // Only set the (CC-compilation) CPU for dependencies if explicitly required by the user. diff --git a/src/test/shell/bazel/apple/bazel_apple_test.sh b/src/test/shell/bazel/apple/bazel_apple_test.sh index 703eabe990..5fbd18933a 100755 --- a/src/test/shell/bazel/apple/bazel_apple_test.sh +++ b/src/test/shell/bazel/apple/bazel_apple_test.sh @@ -389,11 +389,11 @@ EOF --ios_minimum_os=8.0 \ //ios:app_test >$TEST_log 2>&1 || fail "should build" - otool -lv bazel-bin/ios/app_test_bin \ + otool -lv bazel-out/ios_x86_64-fastbuild/bin/ios/app_test_bin \ | grep @executable_path/Frameworks -sq \ || fail "expected test binary to contain @executable_path in LC_RPATH" - otool -lv bazel-bin/ios/app_test_bin \ + otool -lv bazel-out/ios_x86_64-fastbuild/bin/ios/app_test_bin \ | grep @loader_path/Frameworks -sq \ || fail "expected test binary to contain @loader_path in LC_RPATH" @@ -766,8 +766,8 @@ EOF bazel build --verbose_failures --xcode_version=$XCODE_VERSION -s \ //ios:bin >$TEST_log 2>&1 || fail "should build" - expect_log "-Xlinker -add_ast_path -Xlinker bazel-out/darwin_x86_64-fastbuild/genfiles/ios/dep/_objs/ios_dep.swiftmodule" - expect_log "-Xlinker -add_ast_path -Xlinker bazel-out/darwin_x86_64-fastbuild/genfiles/ios/swift_lib/_objs/ios_swift_lib.swiftmodule" + expect_log "-Xlinker -add_ast_path -Xlinker bazel-out/ios_x86_64-fastbuild/genfiles/ios/dep/_objs/ios_dep.swiftmodule" + expect_log "-Xlinker -add_ast_path -Xlinker bazel-out/ios_x86_64-fastbuild/genfiles/ios/swift_lib/_objs/ios_swift_lib.swiftmodule" } function test_swiftc_script_mode() { diff --git a/src/test/shell/bazel/apple/bazel_objc_test.sh b/src/test/shell/bazel/apple/bazel_objc_test.sh index 65cdd02043..955562a492 100755 --- a/src/test/shell/bazel/apple/bazel_objc_test.sh +++ b/src/test/shell/bazel/apple/bazel_objc_test.sh @@ -117,7 +117,7 @@ function test_ios_test() { bazel build --test_output=all --ios_sdk_version=$IOS_SDK_VERSION \ --ios_minimum_os=8.0 \ //ios:PassingXcTest >$TEST_log 2>&1 || fail "should pass" - ls bazel-bin/ios/PassingXcTest.ipa \ + ls bazel-out/ios_x86_64-fastbuild/bin/ios/PassingXcTest.ipa \ || fail "should generate PassingXcTest.ipa" } |