diff options
36 files changed, 508 insertions, 344 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java index c784a1e3f8..3b0b0988bf 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java @@ -76,6 +76,8 @@ import com.google.devtools.build.lib.rules.android.AndroidBinaryOnlyRule; import com.google.devtools.build.lib.rules.android.AndroidConfiguration; import com.google.devtools.build.lib.rules.android.AndroidLibraryBaseRule; import com.google.devtools.build.lib.rules.android.AndroidRuleClasses; +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.cpp.CcToolchainRule; import com.google.devtools.build.lib.rules.cpp.CcToolchainSuiteRule; import com.google.devtools.build.lib.rules.cpp.CppBuildInfo; @@ -216,6 +218,7 @@ public class BazelRuleClassProvider { PythonOptions.class, BazelPythonConfiguration.Options.class, ObjcCommandLineOptions.class, + AppleCommandLineOptions.class, J2ObjcCommandLineOptions.class, AndroidConfiguration.Options.class ); @@ -375,6 +378,7 @@ public class BazelRuleClassProvider { builder.addConfigurationFragment(new JvmConfigurationLoader(false, JAVA_CPU_SUPPLIER)); builder.addConfigurationFragment(new JavaConfigurationLoader()); builder.addConfigurationFragment(new ObjcConfigurationLoader()); + builder.addConfigurationFragment(new AppleConfiguration.Loader()); builder.addConfigurationFragment(new J2ObjcConfiguration.Loader()); builder.addConfigurationFragment(new AndroidConfiguration.Loader()); } diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTestRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTestRule.java index d4b2f318b0..01c5b07d7e 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTestRule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTestRule.java @@ -32,6 +32,7 @@ import com.google.devtools.build.lib.packages.ImplicitOutputsFunction; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.java.J2ObjcConfiguration; import com.google.devtools.build.lib.rules.objc.ExperimentalIosTest; import com.google.devtools.build.lib.rules.objc.IosTest; @@ -50,7 +51,8 @@ public final class BazelIosTestRule implements RuleDefinition { @Override public RuleClass build(RuleClass.Builder builder, final RuleDefinitionEnvironment env) { return builder - .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class) + .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class, + AppleConfiguration.class) /*<!-- #BLAZE_RULE(ios_test).IMPLICIT_OUTPUTS --> <ul> <li><code><var>name</var>.ipa</code>: the test bundle as an diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelJ2ObjcLibraryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelJ2ObjcLibraryRule.java index 711e5436ae..f4e83b2d65 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelJ2ObjcLibraryRule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelJ2ObjcLibraryRule.java @@ -21,6 +21,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.java.J2ObjcConfiguration; import com.google.devtools.build.lib.rules.objc.J2ObjcAspect; import com.google.devtools.build.lib.rules.objc.J2ObjcLibrary; @@ -35,7 +36,8 @@ public class BazelJ2ObjcLibraryRule implements RuleDefinition { @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment env) { return builder - .requiresConfigurationFragments(J2ObjcConfiguration.class, ObjcConfiguration.class) + .requiresConfigurationFragments(J2ObjcConfiguration.class, ObjcConfiguration.class, + AppleConfiguration.class) /* <!-- #BLAZE_RULE(j2objc_library).ATTRIBUTE(deps) --> A list of <code>j2objc_library</code>, <code>java_library</code> and <code>java_import</code> targets that contain 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 new file mode 100644 index 0000000000..e53f335a61 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java @@ -0,0 +1,97 @@ +// Copyright 2015 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.rules.apple; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.Multimap; +import com.google.devtools.build.lib.Constants; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration.DefaultLabelConverter; +import com.google.devtools.build.lib.analysis.config.FragmentOptions; +import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.common.options.Converters.CommaSeparatedOptionListConverter; +import com.google.devtools.common.options.Option; + +import java.util.List; + +/** + * Command-line options for building for Apple platforms. + */ +public class AppleCommandLineOptions extends FragmentOptions { + + // TODO(bazel-team): Validate version flag value. + @Option(name = "xcode_version", + defaultValue = "", + category = "undocumented", + help = "If specified, uses xcode of the given version for relevant build actions. " + + "If unspecified, uses the executor default version of xcode." + ) + public String xcodeVersion; + + // TODO(bazel-team): Validate version flag value. + @Option(name = "ios_sdk_version", + // TODO(bazel-team): Make this flag optional, and infer SDKROOT based on executor default. + defaultValue = DEFAULT_IOS_SDK_VERSION, + category = "build", + help = "Specifies the version of the iOS SDK to use to build iOS applications." + ) + public String iosSdkVersion; + + @VisibleForTesting public static final String DEFAULT_IOS_SDK_VERSION = "8.4"; + + @Option(name = "ios_cpu", + defaultValue = DEFAULT_IOS_CPU, + category = "build", + help = "Specifies to target CPU of iOS compilation.") + public String iosCpu; + + @Option(name = "ios_multi_cpus", + converter = CommaSeparatedOptionListConverter.class, + defaultValue = "", + category = "flags", + help = "Comma-separated list of architectures to build an ios_application with. The result " + + "is a universal binary containing all specified architectures.") + public List<String> iosMultiCpus; + + @VisibleForTesting static final String DEFAULT_IOS_CPU = "x86_64"; + + @Option(name = "default_ios_provisiong_profile", + defaultValue = "", + category = "undocumented", + converter = DefaultProvisioningProfileConverter.class) + public Label defaultProvisioningProfile; + + /** Converter for --default_ios_provisioning_profile. */ + public static class DefaultProvisioningProfileConverter extends DefaultLabelConverter { + public DefaultProvisioningProfileConverter() { + super(Constants.TOOLS_REPOSITORY + "//tools/objc:default_provisioning_profile"); + } + } + + private Platform getPlatform() { + for (String architecture : iosMultiCpus) { + if (Platform.forArch(architecture) == Platform.IOS_DEVICE) { + return Platform.IOS_DEVICE; + } + } + return Platform.forArch(iosCpu); + } + + @Override + public void addAllLabels(Multimap<String, Label> labelMap) { + if (getPlatform() == Platform.IOS_DEVICE) { + labelMap.put("default_provisioning_profile", defaultProvisioningProfile); + } + } +}
\ No newline at end of file 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 new file mode 100644 index 0000000000..e7dbcbfa6b --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java @@ -0,0 +1,179 @@ +// Copyright 2015 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.rules.apple; + +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +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.ConfigurationEnvironment; +import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory; +import com.google.devtools.build.lib.analysis.config.FragmentOptions; +import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException; +import com.google.devtools.build.lib.cmdline.Label; + +import java.util.List; +import java.util.Map; + +import javax.annotation.Nullable; + +/** + * A configuration containing flags required for Apple platforms and tools. + */ +public class AppleConfiguration extends BuildConfiguration.Fragment { + public static final String XCODE_VERSION_ENV_NAME = "XCODE_VERSION_OVERRIDE"; + /** + * Environment variable name for the apple SDK version. If unset, uses the system default of the + * host for the platform in the value of {@link #APPLE_SDK_PLATFORM_ENV_NAME}. + **/ + public static final String APPLE_SDK_VERSION_ENV_NAME = "APPLE_SDK_VERSION_OVERRIDE"; + /** + * Environment variable name for the apple SDK platform. This should be set for all actions that + * require an apple SDK. The valid values consist of {@link Platform} names. + **/ + public static final String APPLE_SDK_PLATFORM_ENV_NAME = "APPLE_SDK_PLATFORM"; + + private final String iosSdkVersion; + private final String iosCpu; + private final Optional<String> xcodeVersionOverride; + private final List<String> iosMultiCpus; + @Nullable private final Label defaultProvisioningProfileLabel; + + AppleConfiguration(AppleCommandLineOptions appleOptions) { + this.iosSdkVersion = Preconditions.checkNotNull(appleOptions.iosSdkVersion, "iosSdkVersion"); + String xcodeVersionFlag = Preconditions.checkNotNull(appleOptions.xcodeVersion, "xcodeVersion"); + this.xcodeVersionOverride = + xcodeVersionFlag.isEmpty() ? Optional.<String>absent() : Optional.of(xcodeVersionFlag); + this.iosCpu = Preconditions.checkNotNull(appleOptions.iosCpu, "iosCpu"); + this.iosMultiCpus = Preconditions.checkNotNull(appleOptions.iosMultiCpus, "iosMultiCpus"); + this.defaultProvisioningProfileLabel = appleOptions.defaultProvisioningProfile; + } + + /** + * Returns the SDK version for ios SDKs (whether they be for simulator or device). This is + * directly derived from --ios_sdk_version. Format "x.y" (for example, "6.4"). + */ + public String getIosSdkVersion() { + return iosSdkVersion; + } + + /** + * Returns the value of the xcode version override build flag, if specified. This is directly + * derived from --xcode_version_override. Format "x(.y)(.z)" (for example, "7", or "6.4", + * or "7.0.1"). + */ + public Optional<String> getXcodeVersionOverride() { + return xcodeVersionOverride; + } + + /** + * Returns a map of environment variables (derived from configuration) that should be propagated + * for actions pertaining to building ios applications. Keys are variable names and values are + * their corresponding values. + */ + // TODO(bazel-team): Repurpose for non-ios platforms. + public Map<String, String> getEnvironmentForIosAction() { + ImmutableMap.Builder<String, String> builder = ImmutableMap.builder(); + if (xcodeVersionOverride.isPresent()) { + builder.put(XCODE_VERSION_ENV_NAME, xcodeVersionOverride.get()); + } + builder.put(APPLE_SDK_VERSION_ENV_NAME, iosSdkVersion); + builder.put(APPLE_SDK_PLATFORM_ENV_NAME, Platform.forArch(getIosCpu()).getNameInPlist()); + return builder.build(); + } + + public String getIosCpu() { + return iosCpu; + } + + /** + * Returns the platform of the configuration for the current bundle, based on configured + * architectures (for example, {@code i386} maps to {@link Platform#IOS_SIMULATOR}). + * + * <p>If {@link #getIosMultiCpus()} is set, returns {@link Platform#IOS_DEVICE} if any of the + * architectures matches it, otherwise returns the mapping for {@link #getIosCpu()}. + * + * <p>Note that this method should not be used to determine the platform for code compilation. + * Derive the platform from {@link #getIosCpu()} instead. + */ + // TODO(bazel-team): This method should be enabled to return multiple values once all call sites + // (in particular actool, bundlemerge, momc) have been upgraded to support multiple values. + public Platform getBundlingPlatform() { + for (String architecture : getIosMultiCpus()) { + if (Platform.forArch(architecture) == Platform.IOS_DEVICE) { + return Platform.IOS_DEVICE; + } + } + return Platform.forArch(getIosCpu()); + } + + /** + * Returns the architecture for which we keep dependencies that should be present only once (in a + * single architecture). + * + * <p>When building with multiple architectures there are some dependencies we want to avoid + * duplicating: they would show up more than once in the same location in the final application + * bundle which is illegal. Instead we pick one architecture for which to keep all dependencies + * and discard any others. + */ + public String getDependencySingleArchitecture() { + if (!getIosMultiCpus().isEmpty()) { + return getIosMultiCpus().get(0); + } + return getIosCpu(); + } + + /** + * List of all CPUs that this invocation is being built for. Different from {@link #getIosCpu()} + * which is the specific CPU <b>this target</b> is being built for. + */ + public List<String> getIosMultiCpus() { + return iosMultiCpus; + } + + /** + * Returns the label of the default provisioning profile to use when bundling/signing an ios + * application. Returns null if the target platform is not an iOS device (for example, if + * iOS simulator is being targeted). + */ + @Nullable public Label getDefaultProvisioningProfileLabel() { + return defaultProvisioningProfileLabel; + } + + /** + * Loads {@link AppleConfiguration} from build options. + */ + public static class Loader implements ConfigurationFragmentFactory { + @Override + public AppleConfiguration create(ConfigurationEnvironment env, BuildOptions buildOptions) + throws InvalidConfigurationException { + AppleCommandLineOptions appleOptions = buildOptions.get(AppleCommandLineOptions.class); + + return new AppleConfiguration(appleOptions); + } + + @Override + public Class<? extends BuildConfiguration.Fragment> creates() { + return AppleConfiguration.class; + } + + @Override + public ImmutableSet<Class<? extends FragmentOptions>> requiredOptions() { + return ImmutableSet.<Class<? extends FragmentOptions>>of(AppleCommandLineOptions.class); + } + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosSdkCommands.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java index 2773894868..0c6fcfc484 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosSdkCommands.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java @@ -12,39 +12,28 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.devtools.build.lib.rules.objc; +package com.google.devtools.build.lib.rules.apple; -import static com.google.devtools.build.lib.rules.objc.ObjcProvider.FRAMEWORK_DIR; - -import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; -import com.google.devtools.build.lib.rules.apple.Platform; -import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos.XcodeprojBuildSetting; -import java.util.List; - /** - * Utility code for use when generating iOS SDK commands. + * Utility class for resolving items for the Apple toolchain (such as common tool flags, and paths). */ -public class IosSdkCommands { - +public class AppleToolchain { // These next two strings are shared secrets with the xcrunwrapper.sh to allow // expansion of DeveloperDir and SDKRoot and runtime, since they aren't known // until compile time on any given build machine. private static final String DEVELOPER_DIR = "__BAZEL_XCODE_DEVELOPER_DIR__"; private static final String SDKROOT_DIR = "__BAZEL_XCODE_SDKROOT__"; - + // There is a handy reference to many clang warning flags at // http://nshipster.com/clang-diagnostics/ // There is also a useful narrative for many Xcode settings at // http://www.xs-labs.com/en/blog/2011/02/04/xcode-build-settings/ - @VisibleForTesting - static final ImmutableMap<String, String> DEFAULT_WARNINGS = + public static final ImmutableMap<String, String> DEFAULT_WARNINGS = new ImmutableMap.Builder<String, String>() .put("GCC_WARN_64_TO_32_BIT_CONVERSION", "-Wshorten-64-to-32") .put("CLANG_WARN_BOOL_CONVERSION", "-Wbool-conversion") @@ -62,11 +51,7 @@ public class IosSdkCommands { .put("GCC_WARN_UNUSED_VARIABLE", "-Wunused-variable") .build(); - static final ImmutableList<String> DEFAULT_COMPILER_FLAGS = ImmutableList.of("-DOS_IOS"); - - static final ImmutableList<String> DEFAULT_LINKER_FLAGS = ImmutableList.of("-ObjC"); - - private IosSdkCommands() { + private AppleToolchain() { throw new UnsupportedOperationException("static-only"); } @@ -74,14 +59,15 @@ public class IosSdkCommands { * Returns the platform plist name (for example, iPhoneSimulator) for the platform corresponding * to the value of {@code --ios_cpu} in the given configuration. */ - public static String getPlatformPlistName(ObjcConfiguration configuration) { + // TODO(bazel-team): Support non-ios platforms. + public static String getPlatformPlistName(AppleConfiguration configuration) { return Platform.forArch(configuration.getIosCpu()).getNameInPlist(); } /** * Returns the platform directory inside of Xcode for a given configuration. */ - public static String platformDir(ObjcConfiguration configuration) { + public static String platformDir(AppleConfiguration configuration) { return platformDir(getPlatformPlistName(configuration)); } @@ -102,7 +88,7 @@ public class IosSdkCommands { /** * Returns the platform frameworks directory inside of Xcode for a given configuration. */ - public static String platformDeveloperFrameworkDir(ObjcConfiguration configuration) { + public static String platformDeveloperFrameworkDir(AppleConfiguration configuration) { return platformDir(configuration) + "/Developer/Library/Frameworks"; } @@ -116,7 +102,7 @@ public class IosSdkCommands { /** * Returns swift libraries path. */ - public static String swiftLibDir(ObjcConfiguration configuration) { + public static String swiftLibDir(AppleConfiguration configuration) { return DEVELOPER_DIR + "/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/" + swiftPlatform(configuration); } @@ -124,79 +110,15 @@ public class IosSdkCommands { /** * Returns a platform name string suitable for use in Swift tools. */ - public static String swiftPlatform(ObjcConfiguration configuration) { + public static String swiftPlatform(AppleConfiguration configuration) { return getPlatformPlistName(configuration).toLowerCase(); } /** - * Returns the target string for swift compiler. For example, "x86_64-apple-ios8.2" + * Returns a series of xcode build settings which configure compilation warnings to + * "recommended settings". Without these settings, compilation might result in some spurious + * warnings, and xcode would complain that the settings be changed to these values. */ - public static String swiftTarget(ObjcConfiguration configuration) { - return configuration.getIosCpu() + "-apple-" + "ios" + configuration.getIosSdkVersion(); - } - - private static Iterable<PathFragment> uniqueParentDirectories(Iterable<PathFragment> paths) { - ImmutableSet.Builder<PathFragment> parents = new ImmutableSet.Builder<>(); - for (PathFragment path : paths) { - parents.add(path.getParentDirectory()); - } - return parents.build(); - } - - public static List<String> commonLinkAndCompileFlagsForClang( - ObjcProvider provider, ObjcConfiguration configuration) { - ImmutableList.Builder<String> builder = new ImmutableList.Builder<>(); - if (Platform.forArch(configuration.getIosCpu()) == Platform.IOS_SIMULATOR) { - builder.add("-mios-simulator-version-min=" + configuration.getMinimumOs()); - } else { - builder.add("-miphoneos-version-min=" + configuration.getMinimumOs()); - } - - if (configuration.generateDebugSymbols()) { - builder.add("-g"); - } - - return builder - .add("-arch", configuration.getIosCpu()) - .add("-isysroot", sdkDir()) - // TODO(bazel-team): Pass framework search paths to Xcodegen. - .add("-F", sdkDeveloperFrameworkDir()) - // As of sdk8.1, XCTest is in a base Framework dir - .add("-F", platformDeveloperFrameworkDir(configuration)) - // Add custom (non-SDK) framework search paths. For each framework foo/bar.framework, - // include "foo" as a search path. - .addAll(Interspersing.beforeEach( - "-F", - PathFragment.safePathStrings(uniqueParentDirectories(provider.get(FRAMEWORK_DIR))))) - .build(); - } - - public static Iterable<String> compileFlagsForClang(ObjcConfiguration configuration) { - return Iterables.concat( - DEFAULT_WARNINGS.values(), - platformSpecificCompileFlagsForClang(configuration), - DEFAULT_COMPILER_FLAGS - ); - } - - private static List<String> platformSpecificCompileFlagsForClang( - ObjcConfiguration configuration) { - switch (Platform.forArch(configuration.getIosCpu())) { - case IOS_DEVICE: - return ImmutableList.of(); - case IOS_SIMULATOR: - // These are added by Xcode when building, because the simulator is built on OSX - // frameworks so we aim compile to match the OSX objc runtime. - return ImmutableList.of( - "-fexceptions", - "-fasm-blocks", - "-fobjc-abi-version=2", - "-fobjc-legacy-dispatch"); - default: - throw new AssertionError(); - } - } - public static Iterable<? extends XcodeprojBuildSetting> defaultWarningsForXcode() { return Iterables.transform(DEFAULT_WARNINGS.keySet(), new Function<String, XcodeprojBuildSetting>() { 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 7da8aa13b7..233d02a8c7 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 @@ -29,6 +29,7 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RunfilesSupport; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; 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; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider; import com.google.devtools.build.lib.rules.cpp.CppCompilationContext; @@ -115,6 +116,7 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory switch (hasReleaseBundlingSupport) { case YES: ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); + AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); // TODO(bazel-team): Remove once all bundle users are migrated to ios_application. ReleaseBundlingSupport releaseBundlingSupport = new ReleaseBundlingSupport( ruleContext, objcProvider, LinkedBinary.LOCAL_AND_DEPENDENCIES, @@ -127,7 +129,7 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory .validateAttributes(); xcTestAppProvider = Optional.of(releaseBundlingSupport.xcTestAppProvider()); - if (objcConfiguration.getBundlingPlatform() == Platform.IOS_SIMULATOR) { + if (appleConfiguration.getBundlingPlatform() == Platform.IOS_SIMULATOR) { Artifact runnerScript = intermediateArtifacts.runnerScript(); Artifact ipaFile = ruleContext.getImplicitOutputArtifact(ReleaseBundlingSupport.IPA); releaseBundlingSupport.registerGenerateRunnerScriptAction(runnerScript, ipaFile); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleMergeControlBytes.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleMergeControlBytes.java index 01a14e2f01..40a2fca040 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleMergeControlBytes.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleMergeControlBytes.java @@ -18,6 +18,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; import com.google.common.io.ByteSource; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.xcode.bundlemerge.proto.BundleMergeProtos; import com.google.devtools.build.xcode.bundlemerge.proto.BundleMergeProtos.Control; import com.google.devtools.build.xcode.bundlemerge.proto.BundleMergeProtos.MergeZip; @@ -36,15 +37,15 @@ import java.util.Map; final class BundleMergeControlBytes extends ByteSource { private final Bundling rootBundling; private final Artifact mergedIpa; - private final ObjcConfiguration objcConfiguration; + private final AppleConfiguration appleConfiguration; private final ImmutableSet<TargetDeviceFamily> families; public BundleMergeControlBytes( - Bundling rootBundling, Artifact mergedIpa, ObjcConfiguration objcConfiguration, + Bundling rootBundling, Artifact mergedIpa, AppleConfiguration appleConfiguration, ImmutableSet<TargetDeviceFamily> families) { this.rootBundling = Preconditions.checkNotNull(rootBundling); this.mergedIpa = Preconditions.checkNotNull(mergedIpa); - this.objcConfiguration = Preconditions.checkNotNull(objcConfiguration); + this.appleConfiguration = Preconditions.checkNotNull(appleConfiguration); this.families = Preconditions.checkNotNull(families); } @@ -67,8 +68,8 @@ final class BundleMergeControlBytes extends ByteSource { .addAllSourcePlistFile(Artifact.toExecPaths(bundling.getBundleInfoplist().asSet())) // TODO(bazel-team): Add rule attribute for specifying targeted device family .setMinimumOsVersion(bundling.getMinimumOsVersion()) - .setSdkVersion(objcConfiguration.getIosSdkVersion()) - .setPlatform(objcConfiguration.getBundlingPlatform().name()) + .setSdkVersion(appleConfiguration.getIosSdkVersion()) + .setPlatform(appleConfiguration.getBundlingPlatform().name()) .setBundleRoot(bundling.getBundleDir()); for (Artifact mergeZip : bundling.getMergeZips()) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java index 42deaf2e23..362dc7106e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java @@ -31,6 +31,8 @@ import com.google.devtools.build.lib.analysis.actions.CommandLine; import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; +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.objc.TargetDeviceFamily.InvalidFamilyNameException; import com.google.devtools.build.lib.rules.objc.TargetDeviceFamily.RepeatedFamilyNameException; @@ -128,16 +130,16 @@ final class BundleSupport { } private void validatePlatform() { - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); + AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); Platform platform = null; - for (String architecture : objcConfiguration.getIosMultiCpus()) { + for (String architecture : appleConfiguration.getIosMultiCpus()) { if (platform == null) { platform = Platform.forArch(architecture); } else if (platform != Platform.forArch(architecture)) { ruleContext.ruleError( String.format("In builds which require bundling, --ios_multi_cpus does not currently " + "allow values for both simulator and device builds. Flag was %s", - objcConfiguration.getIosMultiCpus())); + appleConfiguration.getIosMultiCpus())); } } } @@ -257,7 +259,7 @@ final class BundleSupport { } private void registerMomczipActions(ObjcProvider objcProvider) { - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); + AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); IntermediateArtifacts intermediateArtifacts = ObjcRuleClasses.intermediateArtifacts(ruleContext); Iterable<Xcdatamodel> xcdatamodels = Xcdatamodels.xcdatamodels( @@ -277,10 +279,10 @@ final class BundleSupport { .setCommandLine(CustomCommandLine.builder() .addPath(outputZip.getExecPath()) .add(datamodel.archiveRootForMomczip()) - .add("-XD_MOMC_SDKROOT=" + IosSdkCommands.sdkDir()) + .add("-XD_MOMC_SDKROOT=" + AppleToolchain.sdkDir()) .add("-XD_MOMC_IOS_TARGET_VERSION=" + bundling.getMinimumOsVersion()) .add("-MOMC_PLATFORMS") - .add(objcConfiguration.getBundlingPlatform().getLowerCaseNameInPlist()) + .add(appleConfiguration.getBundlingPlatform().getLowerCaseNameInPlist()) .add("-XD_MOMC_TARGET_VERSION=10.6") .add(datamodel.getContainer().getSafePathString()) .build()) @@ -401,11 +403,11 @@ final class BundleSupport { private CommandLine actoolzipCommandLine(ObjcProvider provider, Artifact zipOutput, Artifact partialInfoPlist) { - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); + AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); CustomCommandLine.Builder commandLine = CustomCommandLine.builder() // The next three arguments are positional, i.e. they don't have flags before them. .addPath(zipOutput.getExecPath()) - .add("--platform").add(objcConfiguration.getBundlingPlatform().getLowerCaseNameInPlist()) + .add("--platform").add(appleConfiguration.getBundlingPlatform().getLowerCaseNameInPlist()) .addExecPath("--output-partial-info-plist", partialInfoPlist) .add("--minimum-deployment-target").add(bundling.getMinimumOsVersion()); 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 b48969568b..322e4e158a 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 @@ -15,7 +15,6 @@ package com.google.devtools.build.lib.rules.objc; import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.fromTemplates; -import static com.google.devtools.build.lib.rules.objc.J2ObjcSource.SourceType; import static com.google.devtools.build.lib.rules.objc.ObjcProvider.DEFINE; import static com.google.devtools.build.lib.rules.objc.ObjcProvider.FORCE_LOAD_LIBRARY; import static com.google.devtools.build.lib.rules.objc.ObjcProvider.FRAMEWORK_DIR; @@ -74,10 +73,14 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction; import com.google.devtools.build.lib.packages.TargetUtils; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; +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.cpp.CppModuleMap; import com.google.devtools.build.lib.rules.cpp.CppModuleMapAction; import com.google.devtools.build.lib.rules.cpp.LinkerInputs; import com.google.devtools.build.lib.rules.java.J2ObjcConfiguration; +import com.google.devtools.build.lib.rules.objc.J2ObjcSource.SourceType; import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes; import com.google.devtools.build.lib.rules.objc.XcodeProvider.Builder; import com.google.devtools.build.lib.rules.test.InstrumentedFilesCollector; @@ -182,6 +185,10 @@ public final class CompilationSupport { static final String FILE_IN_SRCS_AND_NON_ARC_SRCS_ERROR_FORMAT = "File '%s' is present in both srcs and non_arc_srcs which is forbidden."; + static final ImmutableList<String> DEFAULT_COMPILER_FLAGS = ImmutableList.of("-DOS_IOS"); + + static final ImmutableList<String> DEFAULT_LINKER_FLAGS = ImmutableList.of("-ObjC"); + /** * Returns information about the given rule's compilation artifacts. */ @@ -326,6 +333,7 @@ public final class CompilationSupport { Iterable<String> otherFlags, boolean isCodeCoverageEnabled) { ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); + AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); ImmutableList.Builder<String> coverageFlags = new ImmutableList.Builder<>(); ImmutableList.Builder<Artifact> gcnoFiles = new ImmutableList.Builder<>(); ImmutableList.Builder<Artifact> additionalInputs = new ImmutableList.Builder<>(); @@ -354,8 +362,8 @@ public final class CompilationSupport { Artifact dotdFile = intermediateArtifacts.dotdFile(sourceFile); commandLine - .add(IosSdkCommands.compileFlagsForClang(objcConfiguration)) - .add(IosSdkCommands.commonLinkAndCompileFlagsForClang(objcProvider, objcConfiguration)) + .add(compileFlagsForClang(appleConfiguration)) + .add(commonLinkAndCompileFlagsForClang(objcProvider, objcConfiguration, appleConfiguration)) .add(objcConfiguration.getCoptsForCompilationMode()) .addBeforeEachPath( "-iquote", ObjcCommon.userHeaderSearchPaths(ruleContext.getConfiguration())) @@ -433,6 +441,7 @@ public final class CompilationSupport { IntermediateArtifacts intermediateArtifacts, ObjcProvider objcProvider) { ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); + AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); // Compiling a single swift file requires knowledge of all of the other // swift files in the same module. The primary file ({@code sourceFile}) is @@ -451,8 +460,8 @@ public final class CompilationSupport { .add(SWIFT) .add("-frontend") .add("-emit-object") - .add("-target").add(IosSdkCommands.swiftTarget(objcConfiguration)) - .add("-sdk").add(IosSdkCommands.sdkDir()) + .add("-target").add(swiftTarget(appleConfiguration)) + .add("-sdk").add(AppleToolchain.sdkDir()) .add("-enable-objc-interop"); if (objcConfiguration.generateDebugSymbols()) { @@ -522,6 +531,7 @@ public final class CompilationSupport { CompilationArtifacts compilationArtifacts, ObjcProvider objcProvider) { ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); + AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); ImmutableList.Builder<Artifact> moduleFiles = new ImmutableList.Builder<>(); for (Artifact src : compilationArtifacts.getSrcs()) { @@ -534,8 +544,8 @@ public final class CompilationSupport { .add(SWIFT) .add("-frontend") .add("-emit-module") - .add("-sdk").add(IosSdkCommands.sdkDir()) - .add("-target").add(IosSdkCommands.swiftTarget(objcConfiguration)); + .add("-sdk").add(AppleToolchain.sdkDir()) + .add("-target").add(swiftTarget(appleConfiguration)); if (objcConfiguration.generateDebugSymbols()) { commandLine.add("-g"); @@ -583,7 +593,7 @@ public final class CompilationSupport { private void registerArchiveActions(IntermediateArtifacts intermediateArtifacts, ImmutableList.Builder<Artifact> objFiles, Artifact archive) { for (Action action : archiveActions(ruleContext, objFiles.build(), archive, - ObjcRuleClasses.objcConfiguration(ruleContext), + ruleContext.getFragment(AppleConfiguration.class), intermediateArtifacts.objList())) { ruleContext.registerAction(action); } @@ -593,7 +603,7 @@ public final class CompilationSupport { ActionConstructionContext context, Iterable<Artifact> objFiles, Artifact archive, - ObjcConfiguration objcConfiguration, + AppleConfiguration appleConfiguration, Artifact objList) { ImmutableList.Builder<Action> actions = new ImmutableList.Builder<>(); @@ -611,8 +621,8 @@ public final class CompilationSupport { .add(LIBTOOL) .add("-static") .add("-filelist").add(objList.getExecPathString()) - .add("-arch_only").add(objcConfiguration.getIosCpu()) - .add("-syslibroot").add(IosSdkCommands.sdkDir()) + .add("-arch_only").add(appleConfiguration.getIosCpu()) + .add("-syslibroot").add(AppleToolchain.sdkDir()) .add("-o").add(archive.getExecPathString()) .build()) .addInputs(objFiles) @@ -624,7 +634,7 @@ public final class CompilationSupport { } private void registerFullyLinkAction(ObjcProvider objcProvider) throws InterruptedException { - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); + AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); Artifact archive = ruleContext.getImplicitOutputArtifact(FULLY_LINKED_LIB); ImmutableList<Artifact> ccLibraries = ccLibraries(objcProvider); @@ -634,8 +644,8 @@ public final class CompilationSupport { .setCommandLine(new CustomCommandLine.Builder() .add(LIBTOOL) .add("-static") - .add("-arch_only").add(objcConfiguration.getIosCpu()) - .add("-syslibroot").add(IosSdkCommands.sdkDir()) + .add("-arch_only").add(appleConfiguration.getIosCpu()) + .add("-syslibroot").add(AppleToolchain.sdkDir()) .add("-o").add(archive.getExecPathString()) .addExecPaths(objcProvider.get(LIBRARY)) .addExecPaths(objcProvider.get(IMPORTED_LIBRARY)) @@ -831,6 +841,7 @@ public final class CompilationSupport { ObjcProvider objcProvider, Artifact linkedBinary, Optional<Artifact> dsymBundle, ImmutableList<Artifact> ccLibraries) { ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); + AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); CustomCommandLine.Builder commandLine = CustomCommandLine.builder() .addPath(xcrunwrapper(ruleContext).getExecutable().getExecPath()); @@ -851,13 +862,13 @@ public final class CompilationSupport { } commandLine - .add(IosSdkCommands.commonLinkAndCompileFlagsForClang(objcProvider, objcConfiguration)) + .add(commonLinkAndCompileFlagsForClang(objcProvider, objcConfiguration, appleConfiguration)) .add("-Xlinker") .add("-objc_abi_version") .add("-Xlinker") .add("2") .add("-fobjc-link-runtime") - .add(IosSdkCommands.DEFAULT_LINKER_FLAGS) + .add(DEFAULT_LINKER_FLAGS) .addBeforeEach("-framework", frameworkNames(objcProvider)) .addBeforeEach("-weak_framework", SdkFramework.names(objcProvider.get(WEAK_SDK_FRAMEWORK))) .addFormatEach("-l%s", libraryNames(objcProvider)) @@ -875,7 +886,7 @@ public final class CompilationSupport { } if (objcProvider.is(USES_SWIFT)) { - commandLine.add("-L").add(IosSdkCommands.swiftLibDir(objcConfiguration)); + commandLine.add("-L").add(AppleToolchain.swiftLibDir(appleConfiguration)); } if (objcProvider.is(USES_SWIFT) || objcProvider.is(USES_FRAMEWORKS)) { @@ -942,7 +953,8 @@ public final class CompilationSupport { * All framework names to pass to the linker using {@code -framework} flags. For a framework in * the directory foo/bar.framework, the name is "bar". Each framework is found without using the * full path by means of the framework search paths. The search paths are added by - * {@link IosSdkCommands#commonLinkAndCompileFlagsForClang(ObjcProvider, ObjcConfiguration)}). + * {@link #commonLinkAndCompileFlagsForClang(ObjcProvider, ObjcConfiguration, + * AppleConfiguration)}). * * <p>It's awful that we can't pass the full path to the framework and avoid framework search * paths, but this is imposed on us by clang. clang does not support passing the full path to the @@ -1270,4 +1282,78 @@ public final class CompilationSupport { } } } + + private static Iterable<PathFragment> uniqueParentDirectories(Iterable<PathFragment> paths) { + ImmutableSet.Builder<PathFragment> parents = new ImmutableSet.Builder<>(); + for (PathFragment path : paths) { + parents.add(path.getParentDirectory()); + } + return parents.build(); + } + + /** + * Returns the target string for swift compiler. For example, "x86_64-apple-ios8.2" + */ + @VisibleForTesting + static String swiftTarget(AppleConfiguration configuration) { + return configuration.getIosCpu() + "-apple-ios" + configuration.getIosSdkVersion(); + } + + /** + * Returns a list of clang flags used for all link and compile actions executed through clang. + */ + private static List<String> commonLinkAndCompileFlagsForClang( + ObjcProvider provider, ObjcConfiguration objcConfiguration, + AppleConfiguration appleConfiguration) { + ImmutableList.Builder<String> builder = new ImmutableList.Builder<>(); + if (Platform.forArch(appleConfiguration.getIosCpu()) == Platform.IOS_SIMULATOR) { + builder.add("-mios-simulator-version-min=" + objcConfiguration.getMinimumOs()); + } else { + builder.add("-miphoneos-version-min=" + objcConfiguration.getMinimumOs()); + } + + if (objcConfiguration.generateDebugSymbols()) { + builder.add("-g"); + } + + return builder + .add("-arch", appleConfiguration.getIosCpu()) + .add("-isysroot", AppleToolchain.sdkDir()) + // TODO(bazel-team): Pass framework search paths to Xcodegen. + .add("-F", AppleToolchain.sdkDeveloperFrameworkDir()) + // As of sdk8.1, XCTest is in a base Framework dir + .add("-F", AppleToolchain.platformDeveloperFrameworkDir(appleConfiguration)) + // Add custom (non-SDK) framework search paths. For each framework foo/bar.framework, + // include "foo" as a search path. + .addAll(Interspersing.beforeEach( + "-F", + PathFragment.safePathStrings(uniqueParentDirectories(provider.get(FRAMEWORK_DIR))))) + .build(); + } + + private static Iterable<String> compileFlagsForClang(AppleConfiguration configuration) { + return Iterables.concat( + AppleToolchain.DEFAULT_WARNINGS.values(), + platformSpecificCompileFlagsForClang(configuration), + DEFAULT_COMPILER_FLAGS + ); + } + + private static List<String> platformSpecificCompileFlagsForClang( + AppleConfiguration configuration) { + switch (Platform.forArch(configuration.getIosCpu())) { + case IOS_DEVICE: + return ImmutableList.of(); + case IOS_SIMULATOR: + // These are added by Xcode when building, because the simulator is built on OSX + // frameworks so we aim compile to match the OSX objc runtime. + return ImmutableList.of( + "-fexceptions", + "-fasm-blocks", + "-fobjc-abi-version=2", + "-fobjc-legacy-dispatch"); + default: + throw new AssertionError(); + } + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalIosTestRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalIosTestRule.java index e88a8db75b..cde6d5e4d2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalIosTestRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalIosTestRule.java @@ -32,6 +32,7 @@ import com.google.devtools.build.lib.packages.ImplicitOutputsFunction; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.java.J2ObjcConfiguration; import com.google.devtools.build.lib.util.FileType; @@ -48,7 +49,8 @@ public final class ExperimentalIosTestRule implements RuleDefinition { @Override public RuleClass build(RuleClass.Builder builder, final RuleDefinitionEnvironment env) { return builder - .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class) + .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class, + AppleConfiguration.class) /*<!-- #BLAZE_RULE(experimental_ios_test).IMPLICIT_OUTPUTS --> <ul> <li><code><var>name</var>.ipa</code>: the test bundle as an diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java index 13a46f4f51..260066d955 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java @@ -21,6 +21,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; 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.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.Platform; import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.SplitArchTransition; import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.SplitArchTransition.ConfigurationDistinguisher; @@ -52,8 +53,8 @@ public class IosApplication extends ReleaseBundlingTargetFactory { protected void configureTarget(RuleConfiguredTargetBuilder target, RuleContext ruleContext, ReleaseBundlingSupport releaseBundlingSupport) throws InterruptedException { // If this is an application built for the simulator, make it runnable. - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); - if (objcConfiguration.getBundlingPlatform() == Platform.IOS_SIMULATOR) { + AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); + if (appleConfiguration.getBundlingPlatform() == Platform.IOS_SIMULATOR) { Artifact runnerScript = ObjcRuleClasses.intermediateArtifacts(ruleContext).runnerScript(); Artifact ipaFile = ruleContext.getImplicitOutputArtifact(ReleaseBundlingSupport.IPA); releaseBundlingSupport.registerGenerateRunnerScriptAction(runnerScript, ipaFile); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplicationRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplicationRule.java index f25d457176..bf2b066692 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplicationRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplicationRule.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; /** * Rule definition for ios_application. @@ -36,7 +37,7 @@ public class IosApplicationRule implements RuleDefinition { @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment env) { return builder - .requiresConfigurationFragments(ObjcConfiguration.class) + .requiresConfigurationFragments(ObjcConfiguration.class, AppleConfiguration.class) /*<!-- #BLAZE_RULE(ios_application).IMPLICIT_OUTPUTS --> <ul> <li><code><var>name</var>.ipa</code>: the application bundle as an <code>.ipa</code> diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinaryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinaryRule.java index 5faf1a4d5a..b005527c99 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinaryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinaryRule.java @@ -19,6 +19,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.java.J2ObjcConfiguration; /** @@ -28,7 +29,8 @@ public class IosExtensionBinaryRule implements RuleDefinition { @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment env) { return builder - .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class) + .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class, + AppleConfiguration.class) /*<!-- #BLAZE_RULE(ios_extension_binary).IMPLICIT_OUTPUTS --> <ul> <li><code><var>name</var>.xcodeproj/project.pbxproj</code>: An Xcode project file which diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java index 7bdeb3e9c4..1d31757529 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java @@ -23,6 +23,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; /** * Rule definition for ios_extension. @@ -31,7 +32,7 @@ public class IosExtensionRule implements RuleDefinition { @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment env) { return builder - .requiresConfigurationFragments(ObjcConfiguration.class) + .requiresConfigurationFragments(ObjcConfiguration.class, AppleConfiguration.class) /*<!-- #BLAZE_RULE(ios_extension).IMPLICIT_OUTPUTS --> <ul> <li><code><var>name</var>.ipa</code>: the extension bundle as an <code>.ipa</code> diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinaryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinaryRule.java index a615232002..2402eea28f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinaryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinaryRule.java @@ -19,6 +19,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.java.J2ObjcConfiguration; /** @@ -29,7 +30,8 @@ public class IosFrameworkBinaryRule implements RuleDefinition { @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) { return builder - .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class) + .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class, + AppleConfiguration.class) /*<!-- #BLAZE_RULE(ios_framework_binary).IMPLICIT_OUTPUTS --> <ul> <li><code><var>name</var>.xcodeproj/project.pbxproj</code>: An Xcode project file which diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkRule.java index e409170a6f..9a32299db2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkRule.java @@ -24,6 +24,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; /** * Rule definition for ios_framework. @@ -33,7 +34,7 @@ public class IosFrameworkRule implements RuleDefinition { @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) { return builder - .requiresConfigurationFragments(ObjcConfiguration.class) + .requiresConfigurationFragments(ObjcConfiguration.class, AppleConfiguration.class) // TODO(blaze-team): IPA is not right here, should probably be just zipped framework bundle. .setImplicitOutputsFunction( ImplicitOutputsFunction.fromFunctions(ReleaseBundlingSupport.IPA, XcodeSupport.PBXPROJ)) 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 4f2a76a3c0..95102bdf9c 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 @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs; import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.LinkedBinary; import com.google.devtools.build.lib.syntax.Type; @@ -74,7 +75,7 @@ public abstract class IosTest implements RuleConfiguredTargetFactory { ruleContext.ruleError(REQUIRES_SOURCE_ERROR); } - if (!ObjcRuleClasses.objcConfiguration(ruleContext).getIosMultiCpus().isEmpty()) { + if (!ruleContext.getFragment(AppleConfiguration.class).getIosMultiCpus().isEmpty()) { ruleContext.ruleError(NO_MULTI_CPUS_ERROR); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinaryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinaryRule.java index deeb5aca5f..6d76874cc1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinaryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinaryRule.java @@ -26,6 +26,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.java.J2ObjcConfiguration; /** @@ -37,7 +38,8 @@ public class ObjcBinaryRule implements RuleDefinition { @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment env) { return builder - .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class) + .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class, + AppleConfiguration.class) /*<!-- #BLAZE_RULE(objc_binary).IMPLICIT_OUTPUTS --> <ul> <li><code><var>name</var>.ipa</code>: the application bundle as an <code>.ipa</code> 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 b442918511..1827df916e 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 @@ -23,6 +23,7 @@ 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.RuleConfiguredTargetFactory; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes; /** @@ -75,9 +76,10 @@ public class ObjcBundleLibrary implements RuleConfiguredTargetFactory { IntermediateArtifacts intermediateArtifacts = ObjcRuleClasses.intermediateArtifacts(ruleContext); ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); + AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); return new Bundling.Builder() .setName(ruleContext.getLabel().getName()) - .setArchitecture(objcConfiguration.getIosCpu()) + .setArchitecture(appleConfiguration.getIosCpu()) .setBundleDirFormat("%s.bundle") .setObjcProvider(common.getObjcProvider()) .addInfoplistInputFromRule(ruleContext) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibraryRule.java index 32c97207a4..30da08fc4d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibraryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibraryRule.java @@ -19,6 +19,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; /** * Rule definition for objc_bundle_library. @@ -27,7 +28,7 @@ public class ObjcBundleLibraryRule implements RuleDefinition { @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment env) { return builder - .requiresConfigurationFragments(ObjcConfiguration.class) + .requiresConfigurationFragments(ObjcConfiguration.class, AppleConfiguration.class) /*<!-- #BLAZE_RULE(objc_bundle_library).IMPLICIT_OUTPUTS --> <ul> <li><code><var>name</var>.xcodeproj/project.pbxproj</code>: An Xcode project file which 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 99619bfdfb..84fafc2b0d 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 @@ -23,7 +23,6 @@ import com.google.devtools.build.lib.analysis.config.BuildOptions; import com.google.devtools.build.lib.analysis.config.FragmentOptions; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.Attribute.SplitTransition; -import com.google.devtools.build.lib.rules.apple.Platform; import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.SplitArchTransition.ConfigurationDistinguisher; import com.google.devtools.common.options.Converters.CommaSeparatedOptionListConverter; import com.google.devtools.common.options.EnumConverter; @@ -42,33 +41,6 @@ public class ObjcCommandLineOptions extends FragmentOptions { } } - /** Converter for --default_ios_provisioning_profile. */ - public static class DefaultProvisioningProfileConverter extends DefaultLabelConverter { - public DefaultProvisioningProfileConverter() { - super(Constants.TOOLS_REPOSITORY + "//tools/objc:default_provisioning_profile"); - } - } - - // TODO(bazel-team): Validate version flag value. - @Option(name = "xcode_version", - defaultValue = "", - category = "undocumented", - help = "If specified, uses xcode of the given version for relevant build actions. " - + "If unspecified, uses the executor default version of xcode." - ) - public String xcodeVersion; - - // TODO(bazel-team): Validate version flag value. - @Option(name = "ios_sdk_version", - // TODO(bazel-team): Make this flag optional, and infer SDKROOT based on executor default. - defaultValue = DEFAULT_SDK_VERSION, - category = "build", - help = "Specifies the version of the iOS SDK to use to build iOS applications." - ) - public String iosSdkVersion; - - @VisibleForTesting static final String DEFAULT_SDK_VERSION = "8.4"; - @Option(name = "ios_simulator_version", defaultValue = "8.4", category = "run", @@ -85,12 +57,6 @@ public class ObjcCommandLineOptions extends FragmentOptions { + "on the machine the simulator will be run on.") public String iosSimulatorDevice; - @Option(name = "ios_cpu", - defaultValue = DEFAULT_IOS_CPU, - category = "build", - help = "Specifies to target CPU of iOS compilation.") - public String iosCpu; - @Option(name = "objc_generate_debug_symbols", defaultValue = "false", category = "flags", @@ -116,14 +82,6 @@ public class ObjcCommandLineOptions extends FragmentOptions { help = "Enable checking for memory leaks in ios_test targets.") public boolean runMemleaks; - @Option(name = "ios_multi_cpus", - converter = CommaSeparatedOptionListConverter.class, - defaultValue = "", - category = "flags", - help = "Comma-separated list of architectures to build an ios_application with. The result " - + "is a universal binary containing all specified architectures.") - public List<String> iosMultiCpus; - @Option(name = "ios_split_cpu", defaultValue = "", category = "undocumented", @@ -137,12 +95,6 @@ public class ObjcCommandLineOptions extends FragmentOptions { converter = DumpSymsConverter.class) public Label dumpSyms; - @Option(name = "default_ios_provisiong_profile", - defaultValue = "", - category = "undocumented", - converter = DefaultProvisioningProfileConverter.class) - public Label defaultProvisioningProfile; - @Option(name = "objc_per_proto_includes", defaultValue = "false", category = "undocumented", @@ -225,26 +177,12 @@ public class ObjcCommandLineOptions extends FragmentOptions { public String xcodeOverrideWorkspaceRoot; @VisibleForTesting static final String DEFAULT_MINIMUM_IOS = "7.0"; - @VisibleForTesting static final String DEFAULT_IOS_CPU = "x86_64"; @Override public void addAllLabels(Multimap<String, Label> labelMap) { if (generateDebugSymbols) { labelMap.put("dump_syms", dumpSyms); } - - if (getPlatform() == Platform.IOS_DEVICE) { - labelMap.put("default_provisioning_profile", defaultProvisioningProfile); - } - } - - private Platform getPlatform() { - for (String architecture : iosMultiCpus) { - if (Platform.forArch(architecture) == Platform.IOS_DEVICE) { - return Platform.IOS_DEVICE; - } - } - return Platform.forArch(iosCpu); } @Override 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 64e211b9a5..40ff15eaf4 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 @@ -62,6 +62,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.packages.BuildType; +import com.google.devtools.build.lib.rules.apple.AppleToolchain; import com.google.devtools.build.lib.rules.cpp.CcCommon; import com.google.devtools.build.lib.rules.cpp.CcLinkParams; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider; @@ -501,7 +502,7 @@ public final class ObjcCommon { CompilationAttributes attributes = compilationAttributes.get(); Iterable<PathFragment> sdkIncludes = Iterables.transform( Interspersing.prependEach( - IosSdkCommands.sdkDir() + "/usr/include/", + AppleToolchain.sdkDir() + "/usr/include/", PathFragment.safePathStrings(attributes.sdkIncludes())), TO_PATH_FRAGMENT); 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 57e901008f..c2e1eb0668 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 @@ -16,22 +16,18 @@ package com.google.devtools.build.lib.rules.objc; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Joiner; -import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.CompilationMode; import com.google.devtools.build.lib.cmdline.Label; -import com.google.devtools.build.lib.rules.apple.Platform; import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.SplitArchTransition.ConfigurationDistinguisher; import com.google.devtools.build.lib.vfs.Path; import java.util.ArrayList; import java.util.List; import java.util.Locale; -import java.util.Map; import javax.annotation.Nullable; @@ -49,29 +45,13 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment { ImmutableList.of( "-Os", "-DNDEBUG=1", "-Wno-unused-variable", "-Winit-self", "-Wno-extra"); - private static final String XCODE_VERSION_ENV_NAME = "XCODE_VERSION_OVERRIDE"; - /** - * Environment variable name for the apple SDK version. If unset, uses the system default of the - * host for the platform in the value of {@link #APPLE_SDK_PLATFORM_ENV_NAME}. - **/ - public static final String APPLE_SDK_VERSION_ENV_NAME = "APPLE_SDK_VERSION_OVERRIDE"; - /** - * Environment variable name for the apple SDK platform. This should be set for all actions that - * require an apple SDK. The valid values consist of {@link Platform} names. - **/ - public static final String APPLE_SDK_PLATFORM_ENV_NAME = "APPLE_SDK_PLATFORM"; - - private final String iosSdkVersion; private final String iosMinimumOs; private final String iosSimulatorVersion; private final String iosSimulatorDevice; - private final String iosCpu; - private final Optional<String> xcodeVersionOverride; private final boolean generateDebugSymbols; private final boolean runMemleaks; private final List<String> copts; private final CompilationMode compilationMode; - private final List<String> iosMultiCpus; private final String iosSplitCpu; private final boolean perProtoIncludes; private final List<String> fastbuildOptions; @@ -92,20 +72,14 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment { @Nullable private final Label gcovLabel; @Nullable private final Label experimentalGcovLabel; @Nullable private final Label dumpSymsLabel; - @Nullable private final Label defaultProvisioningProfileLabel; ObjcConfiguration(ObjcCommandLineOptions objcOptions, BuildConfiguration.Options options, @Nullable BlazeDirectories directories) { - this.iosSdkVersion = Preconditions.checkNotNull(objcOptions.iosSdkVersion, "iosSdkVersion"); - String xcodeVersionFlag = Preconditions.checkNotNull(objcOptions.xcodeVersion, "xcodeVersion"); - this.xcodeVersionOverride = - xcodeVersionFlag.isEmpty() ? Optional.<String>absent() : Optional.of(xcodeVersionFlag); this.iosMinimumOs = Preconditions.checkNotNull(objcOptions.iosMinimumOs, "iosMinimumOs"); this.iosSimulatorDevice = Preconditions.checkNotNull(objcOptions.iosSimulatorDevice, "iosSimulatorDevice"); this.iosSimulatorVersion = Preconditions.checkNotNull(objcOptions.iosSimulatorVersion, "iosSimulatorVersion"); - this.iosCpu = Preconditions.checkNotNull(objcOptions.iosCpu, "iosCpu"); this.generateDebugSymbols = objcOptions.generateDebugSymbols; this.runMemleaks = objcOptions.runMemleaks; this.copts = ImmutableList.copyOf(objcOptions.copts); @@ -113,8 +87,6 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment { this.gcovLabel = options.objcGcovBinary; this.experimentalGcovLabel = options.experimentalObjcGcovBinary; this.dumpSymsLabel = objcOptions.dumpSyms; - this.defaultProvisioningProfileLabel = objcOptions.defaultProvisioningProfile; - this.iosMultiCpus = Preconditions.checkNotNull(objcOptions.iosMultiCpus, "iosMultiCpus"); this.iosSplitCpu = Preconditions.checkNotNull(objcOptions.iosSplitCpu, "iosSplitCpu"); this.perProtoIncludes = objcOptions.perProtoIncludes; this.fastbuildOptions = ImmutableList.copyOf(objcOptions.fastbuildOptions); @@ -127,24 +99,6 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment { this.useAbsolutePathsForActions = objcOptions.useAbsolutePathsForActions; } - public Map<String, String> getEnvironmentForDarwin() { - ImmutableMap.Builder<String, String> builder = ImmutableMap.builder(); - if (xcodeVersionOverride.isPresent()) { - builder.put(XCODE_VERSION_ENV_NAME, xcodeVersionOverride.get()); - } - builder.put(APPLE_SDK_VERSION_ENV_NAME, iosSdkVersion); - builder.put(APPLE_SDK_PLATFORM_ENV_NAME, IosSdkCommands.getPlatformPlistName(this)); - return builder.build(); - } - - public String getIosSdkVersion() { - return iosSdkVersion; - } - - public Optional<String> getXcodeVersionOverride() { - return xcodeVersionOverride; - } - /** * 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 @@ -165,31 +119,6 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment { return iosSimulatorVersion; } - public String getIosCpu() { - return iosCpu; - } - - /** - * Returns the platform of the configuration for the current bundle, based on configured - * architectures (for example, {@code i386} maps to {@link Platform#IOS_SIMULATOR}). - * - * <p>If {@link #getIosMultiCpus()} is set, returns {@link Platform#IOS_DEVICE} if any of the - * architectures matches it, otherwise returns the mapping for {@link #getIosCpu()}. - * - * <p>Note that this method should not be used to determine the platform for code compilation. - * Derive the platform from {@link #getIosCpu()} instead. - */ - // TODO(bazel-team): This method should be enabled to return multiple values once all call sites - // (in particular actool, bundlemerge, momc) have been upgraded to support multiple values. - public Platform getBundlingPlatform() { - for (String architecture : getIosMultiCpus()) { - if (Platform.forArch(architecture) == Platform.IOS_DEVICE) { - return Platform.IOS_DEVICE; - } - } - return Platform.forArch(getIosCpu()); - } - public boolean generateDebugSymbols() { return generateDebugSymbols; } @@ -254,38 +183,6 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment { } /** - * Returns the label of the default provisioning profile to use when bundling/signing the - * application. Null iff iOS CPU indicates a simulator is being targeted. - */ - @Nullable public Label getDefaultProvisioningProfileLabel() { - return defaultProvisioningProfileLabel; - } - - /** - * List of all CPUs that this invocation is being built for. Different from {@link #getIosCpu()} - * which is the specific CPU <b>this target</b> is being built for. - */ - public List<String> getIosMultiCpus() { - return iosMultiCpus; - } - - /** - * Returns the architecture for which we keep dependencies that should be present only once (in a - * single architecture). - * - * <p>When building with multiple architectures there are some dependencies we want to avoid - * duplicating: they would show up more than once in the same location in the final application - * bundle which is illegal. Instead we pick one architecture for which to keep all dependencies - * and discard any others. - */ - public String getDependencySingleArchitecture() { - if (!getIosMultiCpus().isEmpty()) { - return getIosMultiCpus().get(0); - } - return getIosCpu(); - } - - /** * Whether module map generation and interpretation is enabled. */ public boolean moduleMapsEnabled() { diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImportRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImportRule.java index f7bf503116..845b9e2ec1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImportRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImportRule.java @@ -22,6 +22,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.util.FileType; /** @@ -31,7 +32,8 @@ public class ObjcImportRule implements RuleDefinition { @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) { return builder - .requiresConfigurationFragments(ObjcConfiguration.class) + .requiresConfigurationFragments(ObjcConfiguration.class, AppleConfiguration.class, + AppleConfiguration.class) /*<!-- #BLAZE_RULE(objc_import).IMPLICIT_OUTPUTS --> <ul> <li><code><var>name</var>.xcodeproj/project.pbxproj</code>: An Xcode project file which diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java index c5e1573b3a..cda61a78f5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java @@ -20,6 +20,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; /** * Rule definition for objc_library. @@ -29,7 +30,7 @@ public class ObjcLibraryRule implements RuleDefinition { @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment env) { return builder - .requiresConfigurationFragments(ObjcConfiguration.class) + .requiresConfigurationFragments(ObjcConfiguration.class, AppleConfiguration.class) /*<!-- #BLAZE_RULE(objc_library).IMPLICIT_OUTPUTS --> <ul> <li><code><var>name</var>.xcodeproj/project.pbxproj</code>: An Xcode project file which diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibraryRule.java index a52f69084e..50dbd9133a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibraryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibraryRule.java @@ -28,6 +28,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.FileType; @@ -48,7 +49,7 @@ public class ObjcProtoLibraryRule implements RuleDefinition { @Override public RuleClass build(Builder builder, final RuleDefinitionEnvironment env) { return builder - .requiresConfigurationFragments(ObjcConfiguration.class) + .requiresConfigurationFragments(ObjcConfiguration.class, AppleConfiguration.class) /* <!-- #BLAZE_RULE(objc_proto_library).ATTRIBUTE(deps) --> The directly depended upon proto_library rules. ${SYNOPSIS} 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 7e296d8b73..38ac0235af 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 @@ -48,6 +48,7 @@ import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.Platform; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.FileType; @@ -156,9 +157,9 @@ public class ObjcRuleClasses { * Creates a new spawn action builder that requires a darwin architecture to run. */ static SpawnAction.Builder spawnOnDarwinActionBuilder(RuleContext ruleContext) { - ObjcConfiguration objcConfiguration = objcConfiguration(ruleContext); + AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); return new SpawnAction.Builder() - .setEnvironment(objcConfiguration.getEnvironmentForDarwin()) + .setEnvironment(appleConfiguration.getEnvironmentForIosAction()) .setExecutionInfo(ImmutableMap.of(ExecutionRequirements.REQUIRES_DARWIN, "")); } @@ -950,15 +951,15 @@ public class ObjcRuleClasses { .value(new LateBoundLabel<BuildConfiguration>(ObjcConfiguration.class) { @Override public Label getDefault(Rule rule, BuildConfiguration configuration) { - ObjcConfiguration objcConfiguration = - configuration.getFragment(ObjcConfiguration.class); - if (objcConfiguration.getBundlingPlatform() != Platform.IOS_DEVICE) { + AppleConfiguration appleConfiguration = + configuration.getFragment(AppleConfiguration.class); + if (appleConfiguration.getBundlingPlatform() != Platform.IOS_DEVICE) { return null; } if (rule.isAttributeValueExplicitlySpecified("provisioning_profile")) { return null; } - return objcConfiguration.getDefaultProvisioningProfileLabel(); + return appleConfiguration.getDefaultProvisioningProfileLabel(); } })) /* <!-- #BLAZE_RULE($objc_release_bundling_rule).ATTRIBUTE(app_icon) --> diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcXcodeprojRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcXcodeprojRule.java index 1a79c9e68f..9bfa81e276 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcXcodeprojRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcXcodeprojRule.java @@ -23,6 +23,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; /** * Rule definition for {@code objc_xcodeproj}. @@ -31,7 +32,7 @@ public class ObjcXcodeprojRule implements RuleDefinition { @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment env) { return builder - .requiresConfigurationFragments(ObjcConfiguration.class) + .requiresConfigurationFragments(ObjcConfiguration.class, AppleConfiguration.class) /*<!-- #BLAZE_RULE(objc_xcodeproj).IMPLICIT_OUTPUTS --> <ul> <li><code><var>name</var>.xcodeproj/project.pbxproj</code>: A combined Xcode project file 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 54d6d7c741..8a72812413 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 @@ -47,6 +47,9 @@ import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.packages.Attribute.SplitTransition; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction; +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.AppleToolchain; import com.google.devtools.build.lib.rules.apple.Platform; import com.google.devtools.build.lib.rules.objc.BundleSupport.ExtraActoolArgs; import com.google.devtools.build.lib.shell.ShellUtils; @@ -241,11 +244,11 @@ public final class ReleaseBundlingSupport { registerTransformAndCopyBreakpadFilesAction(); registerSwiftStdlibActionsIfNecessary(); - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); + AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); Artifact ipaOutput = ruleContext.getImplicitOutputArtifact(IPA); Artifact maybeSignedIpa; - if (objcConfiguration.getBundlingPlatform() == Platform.IOS_SIMULATOR) { + if (appleConfiguration.getBundlingPlatform() == Platform.IOS_SIMULATOR) { maybeSignedIpa = ipaOutput; } else if (attributes.provisioningProfile() == null) { throw new IllegalStateException(DEVICE_NO_PROVISIONING_PROFILE); @@ -257,7 +260,7 @@ public final class ReleaseBundlingSupport { registerEnvironmentPlistAction(); BundleMergeControlBytes bundleMergeControlBytes = new BundleMergeControlBytes( - bundling, maybeSignedIpa, objcConfiguration, bundleSupport.targetDeviceFamilies()); + bundling, maybeSignedIpa, appleConfiguration, bundleSupport.targetDeviceFamilies()); registerBundleMergeActions( maybeSignedIpa, bundling.getBundleContentArtifacts(), bundleMergeControlBytes); @@ -303,7 +306,7 @@ public final class ReleaseBundlingSupport { } private void registerEnvironmentPlistAction() { - ObjcConfiguration configuration = ObjcRuleClasses.objcConfiguration(ruleContext); + AppleConfiguration configuration = ruleContext.getFragment(AppleConfiguration.class); // Generates a .plist that contains environment values (such as the SDK used to build, the Xcode // version, etc), which are parsed from various .plist files of the OS, namely Xcodes' and // Platforms' plists. @@ -468,8 +471,8 @@ public final class ReleaseBundlingSupport { private Bundling bundling(RuleContext ruleContext, ObjcProvider objcProvider, String bundleDirFormat, String bundleName, String minimumOsVersion) { ImmutableList<BundleableFile> extraBundleFiles; - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); - if (objcConfiguration.getBundlingPlatform() == Platform.IOS_DEVICE) { + AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); + if (appleConfiguration.getBundlingPlatform() == Platform.IOS_DEVICE) { extraBundleFiles = ImmutableList.of(new BundleableFile( new Attributes(ruleContext).provisioningProfile(), PROVISIONING_PROFILE_BUNDLE_FILE)); @@ -489,7 +492,7 @@ public final class ReleaseBundlingSupport { return new Bundling.Builder() .setName(bundleName) // Architecture that determines which nested bundles are kept. - .setArchitecture(objcConfiguration.getDependencySingleArchitecture()) + .setArchitecture(appleConfiguration.getDependencySingleArchitecture()) .setBundleDirFormat(bundleDirFormat) .addExtraBundleFiles(extraBundleFiles) .setObjcProvider(objcProvider) @@ -749,11 +752,11 @@ public final class ReleaseBundlingSupport { return; } - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); + AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); CustomCommandLine.Builder commandLine = CustomCommandLine.builder() .addPath(intermediateArtifacts.swiftFrameworksFileZip().getExecPath()) - .add("--platform").add(IosSdkCommands.swiftPlatform(objcConfiguration)) + .add("--platform").add(AppleToolchain.swiftPlatform(appleConfiguration)) .addExecPath("--scan-executable", intermediateArtifacts.combinedArchitectureBinary()); ruleContext.registerAction( @@ -915,7 +918,7 @@ public final class ReleaseBundlingSupport { prerequisiteProvider.get(ObjcProvider.BREAKPAD_FILE), null); if (sourceBreakpad != null) { String cpu = - prerequisite.getConfiguration().getFragment(ObjcConfiguration.class).getIosCpu(); + prerequisite.getConfiguration().getFragment(AppleConfiguration.class).getIosCpu(); results.put(cpu, sourceBreakpad); } } @@ -939,7 +942,7 @@ public final class ReleaseBundlingSupport { @Override public final List<BuildOptions> split(BuildOptions buildOptions) { - List<String> iosMultiCpus = buildOptions.get(ObjcCommandLineOptions.class).iosMultiCpus; + List<String> iosMultiCpus = buildOptions.get(AppleCommandLineOptions.class).iosMultiCpus; if (iosMultiCpus.isEmpty()) { return defaultOptions(buildOptions); } @@ -977,7 +980,7 @@ public final class ReleaseBundlingSupport { private void setArchitectureOptions(BuildOptions splitOptions, String iosCpu) { splitOptions.get(ObjcCommandLineOptions.class).iosSplitCpu = iosCpu; - splitOptions.get(ObjcCommandLineOptions.class).iosCpu = 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. // This helps users of the iOS rules who do not depend on CC rules as these CPU values 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 5b481a2764..e0d03a7a83 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 @@ -21,6 +21,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.LinkedBinary; import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.SplitArchTransition.ConfigurationDistinguisher; import com.google.devtools.build.lib.rules.test.InstrumentedFilesCollector; @@ -78,7 +79,7 @@ public abstract class ReleaseBundlingTargetFactory implements RuleConfiguredTarg XcodeSupport xcodeSupport = new XcodeSupport(ruleContext) .addFilesToBuild(filesToBuild) .addXcodeSettings(xcodeProviderBuilder, common.getObjcProvider(), xcodeProductType, - ObjcRuleClasses.objcConfiguration(ruleContext).getDependencySingleArchitecture(), + ruleContext.getFragment(AppleConfiguration.class).getDependencySingleArchitecture(), configurationDistinguisher) .addDummySource(xcodeProviderBuilder); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java index acf7d156a8..bdcdf9a058 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java @@ -32,13 +32,13 @@ 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.collect.nestedset.NestedSet; 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.test.TestEnvironmentProvider; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.FileType; import java.util.List; import java.util.Map; -import java.util.TreeMap; import javax.annotation.Nullable; @@ -231,11 +231,11 @@ public class TestSupport { * builder. */ public Map<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> getExtraProviders() { - ObjcConfiguration configuration = ruleContext.getFragment(ObjcConfiguration.class); + AppleConfiguration configuration = ruleContext.getFragment(AppleConfiguration.class); ImmutableMap.Builder<String, String> envBuilder = ImmutableMap.builder(); - envBuilder.putAll(configuration.getEnvironmentForDarwin()); + envBuilder.putAll(configuration.getEnvironmentForIosAction()); if (ruleContext.getConfiguration().isCodeCoverageEnabled()) { envBuilder.put("COVERAGE_GCOV_PATH", diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java index 307e4fd334..c9d1a2a680 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java @@ -43,6 +43,7 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.rules.apple.AppleToolchain; import com.google.devtools.build.lib.rules.objc.ObjcProvider.Flag; import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.SplitArchTransition.ConfigurationDistinguisher; import com.google.devtools.build.lib.vfs.PathFragment; @@ -555,17 +556,17 @@ public final class XcodeProvider implements TransitiveInfoProvider { .addAllHeaderSearchPath(headerSearchPaths) .addAllSupportFile(Artifact.toExecPaths(headers)) .addAllCopt(compilationModeCopts) - .addAllCopt(IosSdkCommands.DEFAULT_COMPILER_FLAGS) + .addAllCopt(CompilationSupport.DEFAULT_COMPILER_FLAGS) .addAllCopt(Interspersing.prependEach("-D", objcProvider.get(DEFINE))) .addAllCopt(copts) .addAllLinkopt( Interspersing.beforeEach("-force_load", objcProvider.get(FORCE_LOAD_FOR_XCODEGEN))) - .addAllLinkopt(IosSdkCommands.DEFAULT_LINKER_FLAGS) + .addAllLinkopt(CompilationSupport.DEFAULT_LINKER_FLAGS) .addAllLinkopt( Interspersing.beforeEach( "-weak_framework", SdkFramework.names(objcProvider.get(WEAK_SDK_FRAMEWORK)))) .addAllBuildSetting(xcodeprojBuildSettings) - .addAllBuildSetting(IosSdkCommands.defaultWarningsForXcode()) + .addAllBuildSetting(AppleToolchain.defaultWarningsForXcode()) .addAllSdkFramework(SdkFramework.names(objcProvider.get(SDK_FRAMEWORK))) .addAllFramework(PathFragment.safePathStrings(objcProvider.get(FRAMEWORK_DIR))) .addAllXcassetsDir(PathFragment.safePathStrings(objcProvider.get(XCASSETS_DIR))) @@ -660,7 +661,7 @@ public final class XcodeProvider implements TransitiveInfoProvider { .clearDependency() .clearBuildSetting() .addAllBuildSetting(companionTargetXcodeprojBuildSettings) - .addAllBuildSetting(IosSdkCommands.defaultWarningsForXcode()) + .addAllBuildSetting(AppleToolchain.defaultWarningsForXcode()) .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 6e570a274e..20ac2cb7d2 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 @@ -27,10 +27,10 @@ import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.analysis.actions.SymlinkAction; 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.objc.ReleaseBundlingSupport.SplitArchTransition.ConfigurationDistinguisher; 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.lib.vfs.Path; import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos; import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos.XcodeprojBuildSetting; @@ -127,8 +127,9 @@ public final class XcodeSupport { XcodeSupport addXcodeSettings(XcodeProvider.Builder xcodeProviderBuilder, ObjcProvider objcProvider, XcodeProductType productType) { ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); + AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); return addXcodeSettings(xcodeProviderBuilder, objcProvider, productType, - objcConfiguration.getIosCpu(), objcConfiguration.getConfigurationDistinguisher()); + appleConfiguration.getIosCpu(), objcConfiguration.getConfigurationDistinguisher()); } /** @@ -228,6 +229,7 @@ public final class XcodeSupport { throws InterruptedException { final Artifact pbxproj = ruleContext.getImplicitOutputArtifact(XcodeSupport.PBXPROJ); final ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); + final AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); return new ByteSource() { @Override public InputStream openStream() { @@ -237,9 +239,9 @@ public final class XcodeSupport { builder.setWorkspaceRoot(workspaceRoot); } - List<String> multiCpus = objcConfiguration.getIosMultiCpus(); + List<String> multiCpus = appleConfiguration.getIosMultiCpus(); if (multiCpus.isEmpty()) { - builder.addCpuArchitecture(objcConfiguration.getIosCpu()); + builder.addCpuArchitecture(appleConfiguration.getIosCpu()); } else { builder.addAllCpuArchitecture(multiCpus); } diff --git a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java index ebca7dfb0a..20be1d9226 100644 --- a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java +++ b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java @@ -22,7 +22,7 @@ import com.google.devtools.build.lib.actions.Spawn; import com.google.devtools.build.lib.actions.SpawnActionContext; import com.google.devtools.build.lib.actions.UserExecException; import com.google.devtools.build.lib.cmdline.Label; -import com.google.devtools.build.lib.rules.objc.ObjcConfiguration; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.shell.AbnormalTerminationException; import com.google.devtools.build.lib.shell.Command; import com.google.devtools.build.lib.shell.CommandException; @@ -152,13 +152,13 @@ public class StandaloneSpawnStrategy implements SpawnActionContext { throws UserExecException { ImmutableMap.Builder<String, String> newEnvBuilder = ImmutableMap.builder(); newEnvBuilder.putAll(env); - if (env.containsKey(ObjcConfiguration.APPLE_SDK_VERSION_ENV_NAME)) { + if (env.containsKey(AppleConfiguration.APPLE_SDK_VERSION_ENV_NAME)) { // The Apple platform is needed to select the appropriate SDK. - if (!env.containsKey(ObjcConfiguration.APPLE_SDK_PLATFORM_ENV_NAME)) { + if (!env.containsKey(AppleConfiguration.APPLE_SDK_PLATFORM_ENV_NAME)) { throw new UserExecException("Could not resolve apple platform for determining SDK"); } - String iosSdkVersion = env.get(ObjcConfiguration.APPLE_SDK_VERSION_ENV_NAME); - String appleSdkPlatform = env.get(ObjcConfiguration.APPLE_SDK_PLATFORM_ENV_NAME); + String iosSdkVersion = env.get(AppleConfiguration.APPLE_SDK_VERSION_ENV_NAME); + String appleSdkPlatform = env.get(AppleConfiguration.APPLE_SDK_PLATFORM_ENV_NAME); // TODO(bazel-team): Determine and set DEVELOPER_DIR. addSdkRootEnv(newEnvBuilder, iosSdkVersion, appleSdkPlatform); } diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java index 449f39960a..b8e0642161 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.packages.Attribute; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.util.MockToolsConfig; import com.google.devtools.build.lib.rules.android.AndroidConfiguration; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.cpp.CppConfigurationLoader; import com.google.devtools.build.lib.rules.java.J2ObjcConfiguration; import com.google.devtools.build.lib.rules.java.JavaConfigurationLoader; @@ -220,6 +221,7 @@ public class BazelAnalysisMock extends AnalysisMock { new JvmConfigurationLoader(false, BazelRuleClassProvider.JAVA_CPU_SUPPLIER), new JavaConfigurationLoader(), new ObjcConfigurationLoader(), + new AppleConfiguration.Loader(), new J2ObjcConfiguration.Loader(), new AndroidConfiguration.Loader()); } |