blob: 177e77f161131d195f38040486e79a172c84d128 [file] [log] [blame]
// Copyright 2015 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.analysis.mock;
import static com.google.common.collect.ImmutableMap.toImmutableMap;
import static java.nio.charset.StandardCharsets.UTF_8;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.io.MoreFiles;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.ShellConfiguration;
import com.google.devtools.build.lib.analysis.util.AbstractMockJavaSupport;
import com.google.devtools.build.lib.analysis.util.AnalysisMock;
import com.google.devtools.build.lib.bazel.bzlmod.LocalPathOverride;
import com.google.devtools.build.lib.bazel.bzlmod.NonRegistryOverride;
import com.google.devtools.build.lib.bazel.repository.LocalConfigPlatformFunction;
import com.google.devtools.build.lib.bazel.repository.LocalConfigPlatformRule;
import com.google.devtools.build.lib.bazel.rules.BazelRuleClassProvider;
import com.google.devtools.build.lib.packages.util.BazelMockCcSupport;
import com.google.devtools.build.lib.packages.util.BazelMockPythonSupport;
import com.google.devtools.build.lib.packages.util.MockCcSupport;
import com.google.devtools.build.lib.packages.util.MockGenruleSupport;
import com.google.devtools.build.lib.packages.util.MockPlatformSupport;
import com.google.devtools.build.lib.packages.util.MockPythonSupport;
import com.google.devtools.build.lib.packages.util.MockToolsConfig;
import com.google.devtools.build.lib.rules.repository.RepositoryFunction;
import com.google.devtools.build.lib.testutil.TestConstants;
import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.runfiles.Runfiles;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/** Subclass of {@link AnalysisMock} using Bazel-specific semantics. */
public final class BazelAnalysisMock extends AnalysisMock {
public static final AnalysisMock INSTANCE = new BazelAnalysisMock();
private BazelAnalysisMock() {}
@Override
public ImmutableList<String> getWorkspaceContents(MockToolsConfig config) {
String xcodeWorkspace = config.getPath("local_config_xcode_workspace").getPathString();
String protobufWorkspace = config.getPath("protobuf_workspace").getPathString();
String bazelToolWorkspace = config.getPath("embedded_tools").getPathString();
String bazelPlatformsWorkspace = config.getPath("platforms_workspace").getPathString();
String rulesJavaWorkspace = config.getPath("rules_java_workspace").getPathString();
String androidGmavenR8Workspace = config.getPath("android_gmaven_r8").getPathString();
String appleSupport = config.getPath("build_bazel_apple_support").getPathString();
return ImmutableList.of(
"# __SKIP_WORKSPACE_PREFIX__",
"bind(name = 'android/sdk', actual ="
+ " '@bazel_tools//tools/android:poison_pill_android_sdk')",
"bind(name = 'android/dx_jar_import', actual ="
+ " '@bazel_tools//tools/android:no_android_sdk_repository_error')",
"bind(name = 'android/d8_jar_import', actual ="
+ " '@bazel_tools//tools/android:no_android_sdk_repository_error')",
"bind(name = 'android/crosstool', actual = '@bazel_tools//tools/cpp:toolchain')",
"bind(name = 'android_sdk_for_testing', actual = '@bazel_tools//tools/android:empty')",
"bind(name = 'android_ndk_for_testing', actual = '@bazel_tools//tools/android:empty')",
"bind(name = 'databinding_annotation_processor', actual ="
+ " '@bazel_tools//tools/android:empty')",
"bind(name = 'has_androidsdk', actual = '@bazel_tools//tools/android:always_false')",
"local_repository(name = 'bazel_tools', path = '" + bazelToolWorkspace + "')",
"local_repository(name = 'platforms', path = '" + bazelPlatformsWorkspace + "')",
"local_repository(name = 'internal_platforms_do_not_use', path = '"
+ bazelPlatformsWorkspace
+ "')",
"local_repository(name = 'local_config_xcode', path = '" + xcodeWorkspace + "')",
"local_repository(name = 'com_google_protobuf', path = '" + protobufWorkspace + "')",
"local_repository(name = 'rules_java', path = '" + rulesJavaWorkspace + "')",
"local_repository(name = 'rules_java_builtin', path = '" + rulesJavaWorkspace + "')",
"local_repository(name = 'android_gmaven_r8', path = '" + androidGmavenR8Workspace + "')",
"local_repository(name = 'build_bazel_apple_support', path = '" + appleSupport + "')",
"register_toolchains('@rules_java//java/toolchains/runtime:all')",
"register_toolchains('@rules_java//java/toolchains/javac:all')",
"bind(name = 'android/sdk', actual='@bazel_tools//tools/android:sdk')",
"register_toolchains('@bazel_tools//tools/cpp:all')",
"register_toolchains('@bazel_tools//tools/jdk:all')",
"register_toolchains('@bazel_tools//tools/android:all')",
// Note this path is created inside the test infrastructure in
// createAndroidBuildContents() below. It may not reflect a real depot path.
"register_toolchains('@bazel_tools//tools/android/dummy_sdk:all')",
"register_toolchains('@bazel_tools//tools/python:autodetecting_toolchain')");
}
/** Keep this in sync with the WORKSPACE content in {@link #getWorkspaceContents}. */
@Override
public ImmutableList<String> getWorkspaceRepos() {
return ImmutableList.of(
"android_gmaven_r8",
"bazel_tools",
"com_google_protobuf",
"local_config_xcode",
"platforms",
"internal_platforms_do_not_use",
"rules_java",
"rules_java_builtin",
"build_bazel_apple_support");
}
@Override
public void setupMockClient(MockToolsConfig config) throws IOException {
List<String> workspaceContents = getWorkspaceContents(config);
setupMockClient(config, workspaceContents);
}
@Override
public void setupMockClient(MockToolsConfig config, List<String> workspaceContents)
throws IOException {
config.create("local_config_xcode_workspace/WORKSPACE");
config.create("local_config_xcode_workspace/BUILD", "xcode_config(name = 'host_xcodes')");
config.create(
"local_config_xcode_workspace/MODULE.bazel", "module(name = 'local_config_xcode')");
config.create(
"protobuf_workspace/BUILD",
"""
licenses(["notice"])
exports_files([
"protoc",
"cc_toolchain",
])
""");
config.create("protobuf_workspace/WORKSPACE");
config.create("protobuf_workspace/MODULE.bazel", "module(name='com_google_protobuf')");
config.overwrite("WORKSPACE", workspaceContents.toArray(new String[0]));
config.overwrite("MODULE.bazel");
/* The rest of platforms is initialized in {@link MockPlatformSupport}. */
config.create("platforms_workspace/WORKSPACE", "workspace(name = 'platforms')");
config.create("platforms_workspace/MODULE.bazel", "module(name = 'platforms')");
config.create("build_bazel_apple_support/WORKSPACE", "workspace(name = 'apple_support')");
config.create(
"build_bazel_apple_support/MODULE.bazel", "module(name = 'build_bazel_apple_support')");
config.create("embedded_tools/WORKSPACE", "workspace(name = 'bazel_tools')");
Runfiles runfiles = Runfiles.create();
for (String filename :
Arrays.asList("tools/jdk/java_toolchain_alias.bzl", "tools/jdk/java_stub_template.txt")) {
java.nio.file.Path path = Paths.get(runfiles.rlocation("io_bazel/" + filename));
if (!Files.exists(path)) {
continue; // the io_bazel workspace root only exists for Bazel
}
config.create("embedded_tools/" + filename, MoreFiles.asCharSource(path, UTF_8).read());
}
config.create(
"embedded_tools/tools/jdk/launcher_flag_alias.bzl",
"""
_providers = [CcInfo, cc_common.launcher_provider]
def _impl(ctx):
if not ctx.attr._launcher:
return None
launcher = ctx.attr._launcher
providers = [ctx.attr._launcher[p] for p in _providers]
providers.append(DefaultInfo(
files = launcher[DefaultInfo].files,
runfiles = launcher[DefaultInfo].default_runfiles,
))
return providers
launcher_flag_alias = rule(
implementation = _impl,
attrs = {
"_launcher": attr.label(
default = configuration_field(
fragment = "java",
name = "launcher",
),
providers = _providers,
),
},
)
""");
config.create(
"embedded_tools/tools/jdk/BUILD",
"""
load(
":java_toolchain_alias.bzl",
"java_host_runtime_alias",
"java_runtime_alias",
"java_toolchain_alias",
)
load(":launcher_flag_alias.bzl", "launcher_flag_alias")
package(default_visibility = ["//visibility:public"])
java_toolchain(
name = "toolchain",
bootclasspath = [":bootclasspath"],
genclass = ["GenClass_deploy.jar"],
header_compiler = ["turbine_deploy.jar"],
header_compiler_direct = ["TurbineDirect_deploy.jar"],
ijar = ["ijar"],
jacocorunner = ":JacocoCoverage",
java_runtime = "host_jdk",
javabuilder = ["JavaBuilder_deploy.jar"],
singlejar = ["singlejar"],
source_version = "8",
target_version = "8",
)
java_toolchain(
name = "remote_toolchain",
bootclasspath = [":bootclasspath"],
genclass = ["GenClass_deploy.jar"],
header_compiler = ["turbine_deploy.jar"],
header_compiler_direct = ["TurbineDirect_deploy.jar"],
ijar = ["ijar"],
jacocorunner = ":JacocoCoverage",
java_runtime = "host_jdk",
javabuilder = ["JavaBuilder_deploy.jar"],
singlejar = ["singlejar"],
source_version = "8",
target_version = "8",
)
java_import(
name = "JacocoCoverageRunner",
jars = ["JacocoCoverage_jarjar_deploy.jar"],
)
java_import(
name = "proguard_import",
jars = ["proguard_rt.jar"],
)
java_binary(
name = "proguard",
main_class = "proguard.Proguard",
runtime_deps = [":proguard_import"],
)
java_import(
name = "TestRunner",
jars = ["TestRunner.jar"],
)
java_runtime(
name = "jdk",
srcs = [],
)
java_runtime(
name = "host_jdk",
srcs = [],
)
java_runtime(
name = "remote_jdk11",
srcs = [],
)
java_toolchain_alias(name = "current_java_toolchain")
java_runtime_alias(name = "current_java_runtime")
java_host_runtime_alias(name = "current_host_java_runtime")
filegroup(
name = "bootclasspath",
srcs = ["jdk/jre/lib/rt.jar"],
)
filegroup(
name = "extdir",
srcs = glob(
["jdk/jre/lib/ext/*"],
allow_empty = True,
),
)
filegroup(
name = "java",
srcs = ["jdk/jre/bin/java"],
)
filegroup(
name = "JacocoCoverage",
srcs = ["JacocoCoverage_deploy.jar"],
)
exports_files([
"JavaBuilder_deploy.jar",
"singlejar",
"TestRunner_deploy.jar",
"ijar",
"GenClass_deploy.jar",
"turbine_deploy.jar",
"TurbineDirect_deploy.jar",
"proguard_allowlister.par",
])
toolchain_type(name = "toolchain_type")
toolchain_type(name = "runtime_toolchain_type")
toolchain(
name = "dummy_java_toolchain",
toolchain = ":toolchain",
toolchain_type = ":toolchain_type",
)
toolchain(
name = "dummy_java_runtime_toolchain",
toolchain = ":jdk",
toolchain_type = ":runtime_toolchain_type",
)
java_plugins_flag_alias(name = "java_plugins_flag_alias")
launcher_flag_alias(
name = "launcher_flag_alias",
visibility = ["//visibility:public"],
)
""");
config.create(
TestConstants.CONSTRAINTS_PATH + "/android/BUILD",
"package(default_visibility=['//visibility:public'])",
"platform(",
" name = 'armeabi-v7a',",
" parents = ['" + TestConstants.PLATFORM_LABEL + "'],",
" constraint_values = [",
" '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "os:android',",
" '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "cpu:armv7',",
" ],",
")");
// Create the actual SDKs.
ImmutableList<String> androidBuildContents = createAndroidBuildContents();
config.create(
"embedded_tools/tools/android/BUILD", androidBuildContents.toArray(new String[0]));
config.create(
"embedded_tools/src/tools/android/java/com/google/devtools/build/android/r8/BUILD",
"java_library(name='r8')\n");
config.create(
"embedded_tools/tools/android/emulator/BUILD",
Iterables.toArray(createToolsAndroidEmulatorContents(), String.class));
config.create(
"embedded_tools/tools/android/dummy_sdk/BUILD",
"""
package(default_visibility = ["//visibility:public"])
toolchain(
name = "dummy-sdk",
toolchain = ":invalid-fallback-sdk",
toolchain_type = "@bazel_tools//tools/android:sdk_toolchain_type",
)
filegroup(
name = "jar-filegroup",
srcs = ["dummy.jar"],
)
genrule(
name = "empty-binary",
srcs = [],
outs = ["empty.sh"],
cmd = "touch $@",
executable = 1,
)
android_sdk(
name = "invalid-fallback-sdk",
aapt = ":empty_binary",
aapt2 = ":empty_binary",
adb = ":empty_binary",
aidl = ":empty_binary",
android_jar = ":jar-filegroup",
apksigner = ":empty_binary",
dx = ":empty_binary",
framework_aidl = "dummy.jar",
main_dex_classes = "dummy.jar",
main_dex_list_creator = ":empty_binary",
proguard = "empty_binary",
shrinked_android_jar = "dummy.jar",
tags = ["__ANDROID_RULES_MIGRATION__"],
zipalign = ":empty_binary",
)
""");
config.create(
"android_gmaven_r8/jar/BUILD",
"""
java_import(
name = "jar",
jars = ["r8.jar"],
)
filegroup(
name = "file",
srcs = [],
)
""");
config.create("android_gmaven_r8/WORKSPACE");
MockGenruleSupport.setup(config);
config.create(
"embedded_tools/tools/BUILD",
"alias(name='host_platform',actual='" + TestConstants.PLATFORM_LABEL + "')");
config.create(
"embedded_tools/tools/test/BUILD",
"""
filegroup(
name = "runtime",
srcs = [
"test-setup.sh",
"test-xml-generator.sh",
],
)
filegroup(
name = "test_wrapper",
srcs = ["test_wrapper_bin"],
)
filegroup(
name = "xml_writer",
srcs = ["xml_writer_bin"],
)
filegroup(
name = "test_setup",
srcs = ["test-setup.sh"],
)
filegroup(
name = "test_xml_generator",
srcs = ["test-xml-generator.sh"],
)
filegroup(
name = "collect_coverage",
srcs = ["collect_coverage.sh"],
)
filegroup(
name = "collect_cc_coverage",
srcs = ["collect_cc_coverage.sh"],
)
filegroup(
name = "coverage_support",
srcs = ["collect_coverage.sh"],
)
filegroup(
name = "coverage_report_generator",
srcs = ["coverage_report_generator.sh"],
)
filegroup(
name = "lcov_merger",
srcs = ["lcov_merger.sh"],
)
""");
// Use an alias package group to allow for modification at the simpler path
config.create(
"embedded_tools/tools/allowlists/config_feature_flag/BUILD",
"""
package_group(
name = "config_feature_flag",
includes = ["@@//tools/allowlists/config_feature_flag"],
)
package_group(
name = "config_feature_flag_setter",
includes = ["@@//tools/allowlists/config_feature_flag:config_feature_flag_setter"],
)
""");
config.create(
"tools/allowlists/config_feature_flag/BUILD",
"""
package_group(
name = "config_feature_flag",
packages = ["public"],
)
package_group(
name = "config_feature_flag_Setter",
packages = ["public"],
)
""");
config.create(
"embedded_tools/tools/allowlists/extend_rule_allowlist/BUILD",
"""
package_group(
name = "extend_rule_allowlist",
packages = ["public"],
)
""");
config.create(
"embedded_tools/tools/allowlists/android_binary_allowlist/BUILD",
"""
package_group(
name = "enable_starlark_dex_desugar_proguard",
includes = [
"@@//tools/allowlists/android_binary_allowlist:enable_starlark_dex_desugar_proguard",
],
)
""");
config.create(
"tools/allowlists/android_binary_allowlist/BUILD",
"package_group(name='enable_starlark_dex_desugar_proguard', packages=[])");
config.create(
"embedded_tools/tools/proto/BUILD",
"""
package(default_visibility = ["//visibility:public"])
alias(
name = "protoc",
actual = "@com_google_protobuf//:protoc",
)
alias(
name = "javalite_toolchain",
actual = "@com_google_protobuf//:javalite_toolchain",
)
alias(
name = "java_toolchain",
actual = "@com_google_protobuf//:java_toolchain",
)
alias(
name = "cc_toolchain",
actual = "@com_google_protobuf//:cc_toolchain",
)
""");
config.create(
"embedded_tools/tools/zip/BUILD",
"""
package(default_visibility = ["//visibility:public"])
exports_files(["precompile.py"])
cc_binary(
name = "zipper",
srcs = ["zip_main.cc"],
)
alias(
name = "unzip_fdo",
actual = ":zipper",
)
""");
config.create(
"embedded_tools/tools/launcher/BUILD",
"""
load("@bazel_tools//third_party/cc_rules/macros:defs.bzl", "cc_binary")
package(default_visibility = ["//visibility:public"])
cc_binary(
name = "launcher",
srcs = ["launcher_main.cc"],
)
cc_binary(
name = "launcher_maker",
srcs = ["launcher_maker.cc"],
)
""");
config.create(
"embedded_tools/tools/def_parser/BUILD",
"""
package(default_visibility = ["//visibility:public"])
filegroup(
name = "def_parser",
srcs = ["def_parser.exe"],
)
""");
config.create(
"embedded_tools/objcproto/BUILD",
"""
package(default_visibility = ["//visibility:public"])
objc_library(
name = "protobuf_lib",
srcs = ["empty.m"],
hdrs = ["include/header.h"],
includes = ["include"],
)
exports_files(["well_known_type.proto"])
proto_library(
name = "well_known_type_proto",
srcs = ["well_known_type.proto"],
)
""");
config.create("embedded_tools/objcproto/empty.m");
config.create("embedded_tools/objcproto/empty.cc");
config.create("embedded_tools/objcproto/well_known_type.proto");
config.create("rules_java_workspace/WORKSPACE", "workspace(name = 'rules_java')");
config.create("rules_java_workspace/MODULE.bazel", "module(name = 'rules_java')");
config.create("rules_java_workspace/java/BUILD");
config.create("rules_java_workspace/toolchains/BUILD");
java.nio.file.Path path =
Paths.get(runfiles.rlocation("rules_java/toolchains/java_toolchain_alias.bzl"));
if (Files.exists(path)) {
config.create(
"rules_java_workspace/toolchains/java_toolchain_alias.bzl",
MoreFiles.asCharSource(path, UTF_8).read());
}
config.create(
"rules_java_workspace/toolchains/local_java_repository.bzl",
"""
def local_java_repository(**attrs):
pass
""");
config.create("rules_java_workspace/toolchains/jdk_build_file.bzl", "JDK_BUILD_TEMPLATE = ''");
config.create(
"rules_java_workspace/java/defs.bzl",
"""
def java_binary(**attrs):
native.java_binary(**attrs)
def java_library(**attrs):
native.java_library(**attrs)
def java_import(**attrs):
native.java_import(**attrs)
""");
config.create(
"rules_java_workspace/java/repositories.bzl",
"""
def rules_java_dependencies():
pass
def rules_java_toolchains():
native.register_toolchains("//java/toolchains/runtime:all")
native.register_toolchains("//java/toolchains/javac:all")
""");
config.create(
"rules_java_workspace/java/toolchains/runtime/BUILD",
"""
toolchain_type(name = "toolchain_type")
toolchain(
name = "local_jdk",
toolchain = "@bazel_tools//tools/jdk:jdk",
toolchain_type = "@rules_java//java/toolchains/runtime:toolchain_type",
)
""");
config.create(
"rules_java_workspace/java/toolchains/javac/BUILD",
"""
toolchain_type(name = "toolchain_type")
toolchain(
name = "javac_toolchain",
toolchain = "@bazel_tools//tools/jdk:toolchain",
toolchain_type = "@rules_java//java/toolchains/javac:toolchain_type",
)
""");
config.create("third_party/bazel_rules/rules_proto/WORKSPACE");
config.create("third_party/bazel_rules/rules_proto/MODULE.bazel", "module(name='rules_proto')");
config.create("third_party/bazel_rules/rules_cc/WORKSPACE");
config.create("third_party/bazel_rules/rules_cc/MODULE.bazel", "module(name='rules_cc')");
config.create(
"embedded_tools/tools/allowlists/function_transition_allowlist/BUILD",
"""
package_group(
name = "function_transition_allowlist",
packages = ["public"],
)
""");
MockPlatformSupport.setup(config);
ccSupport().setup(config);
pySupport().setup(config);
ShellConfiguration.injectShellExecutableFinder(
BazelRuleClassProvider::getDefaultPathFromOptions, BazelRuleClassProvider.SHELL_EXECUTABLE);
}
/** Contents of {@code //tools/android/emulator/BUILD.tools}. */
private ImmutableList<String> createToolsAndroidEmulatorContents() {
return ImmutableList.of(
"exports_files(['emulator_arm', 'emulator_x86', 'mksd', 'empty_snapshot_fs'])",
"filegroup(name = 'emulator_x86_bios', srcs = ['bios.bin', 'vgabios-cirrus.bin'])",
"filegroup(name = 'xvfb_support', srcs = ['support_file1', 'support_file2'])",
"sh_binary(name = 'unified_launcher', srcs = ['empty.sh'])",
"filegroup(name = 'shbase', srcs = ['googletest.sh'])",
"filegroup(name = 'sdk_path', srcs = ['empty.sh'])");
}
private ImmutableList<String> createAndroidBuildContents() {
ImmutableList.Builder<String> androidBuildContents = ImmutableList.builder();
androidBuildContents.add(
"package(default_visibility=['//visibility:public'])",
"toolchain_type(name = 'sdk_toolchain_type')",
"toolchain(",
" name = 'sdk_toolchain',",
" toolchain = ':sdk',",
" toolchain_type = ':sdk_toolchain_type',",
" target_compatible_with = [",
" '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "os:android',",
" ],",
")",
"android_sdk(",
" name = 'sdk',",
" aapt = ':static_aapt_tool',",
" aapt2 = ':static_aapt2_tool',",
" adb = ':static_adb_tool',",
" aidl = ':static_aidl_tool',",
" android_jar = ':android_runtime_jar',",
" apksigner = ':ApkSignerBinary',",
" dx = ':dx_binary',",
" framework_aidl = ':aidl_framework',",
" main_dex_classes = ':mainDexClasses.rules',",
" main_dex_list_creator = ':main_dex_list_creator',",
" proguard = ':ProGuard',",
" shrinked_android_jar = ':shrinkedAndroid.jar',",
" zipalign = ':zipalign',",
" tags = ['__ANDROID_RULES_MIGRATION__'],",
")",
"filegroup(name = 'android_runtime_jar', srcs = ['android.jar'])",
"filegroup(name = 'dx_binary', srcs = ['dx_binary.jar'])");
androidBuildContents
.add("sh_binary(name = 'aar_generator', srcs = ['empty.sh'])")
.add("sh_binary(name = 'desugar_java8', srcs = ['empty.sh'])")
.add("filegroup(name = 'desugar_java8_extra_bootclasspath', srcs = ['fake.jar'])")
.add("filegroup(name = 'java8_legacy_dex', srcs = ['java8_legacy.dex.zip'])")
.add("sh_binary(name = 'build_java8_legacy_dex', srcs = ['empty.sh'])")
.add("sh_binary(name = 'merge_proguard_maps', srcs = ['empty.sh'])")
.add("filegroup(name = 'desugared_java8_legacy_apis', srcs = ['fake.jar'])")
.add("sh_binary(name = 'aar_native_libs_zip_creator', srcs = ['empty.sh'])")
.add("sh_binary(name = 'resource_extractor', srcs = ['empty.sh'])")
.add("sh_binary(name = 'dexbuilder', srcs = ['empty.sh'])")
.add("sh_binary(name = 'dexbuilder_after_proguard', srcs = ['empty.sh'])")
.add("sh_binary(name = 'dexmerger', srcs = ['empty.sh'])")
.add("sh_binary(name = 'dexsharder', srcs = ['empty.sh'])")
.add("sh_binary(name = 'aar_import_deps_checker', srcs = ['empty.sh'])")
.add("sh_binary(name = 'busybox', srcs = ['empty.sh'])")
.add("android_library(name = 'incremental_stub_application')")
.add("android_library(name = 'incremental_split_stub_application')")
.add("sh_binary(name = 'stubify_manifest', srcs = ['empty.sh'])")
.add("sh_binary(name = 'merge_dexzips', srcs = ['empty.sh'])")
.add("sh_binary(name = 'build_split_manifest', srcs = ['empty.sh'])")
.add("filegroup(name = 'debug_keystore', srcs = ['fake.file'])")
.add("sh_binary(name = 'shuffle_jars', srcs = ['empty.sh'])")
.add("sh_binary(name = 'strip_resources', srcs = ['empty.sh'])")
.add("sh_binary(name = 'build_incremental_dexmanifest', srcs = ['empty.sh'])")
.add("sh_binary(name = 'incremental_install', srcs = ['empty.sh'])")
.add("java_binary(name = 'IdlClass',")
.add(" runtime_deps = [ ':idlclass_import' ],")
.add(" main_class = 'com.google.devtools.build.android.idlclass.IdlClass')")
.add("java_binary(name = 'zip_filter',")
.add(" main_class = 'com.google.devtools.build.android.ZipFilterAction',")
.add(" runtime_deps = [ ':ZipFilterAction_import' ])")
.add("java_import(name = 'ZipFilterAction_import',")
.add(" jars = [ 'ZipFilterAction_deploy.jar' ])")
.add("sh_binary(name = 'aar_resources_extractor', srcs = ['empty.sh'])")
.add("sh_binary(name = 'aar_embedded_jars_extractor', srcs = ['empty.sh'])")
.add("sh_binary(name = 'aar_embedded_proguard_extractor', srcs = ['empty.sh'])")
.add("java_import(name = 'idlclass_import',")
.add(" jars = [ 'idlclass.jar' ])")
.add("exports_files(['adb', 'adb_static'])")
.add("sh_binary(name = 'android_runtest', srcs = ['empty.sh'])")
.add("sh_binary(name = 'instrumentation_test_entry_point', srcs = ['empty.sh'])")
.add("java_plugin(name = 'databinding_annotation_processor',")
.add(" generates_api = 1,")
.add(" processor_class = 'android.databinding.annotationprocessor.ProcessDataBinding')")
.add("sh_binary(name = 'instrumentation_test_check', srcs = ['empty.sh'])")
.add("package_group(name = 'android_device_allowlist', packages = ['public'])")
.add("package_group(name = 'export_deps_allowlist', packages = ['public'])")
.add("package_group(name = 'allow_android_library_deps_without_srcs_allowlist',")
.add(" packages=['public'])")
.add("android_tools_defaults_jar(name = 'android_jar')")
.add("sh_binary(name = 'dex_list_obfuscator', srcs = ['empty.sh'])");
return androidBuildContents.build();
}
@Override
public void setupMockWorkspaceFiles(Path embeddedBinariesRoot) throws IOException {
embeddedBinariesRoot.createDirectoryAndParents();
Path jdkWorkspacePath = embeddedBinariesRoot.getRelative("jdk.WORKSPACE");
FileSystemUtils.writeContentAsLatin1(jdkWorkspacePath, "");
}
@Override
public void setupMockToolsRepository(MockToolsConfig config) throws IOException {
config.create("embedded_tools/WORKSPACE", "workspace(name = 'bazel_tools')");
config.create("embedded_tools/MODULE.bazel", "module(name='bazel_tools')");
config.create("embedded_tools/tools/build_defs/repo/BUILD");
config.create(
"embedded_tools/tools/build_defs/build_info/bazel_cc_build_info.bzl",
"""
def _impl(ctx):
volatile_file = ctx.actions.declare_file("volatile_file.h")
non_volatile_file = ctx.actions.declare_file("non_volatile_file.h")
redacted_file = ctx.actions.declare_file("redacted_file.h")
ctx.actions.write(output = volatile_file, content = "")
ctx.actions.write(output = non_volatile_file, content = "")
ctx.actions.write(output = redacted_file, content = "")
output_groups = {
"non_redacted_build_info_files": depset([volatile_file, non_volatile_file]),
"redacted_build_info_files": depset([redacted_file]),
}
return OutputGroupInfo(**output_groups)
bazel_cc_build_info = rule(implementation = _impl)
""");
config.create(
"embedded_tools/tools/build_defs/build_info/bazel_java_build_info.bzl",
"""
def _impl(ctx):
volatile_file = ctx.actions.declare_file("volatile_file.properties")
non_volatile_file = ctx.actions.declare_file("non_volatile_file.properties")
redacted_file = ctx.actions.declare_file("redacted_file.properties")
ctx.actions.write(output = volatile_file, content = "")
ctx.actions.write(output = non_volatile_file, content = "")
ctx.actions.write(output = redacted_file, content = "")
output_groups = {
"non_redacted_build_info_files": depset([volatile_file, non_volatile_file]),
"redacted_build_info_files": depset([redacted_file]),
}
return OutputGroupInfo(**output_groups)
bazel_java_build_info = rule(implementation = _impl)
""");
config.create(
"embedded_tools/tools/build_defs/build_info/BUILD",
"""
load("//tools/build_defs/build_info:bazel_cc_build_info.bzl", "bazel_cc_build_info")
load("//tools/build_defs/build_info:bazel_java_build_info.bzl", "bazel_java_build_info")
bazel_cc_build_info(
name = "cc_build_info",
visibility = ["//visibility:public"],
)
bazel_java_build_info(
name = "java_build_info",
visibility = ["//visibility:public"],
)
""");
config.create(
"embedded_tools/tools/build_defs/repo/utils.bzl",
"""
def maybe(repo_rule, name, **kwargs):
if name not in native.existing_rules():
repo_rule(name = name, **kwargs)
""");
config.create(
"embedded_tools/tools/build_defs/repo/http.bzl",
"""
def http_archive(**kwargs):
pass
def http_file(**kwargs):
pass
def http_jar(**kwargs):
pass
""");
config.create("embedded_tools/tools/jdk/jdk_build_file.bzl", "JDK_BUILD_TEMPLATE = ''");
config.create(
"embedded_tools/tools/jdk/local_java_repository.bzl",
"""
def local_java_repository(**kwargs):
pass
""");
config.create(
"embedded_tools/tools/jdk/remote_java_repository.bzl",
"""
def remote_java_repository(**kwargs):
pass
""");
config.create(
"embedded_tools/tools/cpp/cc_configure.bzl",
"""
def cc_configure(**kwargs):
pass
""");
config.create("embedded_tools/tools/sh/BUILD");
config.create(
"embedded_tools/tools/sh/sh_configure.bzl",
"""
def sh_configure(**kwargs):
pass
""");
config.create("embedded_tools/tools/osx/BUILD");
config.create(
"embedded_tools/tools/osx/xcode_configure.bzl",
"""
# no positional arguments for XCode
def xcode_configure(*args, **kwargs):
pass
""");
config.create("embedded_tools/bin/sh", "def sh(**kwargs):", " pass");
}
@Override
public ImmutableMap<String, NonRegistryOverride> getBuiltinModules(BlazeDirectories directories) {
ImmutableMap<String, String> moduleNameToPath =
ImmutableMap.<String, String>builder()
.put("bazel_tools", "embedded_tools")
.put("platforms", "platforms_workspace")
.put("rules_java", "rules_java_workspace")
.put("com_google_protobuf", "protobuf_workspace")
.put("rules_proto", "third_party/bazel_rules/rules_proto")
.put("build_bazel_apple_support", "build_bazel_apple_support")
.put("local_config_xcode", "local_config_xcode_workspace")
.put("rules_cc", "third_party/bazel_rules/rules_cc")
.buildOrThrow();
return moduleNameToPath.entrySet().stream()
.collect(
toImmutableMap(
Map.Entry::getKey,
e ->
LocalPathOverride.create(
directories
.getWorkingDirectory()
.getRelative(e.getValue())
.getPathString())));
}
@Override
public ConfiguredRuleClassProvider createRuleClassProvider() {
return TestRuleClassProvider.getRuleClassProviderWithClearedSuffix();
}
@Override
public boolean isThisBazel() {
return true;
}
@Override
public MockCcSupport ccSupport() {
return BazelMockCcSupport.INSTANCE;
}
@Override
public AbstractMockJavaSupport javaSupport() {
return AbstractMockJavaSupport.BAZEL;
}
@Override
public MockPythonSupport pySupport() {
return BazelMockPythonSupport.INSTANCE;
}
@Override
public void addExtraRepositoryFunctions(
ImmutableMap.Builder<String, RepositoryFunction> repositoryHandlers) {
repositoryHandlers.put(LocalConfigPlatformRule.NAME, new LocalConfigPlatformFunction());
}
}