aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/objc/IosSdkCommands.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/objc/IosSdkCommands.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosSdkCommands.java155
1 files changed, 155 insertions, 0 deletions
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/objc/IosSdkCommands.java
new file mode 100644
index 0000000000..0a9fb7b6a6
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosSdkCommands.java
@@ -0,0 +1,155 @@
+// Copyright 2014 Google Inc. 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.objc;
+
+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.vfs.PathFragment;
+import com.google.devtools.build.xcode.common.Platform;
+import com.google.devtools.build.xcode.util.Interspersing;
+import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos.XcodeprojBuildSetting;
+
+import java.util.List;
+
+/**
+ * Utility code for use when generating iOS SDK commands.
+ */
+public class IosSdkCommands {
+ public static final String DEVELOPER_DIR = "/Applications/Xcode.app/Contents/Developer";
+ public static final String BIN_DIR =
+ DEVELOPER_DIR + "/Toolchains/XcodeDefault.xctoolchain/usr/bin";
+ public static final String ACTOOL_PATH = DEVELOPER_DIR + "/usr/bin/actool";
+ public static final String IBTOOL_PATH = DEVELOPER_DIR + "/usr/bin/ibtool";
+ public static final String MOMC_PATH = DEVELOPER_DIR + "/usr/bin/momc";
+
+ // 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 =
+ new ImmutableMap.Builder<String, String>()
+ .put("GCC_WARN_64_TO_32_BIT_CONVERSION", "-Wshorten-64-to-32")
+ .put("CLANG_WARN_BOOL_CONVERSION", "-Wbool-conversion")
+ .put("CLANG_WARN_CONSTANT_CONVERSION", "-Wconstant-conversion")
+ // Double-underscores are intentional - thanks Xcode.
+ .put("CLANG_WARN__DUPLICATE_METHOD_MATCH", "-Wduplicate-method-match")
+ .put("CLANG_WARN_EMPTY_BODY", "-Wempty-body")
+ .put("CLANG_WARN_ENUM_CONVERSION", "-Wenum-conversion")
+ .put("CLANG_WARN_INT_CONVERSION", "-Wint-conversion")
+ .put("CLANG_WARN_UNREACHABLE_CODE", "-Wunreachable-code")
+ .put("GCC_WARN_ABOUT_RETURN_TYPE", "-Wmismatched-return-types")
+ .put("GCC_WARN_UNDECLARED_SELECTOR", "-Wundeclared-selector")
+ .put("GCC_WARN_UNINITIALIZED_AUTOS", "-Wuninitialized")
+ .put("GCC_WARN_UNUSED_FUNCTION", "-Wunused-function")
+ .put("GCC_WARN_UNUSED_VARIABLE", "-Wunused-variable")
+ .build();
+
+ static final ImmutableList<String> DEFAULT_LINKER_FLAGS = ImmutableList.of("-ObjC");
+
+ private IosSdkCommands() {
+ throw new UnsupportedOperationException("static-only");
+ }
+
+ private static String platformDir(ObjcConfiguration configuration) {
+ return DEVELOPER_DIR + "/Platforms/" + configuration.getPlatform().getNameInPlist()
+ + ".platform";
+ }
+
+ public static String sdkDir(ObjcConfiguration configuration) {
+ return platformDir(configuration) + "/Developer/SDKs/"
+ + configuration.getPlatform().getNameInPlist() + configuration.getIosSdkVersion() + ".sdk";
+ }
+
+ public static String frameworkDir(ObjcConfiguration configuration) {
+ return platformDir(configuration) + "/Developer/Library/Frameworks";
+ }
+
+ 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> commonLinkAndCompileArgsForClang(
+ ObjcProvider provider, ObjcConfiguration configuration) {
+ ImmutableList.Builder<String> builder = new ImmutableList.Builder<>();
+ if (configuration.getPlatform() == Platform.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(configuration))
+ // TODO(bazel-team): Pass framework search paths to Xcodegen.
+ .add("-F", sdkDir(configuration) + "/Developer/Library/Frameworks")
+ // As of sdk8.1, XCTest is in a base Framework dir
+ .add("-F", frameworkDir(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> compileArgsForClang(ObjcConfiguration configuration) {
+ return Iterables.concat(
+ DEFAULT_WARNINGS.values(),
+ platformSpecificCompileArgsForClang(configuration)
+ );
+ }
+
+ private static List<String> platformSpecificCompileArgsForClang(ObjcConfiguration configuration) {
+ switch (configuration.getPlatform()) {
+ case DEVICE:
+ return ImmutableList.of();
+ case 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>() {
+ @Override
+ public XcodeprojBuildSetting apply(String key) {
+ return XcodeprojBuildSetting.newBuilder().setName(key).setValue("YES").build();
+ }
+ });
+ }
+}