From 83eeebb4df97ca5f0dbae62ce1664dc612215d8e Mon Sep 17 00:00:00 2001 From: Jingwen Chen Date: Wed, 5 Oct 2022 02:27:07 +0000 Subject: [PATCH] envsetup: add bmod to get Bazel label of a Soong module. This benefits interactive workflows of folks who are used to typing just module names on the command line, and lowers the cognitive load to find the package name, and can be used to check if a module is converted. Can be used as : $ bmod libaapt2 //frameworks/base/tools/aapt2:libaapt2 $ b build $(bmod aapt2) If the mod is not in the bp2build metrics file, it returns: $ bmod nonexistent nonexistent is not converted to Bazel. Test: build/make/core/tests/b_tests.sh Change-Id: I245665a393621a47598e6743c0fedcd87ac33631 --- envsetup.sh | 39 +++++++++++++++++++++++++++++++++++++++ tests/b_tests.sh | 5 +++++ 2 files changed, 44 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index 9b47d3baac..9e7e6f5d81 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -38,6 +38,7 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - godir: Go to the directory containing a file. - allmod: List all modules. - gomod: Go to the directory containing a module. +- bmod: Get the Bazel label of a Soong module if it is converted with bp2build. - pathmod: Get the directory containing a module. - outmod: Gets the location of a module's installed outputs with a certain extension. - dirmods: Gets the modules defined in a given directory. @@ -430,6 +431,7 @@ function addcompletions() complete -F _complete_android_module_names gomod complete -F _complete_android_module_names outmod complete -F _complete_android_module_names installmod + complete -F _complete_android_module_names bmod complete -F _complete_android_module_names m } @@ -1608,6 +1610,43 @@ function allmod() { python3 -c "import json; print('\n'.join(sorted(json.load(open('$ANDROID_PRODUCT_OUT/module-info.json')).keys())))" } +# Return the Bazel label of a Soong module if it is converted with bp2build. +function bmod() +( + if [ $# -ne 1 ]; then + echo "usage: bmod " >&2 + return 1 + fi + + # We could run bp2build here, but it might trigger bp2build invalidation + # when used with `b` (e.g. --run_soong_tests) and/or add unnecessary waiting + # time overhead. + # + # For a snappy result, use the latest generated version in soong_injection, + # and ask users to run m bp2build if it doesn't exist. + converted_json="out/soong/soong_injection/metrics/converted_modules_path_map.json" + + if [ ! -f $(gettop)/${converted_json} ]; then + echo "bp2build files not found. Have you ran 'm bp2build'?" >&2 + return 1 + fi + + local target_label=$(python3 -c "import json +module = '$1' +converted_json='$converted_json' +bp2build_converted_map = json.load(open(converted_json)) +if module not in bp2build_converted_map: + exit(1) +print(bp2build_converted_map[module] + ':' + module)") + + if [ -z "${target_label}" ]; then + echo "$1 is not converted to Bazel." >&2 + return 1 + else + echo "${target_label}" + fi +) + # Get the path of a specific module in the android tree, as cached in module-info.json. # If any build change is made, and it should be reflected in the output, you should run # 'refreshmod' first. Note: This is the inverse of dirmods. diff --git a/tests/b_tests.sh b/tests/b_tests.sh index 6bc6519985..f4e043cfc0 100755 --- a/tests/b_tests.sh +++ b/tests/b_tests.sh @@ -26,3 +26,8 @@ b build --run-soong-tests "$test_target" b --run-soong-tests build "$test_target" b cquery 'kind(test, //build/bazel/examples/android_app/...)' --config=android b run $test_target -- --help >/dev/null + +# Workflow tests for bmod +bmod libm +b run $(bmod fastboot) -- help +b build $(bmod libm) $(bmod libcutils) --config=android