diff options
3 files changed, 98 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java index b03a94f482..445d754262 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java @@ -15,15 +15,21 @@ package com.google.devtools.build.lib.bazel.rules.android; import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.bazel.repository.RepositoryFunction; +import com.google.devtools.build.lib.packages.AttributeMap; +import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper; import com.google.devtools.build.lib.packages.PackageIdentifier.RepositoryName; import com.google.devtools.build.lib.packages.Rule; +import com.google.devtools.build.lib.packages.Type; import com.google.devtools.build.lib.skyframe.FileValue; +import com.google.devtools.build.lib.util.ResourceFileLoader; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.skyframe.SkyFunctionException; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; +import java.io.IOException; + /** * Implementation of the {@code android_sdk} repository rule. */ @@ -48,7 +54,23 @@ public class AndroidSdkRepositoryFunction extends RepositoryFunction { return null; } - return writeBuildFile(directoryValue, "filegroup(name='sdk')"); + AttributeMap attributes = NonconfigurableAttributeMapper.of(rule); + String buildToolsVersion = attributes.get("build_tools_version", Type.STRING); + Integer apiLevel = attributes.get("api_level", Type.INTEGER); + + String template; + try { + template = ResourceFileLoader.loadResource( + AndroidSdkRepositoryFunction.class, "android_sdk_repository_template.txt"); + } catch (IOException e) { + throw new IllegalStateException(e); + } + + String buildFile = template + .replaceAll("%build_tools_version%", buildToolsVersion) + .replaceAll("%api_level%", apiLevel.toString()); + + return writeBuildFile(directoryValue, buildFile); } /** diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryRule.java index 2fbc6d6791..200de575ca 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryRule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryRule.java @@ -36,9 +36,9 @@ public class AndroidSdkRepositoryRule implements RuleDefinition { return builder .setUndocumented() .setWorkspaceOnly() - .add(attr("path", STRING).mandatory()) - .add(attr("build_tools", STRING).mandatory()) - .add(attr("api_level", INTEGER).mandatory()) + .add(attr("path", STRING).mandatory().nonconfigurable("WORKSPACE rule")) + .add(attr("build_tools_version", STRING).mandatory().nonconfigurable("WORKSPACE rule")) + .add(attr("api_level", INTEGER).mandatory().nonconfigurable("WORKSPACE rule")) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_sdk_repository_template.txt b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_sdk_repository_template.txt new file mode 100644 index 0000000000..46bfb81323 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_sdk_repository_template.txt @@ -0,0 +1,72 @@ +android_sdk( + name = "sdk", + proguard = "tools/proguard/bin/proguard.sh", + aapt = "build-tools/%build_tools_version%/aapt", + dx = "build-tools/%build_tools_version%/dx", + main_dex_list_creator = ":main_dex_list_creator", + adb = "platform-tools/adb", + framework_aidl = "platforms/android-%api_level%/framework.aidl", + aidl = "build-tools/%build_tools_version%/aidl", + android_jar = "platforms/android-%api_level%/android.jar", + shrinked_android_jar = "platforms/android-%api_level%/android.jar", + annotations_jar = "tools/support/annotations.jar", + main_dex_classes = "build-tools/%build_tools_version%/mainDexClasses.rules", + apkbuilder = ":apkbuilder", + zipalign = "build-tools/%build_tools_version%/zipalign", + visibility = ["//visibility:public"]) + +genrule( + name = "main_dex_list_creator_source", + srcs = [], + outs = ["main_dex_list_creator.sh"], + cmd = "cat > $@ <<'EOF'\n" + + "#!/bin/bash\n" + + "\n" + + "MAIN_DEX_LIST=$$1\n" + + "STRIPPED_JAR=$$2\n" + + "JAR=$$3\n" + + "" + + "DIRNAME=$$(dirname $$0)\n" + + "JAVA_BINARY=TBD/main_dex_list_creator_java\n" + # Proper runfiles path comes here + "$$JAVA_BINARY $$STRIPPED_JAR $$JAR > $$MAIN_DEX_LIST\n" + + "exit $$?\n" + + "\n" + + "EOF\n", +) + +sh_binary( + name = "main_dex_list_creator", + srcs = ["main_dex_list_creator.sh"], + data = [":main_dex_list_creator_java"], +) + +java_binary( + name = "main_dex_list_creator_java", + main_class = "com.android.multidex.ClassReferenceListBuilder", + runtime_deps = [":dx_jar_import"], +) + +java_binary( + name = "dx_binary", + main_class = "com.android.dx.command.Main", + runtime_deps = [":dx_jar_import"], +) + +filegroup( + name = "dx_jar", + srcs = ["build-toold/%build_tools_version%/lib/dx.jar"], +) + +java_import( + name = "dx_jar_import", + jars = [":dx_jar"], +) + +java_binary( + name = "apkbuilder", + runtime_deps = [":sdklib"], + main_class = "com.android.sdklib.build.ApkBuilderMain") + +java_import( + name = "sdklib", + jars = ["tools/lib/sdklib.jar", "tools/lib/common.jar"]) |