# Copyright (C) 2021 The Android Open Source Project # # 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. # A repository rule to run soong_ui --make-mode to provide the Bazel standalone # build with prebuilts from Make/Soong that Bazel can't build yet. def _impl(rctx): target_product = rctx.os.environ.get("TARGET_PRODUCT", "aosp_arm") target_build_variant = rctx.os.environ.get("TARGET_BUILD_VARIANT", "eng") binaries = rctx.attr.binaries target_modules = rctx.attr.target_module_files build_dir = rctx.path(Label("//:WORKSPACE")).dirname soong_ui_bash = str(build_dir) + "/build/soong/soong_ui.bash" args = [ soong_ui_bash, "--make-mode", "--skip-soong-tests", ] all_modules = target_modules.keys() + binaries args += all_modules rctx.report_progress("Building modules with Soong: %s" % str(all_modules)) out_dir = str(build_dir.dirname) + "/make_injection" exec_result = rctx.execute( args, environment = { "OUT_DIR": out_dir, "TARGET_PRODUCT": target_product, "TARGET_BUILD_VARIANT": target_build_variant, "TOP": str(build_dir.dirname.dirname.dirname), }, quiet = False, # stream stdout so it shows progress timeout = 3600, # default of 600 seconds is not sufficient ) if exec_result.return_code != 0: fail(exec_result.stderr) # Get the explicit list of host binary paths to be exported rctx.symlink(out_dir + "/host/linux-x86", "host/linux-x86") binary_path_prefix = "host/linux-x86/bin" binary_paths = ['"%s/%s"' % (binary_path_prefix, binary) for binary in binaries] # Get the explicit list of target installed files to be exported rctx.symlink(out_dir + "/target", "target") target_path_prefix = "target/product/generic" target_paths = [] for paths in target_modules.values(): target_paths.extend(['"%s/%s"' % (target_path_prefix, path) for path in paths]) exports_files = """exports_files([ %s ]) """ % ",\n ".join(binary_paths + target_paths) rctx.file("BUILD", exports_files) make_injection_repository = repository_rule( implementation = _impl, doc = """This rule exposes Soong prebuilts for migrating the build to Bazel. This rule allows the Bazel build (i.e. b build //bionic/...) to depend on prebuilts from Soong. A use case is to allow the Bazel build to use prebuilt host tools in the Bazel rules toolchains without first converting them to Bazel.""", attrs = { "binaries": attr.string_list(default = [], doc = "A list of host binary modules built for linux-x86."), "target_module_files": attr.string_list_dict(default = {}, doc = "A dict of modules to the target files that should be exported."), # See b/210399979 "watch_android_bp_files": attr.label_list(allow_files = [".bp"], default = [], doc = "A list of Android.bp files to watch for changes to invalidate this repository rule."), }, environ = ["TARGET_PRODUCT", "TARGET_BUILD_VARIANT"], )