Skip to content

Commit f064184

Browse files
scentinicopybara-github
authored andcommitted
Add an is_android option to facilitate exec toolchain selection
RELNOTES:None. PiperOrigin-RevId: 562925627 Change-Id: I30a83d83d8d97947b446cb53ed6555c87b367b60
1 parent b29649f commit f064184

File tree

4 files changed

+33
-4
lines changed

4 files changed

+33
-4
lines changed

src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,6 +1107,19 @@ public static class Options extends FragmentOptions {
11071107
+ " transition` with changed options to avoid potential action conflicts.")
11081108
public boolean androidPlatformsTransitionsUpdateAffected;
11091109

1110+
@Option(
1111+
name = "is_android",
1112+
defaultValue = "false",
1113+
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
1114+
effectTags = OptionEffectTag.BAZEL_INTERNAL_CONFIGURATION,
1115+
help =
1116+
"This option exists for the purposes of enabling the toolchain resolution mechanism"
1117+
+ " to select a different `exec` toolchain when targeting Android. An example use"
1118+
+ " case is Rust: The Rust toolchain has a requirement that certain types of"
1119+
+ " libraries (proc-macro) that are built in `exec` mode *have* to be compiled with"
1120+
+ " the same toolchain as the libraries built in `target` mode.")
1121+
public boolean isAndroid;
1122+
11101123
@Override
11111124
public FragmentOptions getExec() {
11121125
Options exec = (Options) super.getExec();
@@ -1137,6 +1150,7 @@ public FragmentOptions getExec() {
11371150
exec.persistentBusyboxTools = persistentBusyboxTools;
11381151
exec.persistentMultiplexBusyboxTools = persistentMultiplexBusyboxTools;
11391152
exec.disableNativeAndroidRules = disableNativeAndroidRules;
1153+
exec.isAndroid = isAndroid;
11401154

11411155
// Unless the build was started from an Android device, exec means MAIN.
11421156
exec.configurationDistinguisher = ConfigurationDistinguisher.MAIN;
@@ -1193,6 +1207,7 @@ public FragmentOptions getExec() {
11931207
private final boolean hwasan;
11941208
private final boolean getJavaResourcesFromOptimizedJar;
11951209
private final boolean includeProguardLocationReferences;
1210+
private final boolean isAndroid;
11961211

11971212
public AndroidConfiguration(BuildOptions buildOptions) throws InvalidConfigurationException {
11981213
Options options = buildOptions.get(Options.class);
@@ -1254,6 +1269,7 @@ public AndroidConfiguration(BuildOptions buildOptions) throws InvalidConfigurati
12541269
this.hwasan = options.hwasan;
12551270
this.getJavaResourcesFromOptimizedJar = options.getJavaResourcesFromOptimizedJar;
12561271
this.includeProguardLocationReferences = options.includeProguardLocationReferences;
1272+
this.isAndroid = options.isAndroid;
12571273

12581274
if (incrementalDexingShardsAfterProguard < 0) {
12591275
throw new InvalidConfigurationException(
@@ -1534,6 +1550,10 @@ boolean outputLibraryMergedAssets() {
15341550
return outputLibraryMergedAssets;
15351551
}
15361552

1553+
boolean isAndroid() {
1554+
return isAndroid;
1555+
}
1556+
15371557
/** Returns the label provided with --legacy_main_dex_list_generator, if any. */
15381558
// TODO(b/147692286): Move R8's main dex list tool into tool repository.
15391559
@StarlarkConfigurationField(

src/main/java/com/google/devtools/build/lib/rules/android/AndroidPlatformsTransition.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public BuildOptions patch(BuildOptionsView options, EventHandler eventHandler) {
7474
// 2. Otherwise, leave --platforms alone (this will probably lead to build errors).
7575
if (!androidOptions.androidPlatforms.isEmpty()) {
7676
// If the current value of --platforms is not one of the values of --android_platforms, change
77-
// it to be the first one. If the curent --platforms is part of --android_platforms, leave it
77+
// it to be the first one. If the current --platforms is part of --android_platforms, leave it
7878
// as-is.
7979
// NOTE: This does not handle aliases at all, so if someone is using aliases with platform
8080
// definitions this check will break.
@@ -90,6 +90,8 @@ public BuildOptions patch(BuildOptionsView options, EventHandler eventHandler) {
9090
newOptions.get(CppOptions.class).enableCcToolchainResolution = true;
9191
}
9292

93+
newOptions.get(AndroidConfiguration.Options.class).isAndroid = true;
94+
9395
if (androidOptions.androidPlatformsTransitionsUpdateAffected) {
9496
ImmutableSet.Builder<String> affected = ImmutableSet.builder();
9597
if (!options
@@ -102,6 +104,10 @@ public BuildOptions patch(BuildOptionsView options, EventHandler eventHandler) {
102104
!= newOptions.get(CppOptions.class).enableCcToolchainResolution) {
103105
affected.add("//command_line_option:incompatible_enable_cc_toolchain_resolution");
104106
}
107+
if (options.get(AndroidConfiguration.Options.class).isAndroid
108+
!= newOptions.get(AndroidConfiguration.Options.class).isAndroid) {
109+
affected.add("//command_line_option:is_android");
110+
}
105111
FunctionTransitionUtil.updateAffectedByStarlarkTransition(
106112
newOptions.get(CoreOptions.class), affected.build());
107113
}

src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingV2Test.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ public void dataBindingAnnotationProcessorFlags_v3_4() throws Exception {
339339
(JavaCompileAction)
340340
getGeneratingAction(getFirstArtifactEndingWith(allArtifacts, "app.jar"));
341341
String dataBindingFilesDir =
342-
targetConfig
342+
getConfiguration(ctapp)
343343
.getBinDirectory(RepositoryName.MAIN)
344344
.getExecPath()
345345
.getRelative("java/android/binary/databinding/app")
@@ -1214,7 +1214,7 @@ public void dataBinding_androidLocalTest_dataBindingEnabled_usesDataBindingFlags
12141214
getGeneratingAction(
12151215
getFirstArtifactEndingWith(allArtifacts, "databinding_enabled_test-class.jar"));
12161216
String dataBindingFilesDir =
1217-
targetConfig
1217+
getConfiguration(testTarget)
12181218
.getBinDirectory(RepositoryName.MAIN)
12191219
.getExecPath()
12201220
.getRelative("javatests/android/test/databinding/databinding_enabled_test")

src/test/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,10 @@ public void testTestExecutableRunfiles() throws Exception {
190190
.toList());
191191
assertThat(runfiles.stream().map(Artifact::toString).collect(toImmutableList()))
192192
.containsAtLeast(
193-
getDeviceFixtureScript(getConfiguredTarget("//javatests/com/app:device_fixture"))
193+
getDeviceFixtureScript(
194+
getDirectPrerequisite(
195+
androidInstrumentationTest.getConfiguredTarget(),
196+
"//javatests/com/app:device_fixture"))
194197
.toString(),
195198
getInstrumentationApk(getConfiguredTarget("//javatests/com/app:instrumentation_app"))
196199
.toString(),

0 commit comments

Comments
 (0)