blob: 86c0c0734febbc0d5547264b69f6a3748c0fd664 [file] [log] [blame]
// Copyright 2014 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.objc;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.LabelConverter;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
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.DottedVersion;
import com.google.devtools.build.lib.rules.apple.DottedVersionConverter;
import com.google.devtools.common.options.Converters.CommaSeparatedOptionListConverter;
import com.google.devtools.common.options.Option;
import java.util.List;
/**
* Command-line options for building Objective-C targets.
*/
public class ObjcCommandLineOptions extends FragmentOptions {
@Option(
name = "ios_simulator_version",
defaultValue = "8.4",
category = "run",
converter = DottedVersionConverter.class,
deprecationWarning = "Use target_device instead to drive the simulator to use.",
help =
"The version of iOS to run on the simulator when running or testing. This is ignored "
+ "for ios_test rules if a target device is specified in the rule."
)
public DottedVersion iosSimulatorVersion;
@Option(name = "ios_simulator_device",
defaultValue = "iPhone 5s",
category = "run",
help = "The device to simulate when running an iOS application in the simulator, e.g. "
+ "'iPhone 6'. You can get a list of devices by running 'xcrun simctl list devicetypes' "
+ "on the machine the simulator will be run on.")
public String iosSimulatorDevice;
@Option(
name = "watchos_simulator_version",
defaultValue = "2.0",
category = "run",
converter = DottedVersionConverter.class,
help = "The version of watchOS to run on the simulator when running or testing."
)
public DottedVersion watchosSimulatorVersion;
@Option(name = "watchos_simulator_device",
defaultValue = "Apple Watch - 38mm",
category = "run",
help = "The device to simulate when running an watchOS application in the simulator, e.g. "
+ "'Apple Watch - 38mm'. You can get a list of devices by running 'xcrun simctl list "
+ "devicetypes' on the machine the simulator will be run on.")
public String watchosSimulatorDevice;
@Option(
name = "tvos_simulator_version",
defaultValue = "9.0",
category = "run",
converter = DottedVersionConverter.class,
help = "The version of tvOS to run on the simulator when running or testing."
)
public DottedVersion tvosSimulatorVersion;
@Option(name = "tvos_simulator_device",
defaultValue = "Apple TV 1080p",
category = "run",
help = "The device to simulate when running an tvOS application in the simulator, e.g. "
+ "'Apple TV 1080p'. You can get a list of devices by running 'xcrun simctl list "
+ "devicetypes' on the machine the simulator will be run on.")
public String tvosSimulatorDevice;
@Option(name = "objc_generate_linkmap",
defaultValue = "false",
category = "flags",
help = "Specifies whether to generate a linkmap file.")
public boolean generateLinkmap;
@Option(name = "objccopt",
allowMultiple = true,
defaultValue = "",
category = "flags",
help = "Additional options to pass to Objective C compilation.")
public List<String> copts;
@Option(
name = "ios_minimum_os",
defaultValue = DEFAULT_MINIMUM_IOS,
category = "flags",
converter = DottedVersionConverter.class,
help = "Minimum compatible iOS version for target simulators and devices."
)
public DottedVersion iosMinimumOs;
@Option(
name = "watchos_minimum_os",
defaultValue = DEFAULT_MINIMUM_WATCHOS,
category = "flags",
converter = DottedVersionConverter.class,
help = "Minimum compatible watchOS version for target simulators and devices."
)
public DottedVersion watchosMinimumOs;
@Option(
name = "tvos_minimum_os",
defaultValue = DEFAULT_MINIMUM_TVOS,
category = "flags",
converter = DottedVersionConverter.class,
help = "Minimum compatible tvOS version for target simulators and devices."
)
public DottedVersion tvosMinimumOs;
@Option(name = "ios_memleaks",
defaultValue = "false",
category = "misc",
help = "Enable checking for memory leaks in ios_test targets.")
public boolean runMemleaks;
@Option(name = "experimental_enable_objc_cc_deps",
defaultValue = "false",
category = "undocumented",
help = "Allows objc_* rules to depend on cc_library and causes any objc dependencies to be "
+ "built with --cpu set to \"ios_<--ios_cpu>\" for any values in --ios_multi_cpu.")
public boolean enableCcDeps;
@Option(name = "experimental_objc_fastbuild_options",
defaultValue = "-O0,-DDEBUG=1",
category = "undocumented",
converter = CommaSeparatedOptionListConverter.class,
help = "Uses these strings as objc fastbuild compiler options.")
public List<String> fastbuildOptions;
@Option(
name = "experimental_objc_enable_module_maps",
defaultValue = "false",
category = "undocumented",
help = "Enables module map generation and interpretation."
)
public boolean enableModuleMaps;
@Option(
name = "objc_enable_binary_stripping",
defaultValue = "false",
category = "flags",
help =
"Whether to perform symbol and dead-code strippings on linked binaries. Binary "
+ "strippings will be performed if both this flag and --compilationMode=opt are "
+ "specified."
)
public boolean enableBinaryStripping;
@Option(
name = "apple_generate_dsym",
defaultValue = "false",
category = "flags",
help = "Whether to generate debug symbol(.dSYM) file(s)."
)
public boolean appleGenerateDsym;
@Option(
name = "ios_signing_cert_name",
defaultValue = "null",
category = "flags",
help =
"Certificate name to use for iOS signing. If not set will fall back to provisioning "
+ "profile. May be the certificate's keychain identity preference or (substring) of "
+ "the certificate's common name, as per codesign's man page (SIGNING IDENTITIES)."
)
public String iosSigningCertName;
@Option(
name = "experimental_use_absolute_paths_for_actions",
defaultValue = "false",
category = "undocumented",
help = "If set, then all actions objc actions will be executed with absolute paths."
)
public boolean useAbsolutePathsForActions;
@Option(
name = "xcode_override_workspace_root",
defaultValue = "",
category = "xcode",
help =
"If set, then this path will be used as workspace_root and mainGroup path when "
+ "generating an .xcodeproj/project.pbxproj file."
)
public String xcodeOverrideWorkspaceRoot;
@Option(
name = "objc_includes_prioritize_static_libs",
defaultValue = "false",
category = "flags",
help =
"If set, the linker invocation will contain static library includes before frameworks"
+ " and system libraries."
)
public boolean prioritizeStaticLibs;
@Option(
name = "objc_debug_with_GLIBCXX",
defaultValue = "true",
category = "undocumented",
help =
"If set, and compilation mode is set to 'dbg', define GLIBCXX_DEBUG, "
+ " GLIBCXX_DEBUG_PEDANTIC and GLIBCPP_CONCEPT_CHECKS."
)
public boolean debugWithGlibcxx;
@Option(
name = "extra_entitlements",
defaultValue = "null",
category = "flags",
converter = LabelConverter.class,
help =
"Location of a .entitlements file that is merged into any iOS signing action in this "
+ "build."
)
public Label extraEntitlements;
@Option(
name = "device_debug_entitlements",
defaultValue = "true",
category = "flags",
help =
"If set, and compilation mode is not 'opt', objc apps will include debug entitlements "
+ "when signing."
)
public boolean deviceDebugEntitlements;
@Option(
name = "experimental_objc_library",
defaultValue = "false",
category = "undocumented"
)
public boolean experimentalObjcLibrary;
@VisibleForTesting static final String DEFAULT_MINIMUM_IOS = "7.0";
@VisibleForTesting static final String DEFAULT_MINIMUM_WATCHOS = "2.0";
@VisibleForTesting static final String DEFAULT_MINIMUM_TVOS = "9.0";
@SuppressWarnings("unchecked")
@Override
public List<SplitTransition<BuildOptions>> getPotentialSplitTransitions() {
return ImmutableList.<SplitTransition<BuildOptions>>builder().add(
IosApplication.SPLIT_ARCH_TRANSITION, IosExtension.MINIMUM_OS_AND_SPLIT_ARCH_TRANSITION,
AppleWatch1Extension.MINIMUM_OS_AND_SPLIT_ARCH_TRANSITION)
.addAll(MultiArchSplitTransitionProvider.getPotentialSplitTransitions())
.build();
}
}