diff --git a/android/bazel_handler.go b/android/bazel_handler.go index fd4b5ef1b..fda8a2251 100644 --- a/android/bazel_handler.go +++ b/android/bazel_handler.go @@ -22,6 +22,7 @@ import ( "os" "path" "path/filepath" + "regexp" "runtime" "sort" "strings" @@ -1054,9 +1055,23 @@ var ( func GetBazelSandwichCqueryRequests(config Config) ([]cqueryKey, error) { result := make([]cqueryKey, 0, len(allowlists.BazelSandwichTargets)) + labelRegex := regexp.MustCompile("^@?//([a-zA-Z0-9/_-]+):[a-zA-Z0-9_-]+$") // Note that bazel "targets" are different from soong "targets", the bazel targets are // synonymous with soong modules, and soong targets are a configuration a module is built in. for _, target := range allowlists.BazelSandwichTargets { + match := labelRegex.FindStringSubmatch(target.Label) + if match == nil { + return nil, fmt.Errorf("invalid label, must match `^@?//([a-zA-Z0-9/_-]+):[a-zA-Z0-9_-]+$`: %s", target.Label) + } + if _, err := os.Stat(absolutePath(match[1])); err != nil { + if os.IsNotExist(err) { + // Ignore bazel sandwich targets that don't exist. + continue + } else { + return nil, err + } + } + var soongTarget Target if target.Host { soongTarget = config.BuildOSTarget diff --git a/tests/lib.sh b/tests/lib.sh index 40b317b06..f337c7457 100644 --- a/tests/lib.sh +++ b/tests/lib.sh @@ -52,6 +52,10 @@ function copy_directory { cp -R "$REAL_TOP/$dir" "$MOCK_TOP/$parent" } +function delete_directory { + rm -rf "$MOCK_TOP/$1" +} + function symlink_file { local file="$1" @@ -138,6 +142,9 @@ function create_mock_bazel { copy_directory build/bazel copy_directory build/bazel_common_rules + # This requires pulling more tools into the mock top to build partitions + delete_directory build/bazel/examples/partitions + symlink_directory packages/modules/common/build symlink_directory prebuilts/bazel symlink_directory prebuilts/clang