diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java | 139 |
1 files changed, 79 insertions, 60 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java index 4240fb22d0..6943e95cce 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java @@ -51,8 +51,9 @@ import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider; import com.google.devtools.build.lib.rules.java.JavaConfiguration; import com.google.devtools.build.lib.rules.java.JavaSemantics; import com.google.devtools.build.lib.rules.java.ProguardHelper; +import com.google.devtools.build.lib.skylarkinterface.SkylarkValue; +import com.google.devtools.build.lib.syntax.Printer; import com.google.devtools.build.lib.util.FileType; -import java.util.ArrayList; import java.util.List; import javax.annotation.Nullable; @@ -188,72 +189,90 @@ public final class AndroidRuleClasses { } public static final SplitTransition<BuildOptions> ANDROID_SPLIT_TRANSITION = - new SplitTransition<BuildOptions>() { - @Override - public boolean defaultsToSelf() { - return true; - } + new AndroidSplitTransition(); + + private static final class AndroidSplitTransition implements + SplitTransition<BuildOptions>, SkylarkValue { - private void setCrosstoolToAndroid(BuildOptions output, BuildOptions input) { - AndroidConfiguration.Options inputAndroidOptions = - input.get(AndroidConfiguration.Options.class); - AndroidConfiguration.Options outputAndroidOptions = - output.get(AndroidConfiguration.Options.class); - - CppOptions cppOptions = output.get(CppOptions.class); - if (inputAndroidOptions.androidCrosstoolTop != null - && !cppOptions.crosstoolTop.equals(inputAndroidOptions.androidCrosstoolTop)) { - if (cppOptions.hostCrosstoolTop == null) { - cppOptions.hostCrosstoolTop = cppOptions.crosstoolTop; - } - cppOptions.crosstoolTop = inputAndroidOptions.androidCrosstoolTop; - } + @Override + public boolean defaultsToSelf() { + return true; + } - outputAndroidOptions.configurationDistinguisher = ConfigurationDistinguisher.ANDROID; + private static void setCrosstoolToAndroid(BuildOptions output, BuildOptions input) { + AndroidConfiguration.Options inputAndroidOptions = + input.get(AndroidConfiguration.Options.class); + AndroidConfiguration.Options outputAndroidOptions = + output.get(AndroidConfiguration.Options.class); + + CppOptions cppOptions = output.get(CppOptions.class); + if (inputAndroidOptions.androidCrosstoolTop != null + && !cppOptions.crosstoolTop.equals(inputAndroidOptions.androidCrosstoolTop)) { + if (cppOptions.hostCrosstoolTop == null) { + cppOptions.hostCrosstoolTop = cppOptions.crosstoolTop; } + cppOptions.crosstoolTop = inputAndroidOptions.androidCrosstoolTop; + } - @Override - public List<BuildOptions> split(BuildOptions buildOptions) { - AndroidConfiguration.Options androidOptions = - buildOptions.get(AndroidConfiguration.Options.class); - CppOptions cppOptions = buildOptions.get(CppOptions.class); - Label androidCrosstoolTop = androidOptions.androidCrosstoolTop; - if (androidOptions.fatApkCpus.isEmpty() - && (androidCrosstoolTop == null - || androidCrosstoolTop.equals(cppOptions.crosstoolTop) - || androidOptions.cpu.isEmpty())) { - return ImmutableList.of(); - } + outputAndroidOptions.configurationDistinguisher = ConfigurationDistinguisher.ANDROID; + } - if (androidOptions.fatApkCpus.isEmpty()) { - BuildOptions splitOptions = buildOptions.clone(); - splitOptions.get(CppOptions.class).cppCompiler = androidOptions.cppCompiler; - // getSplitPrerequisites() will complain if cpu is null after this transition, - // so default to android_cpu. - splitOptions.get(BuildConfiguration.Options.class).cpu = androidOptions.cpu; - splitOptions.get(CppOptions.class).dynamicMode = androidOptions.dynamicMode; - setCrosstoolToAndroid(splitOptions, buildOptions); - return ImmutableList.of(splitOptions); - } + @Override + public List<BuildOptions> split(BuildOptions buildOptions) { - List<BuildOptions> result = new ArrayList<>(); - for (String cpu : ImmutableSortedSet.copyOf(androidOptions.fatApkCpus)) { - BuildOptions splitOptions = buildOptions.clone(); - // Disable fat APKs for the child configurations. - splitOptions.get(AndroidConfiguration.Options.class).fatApkCpus = ImmutableList.of(); - - // Set the cpu & android_cpu. - // TODO(bazel-team): --android_cpu doesn't follow --cpu right now; it should. - splitOptions.get(AndroidConfiguration.Options.class).cpu = cpu; - splitOptions.get(BuildConfiguration.Options.class).cpu = cpu; - splitOptions.get(CppOptions.class).cppCompiler = androidOptions.cppCompiler; - splitOptions.get(CppOptions.class).dynamicMode = androidOptions.dynamicMode; - setCrosstoolToAndroid(splitOptions, buildOptions); - result.add(splitOptions); - } - return result; + AndroidConfiguration.Options androidOptions = + buildOptions.get(AndroidConfiguration.Options.class); + CppOptions cppOptions = buildOptions.get(CppOptions.class); + Label androidCrosstoolTop = androidOptions.androidCrosstoolTop; + + if (androidOptions.fatApkCpus.isEmpty()) { + + if (androidOptions.cpu.isEmpty() + || androidCrosstoolTop == null + || androidCrosstoolTop.equals(cppOptions.crosstoolTop)) { + return ImmutableList.of(); + + } else { + + BuildOptions splitOptions = buildOptions.clone(); + splitOptions.get(CppOptions.class).cppCompiler = androidOptions.cppCompiler; + splitOptions.get(BuildConfiguration.Options.class).cpu = androidOptions.cpu; + splitOptions.get(CppOptions.class).dynamicMode = androidOptions.dynamicMode; + setCrosstoolToAndroid(splitOptions, buildOptions); + return ImmutableList.of(splitOptions); } - }; + + } else { + + ImmutableList.Builder<BuildOptions> result = ImmutableList.builder(); + for (String cpu : ImmutableSortedSet.copyOf(androidOptions.fatApkCpus)) { + BuildOptions splitOptions = buildOptions.clone(); + // Disable fat APKs for the child configurations. + splitOptions.get(AndroidConfiguration.Options.class).fatApkCpus = ImmutableList.of(); + + // Set the cpu & android_cpu. + // TODO(bazel-team): --android_cpu doesn't follow --cpu right now; it should. + splitOptions.get(AndroidConfiguration.Options.class).cpu = cpu; + splitOptions.get(BuildConfiguration.Options.class).cpu = cpu; + splitOptions.get(CppOptions.class).cppCompiler = androidOptions.cppCompiler; + splitOptions.get(CppOptions.class).dynamicMode = androidOptions.dynamicMode; + setCrosstoolToAndroid(splitOptions, buildOptions); + result.add(splitOptions); + } + return result.build(); + } + } + + @Override + public boolean isImmutable() { + return true; + } + + @Override + public void write(Appendable buffer, char quotationMark) { + Printer.append(buffer, "android_common.multi_cpu_configuration"); + } + } public static final FileType ANDROID_IDL = FileType.of(".aidl"); |