aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTestRule.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelJ2ObjcLibraryRule.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java97
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java179
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java (renamed from src/main/java/com/google/devtools/build/lib/rules/objc/IosSdkCommands.java)108
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BundleMergeControlBytes.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java18
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java122
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalIosTestRule.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosApplicationRule.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinaryRule.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinaryRule.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkRule.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinaryRule.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibraryRule.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java62
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java103
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImportRule.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibraryRule.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcXcodeprojRule.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java27
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/XcodeSupport.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java10
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java2
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());
}