Skip to content

Commit e318818

Browse files
Add --ios_device flag for running iOS application on a physical device
1 parent 1e481ab commit e318818

File tree

4 files changed

+85
-0
lines changed

4 files changed

+85
-0
lines changed

src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,18 @@ public class ObjcCommandLineOptions extends FragmentOptions {
4848
+ "devicetypes' on the machine the simulator will be run on.")
4949
public String iosSimulatorDevice;
5050

51+
@Option(
52+
name = "ios_device",
53+
defaultValue = "null",
54+
documentationCategory = OptionDocumentationCategory.TESTING,
55+
effectTags = {OptionEffectTag.TEST_RUNNER},
56+
help =
57+
"The identifier, ECID, serial number, UDID, user-provided name, or DNS name of "
58+
+ "the device for running an iOS application. "
59+
+ "You can get a list of devices by running 'xcrun devicectl list "
60+
+ "devices'.")
61+
public String iosDevice;
62+
5163
@Option(
5264
name = "ios_memleaks",
5365
defaultValue = "false",

src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public class ObjcConfiguration extends Fragment implements ObjcConfigurationApi
5353

5454
private final DottedVersion iosSimulatorVersion;
5555
private final String iosSimulatorDevice;
56+
private final String iosDevice;
5657
private final boolean runMemleaks;
5758
private final CompilationMode compilationMode;
5859
private final ImmutableList<String> fastbuildOptions;
@@ -70,6 +71,7 @@ public ObjcConfiguration(BuildOptions buildOptions) {
7071

7172
this.iosSimulatorDevice = objcOptions.iosSimulatorDevice;
7273
this.iosSimulatorVersion = DottedVersion.maybeUnwrap(objcOptions.iosSimulatorVersion);
74+
this.iosDevice = objcOptions.iosDevice;
7375
this.runMemleaks = objcOptions.runMemleaks;
7476
this.compilationMode = Preconditions.checkNotNull(options.compilationMode, "compilationMode");
7577
this.fastbuildOptions = ImmutableList.copyOf(objcOptions.fastbuildOptions);
@@ -98,6 +100,14 @@ public DottedVersion getIosSimulatorVersion() {
98100
return iosSimulatorVersion;
99101
}
100102

103+
/**
104+
* Returns the device when running an application on a physical device.
105+
*/
106+
@Override
107+
public String getIosDevice() {
108+
return iosDevice;
109+
}
110+
101111
@Override
102112
public boolean runMemleaks() {
103113
return runMemleaks;

src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ObjcConfigurationApi.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,14 @@ public interface ObjcConfigurationApi extends StarlarkValue {
4848
@Nullable
4949
DottedVersionApi<?> getIosSimulatorVersion();
5050

51+
@StarlarkMethod(
52+
name = "ios_device",
53+
structField = true,
54+
allowReturnNones = true,
55+
doc = "The device identifier to use when running an iOS application.")
56+
@Nullable
57+
String getIosDevice();
58+
5159
@StarlarkMethod(
5260
name = "run_memleaks",
5361
structField = true,

src/test/java/com/google/devtools/build/lib/rules/objc/ObjcStarlarkTest.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,61 @@ def swift_binary_impl(ctx):
808808
assertThat(signingCertificateName).isEqualTo("'Apple Developer'");
809809
}
810810

811+
@Test
812+
public void testStarlarkCanAccessObjcConfigurationForDevice() throws Exception {
813+
scratch.file("examples/rule/BUILD");
814+
scratch.file(
815+
"examples/rule/objc_rules.bzl",
816+
"""
817+
load("//myinfo:myinfo.bzl", "MyInfo")
818+
819+
def swift_binary_impl(ctx):
820+
compilation_mode_copts = ctx.fragments.objc.copts_for_current_compilation_mode
821+
ios_device = ctx.fragments.objc.ios_device
822+
signing_certificate_name = ctx.fragments.objc.signing_certificate_name
823+
return MyInfo(
824+
compilation_mode_copts = compilation_mode_copts,
825+
ios_device = ios_device,
826+
signing_certificate_name = signing_certificate_name,
827+
)
828+
829+
swift_binary = rule(
830+
implementation = swift_binary_impl,
831+
fragments = ["objc"],
832+
)
833+
""");
834+
835+
scratch.file("examples/objc_starlark/a.m");
836+
scratch.file(
837+
"examples/objc_starlark/BUILD",
838+
"""
839+
load("//examples/rule:objc_rules.bzl", "swift_binary")
840+
841+
package(default_visibility = ["//visibility:public"])
842+
843+
swift_binary(
844+
name = "my_target",
845+
)
846+
""");
847+
848+
useConfiguration(
849+
"--compilation_mode=opt",
850+
"--ios_multi_cpus=arm64",
851+
"--ios_device='11111111-1111-1111-1111-11111111111'",
852+
"--ios_signing_cert_name='Apple Developer'");
853+
ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/objc_starlark:my_target");
854+
StructImpl myInfo = getMyInfoFromTarget(starlarkTarget);
855+
856+
@SuppressWarnings("unchecked")
857+
List<String> compilationModeCopts = (List<String>) myInfo.getValue("compilation_mode_copts");
858+
Object iosDevice = myInfo.getValue("ios_device");
859+
Object signingCertificateName = myInfo.getValue("signing_certificate_name");
860+
861+
assertThat(compilationModeCopts).containsExactlyElementsIn(ObjcConfiguration.OPT_COPTS);
862+
assertThat(iosDevice).isEqualTo("'11111111-1111-1111-1111-11111111111'");
863+
assertThat(signingCertificateName).isEqualTo("'Apple Developer'");
864+
}
865+
811866
@Test
812867
public void testSigningCertificateNameCanReturnNone() throws Exception {
813868
scratch.file("examples/rule/BUILD");

0 commit comments

Comments
 (0)