summaryrefslogtreecommitdiff
path: root/android/bazel_handler.go
diff options
context:
space:
mode:
Diffstat (limited to 'android/bazel_handler.go')
-rw-r--r--android/bazel_handler.go81
1 files changed, 57 insertions, 24 deletions
diff --git a/android/bazel_handler.go b/android/bazel_handler.go
index c2fd95400..40cc6a2d3 100644
--- a/android/bazel_handler.go
+++ b/android/bazel_handler.go
@@ -205,6 +205,9 @@ type bazelContext struct {
bazelEnabledModules map[string]bool
// If true, modules are bazel-enabled by default, unless present in bazelDisabledModules.
modulesDefaultToBazel bool
+
+ targetProduct string
+ targetBuildVariant string
}
var _ BazelContext = &bazelContext{}
@@ -460,6 +463,18 @@ func NewBazelContext(c *config) (BazelContext, error) {
if len(missing) > 0 {
return nil, fmt.Errorf("missing required env vars to use bazel: %s", missing)
}
+
+ targetBuildVariant := "user"
+ if c.Eng() {
+ targetBuildVariant = "eng"
+ } else if c.Debuggable() {
+ targetBuildVariant = "userdebug"
+ }
+ targetProduct := "unknown"
+ if c.HasDeviceProduct() {
+ targetProduct = c.DeviceProduct()
+ }
+
return &bazelContext{
bazelRunner: &builtinBazelRunner{},
paths: &paths,
@@ -467,6 +482,8 @@ func NewBazelContext(c *config) (BazelContext, error) {
modulesDefaultToBazel: c.BuildMode == BazelDevMode,
bazelEnabledModules: enabledModules,
bazelDisabledModules: disabledModules,
+ targetProduct: targetProduct,
+ targetBuildVariant: targetBuildVariant,
}, nil
}
@@ -563,9 +580,9 @@ func (r *builtinBazelRunner) createBazelCommand(paths *bazelPaths, runName bazel
// The actual platform values here may be overridden by configuration
// transitions from the buildroot.
fmt.Sprintf("--extra_toolchains=%s", "//prebuilts/clang/host/linux-x86:all"),
- // This should be parameterized on the host OS, but let's restrict to linux
- // to keep things simple for now.
- fmt.Sprintf("--host_platform=%s", "//build/bazel/platforms:linux_x86_64"),
+
+ // We don't need to set --host_platforms because it's set in bazelrc files
+ // that the bazel shell script wrapper passes
// Explicitly disable downloading rules (such as canonical C++ and Java rules) from the network.
"--experimental_repository_disable_download",
@@ -610,8 +627,12 @@ func (context *bazelContext) mainBzlFileContents() []byte {
#####################################################
def _config_node_transition_impl(settings, attr):
+ if attr.os == "android" and attr.arch == "target":
+ target = "{PRODUCT}-{VARIANT}"
+ else:
+ target = "{PRODUCT}-{VARIANT}_%s_%s" % (attr.os, attr.arch)
return {
- "//command_line_option:platforms": "@//build/bazel/platforms:%s_%s" % (attr.os, attr.arch),
+ "//command_line_option:platforms": "@soong_injection//product_config_platforms/products/{PRODUCT}-{VARIANT}:%s" % target,
}
_config_node_transition = transition(
@@ -658,7 +679,12 @@ phony_root = rule(
attrs = {"deps" : attr.label_list()},
)
`
- return []byte(contents)
+
+ productReplacer := strings.NewReplacer(
+ "{PRODUCT}", context.targetProduct,
+ "{VARIANT}", context.targetBuildVariant)
+
+ return []byte(productReplacer.Replace(contents))
}
func (context *bazelContext) mainBuildFileContents() []byte {
@@ -780,26 +806,24 @@ def json_encode(input):
t = type(p)
if t == "string" or t == "int":
return repr(p)
- fail("unsupported value '%%s' of type '%%s'" %% (p, type(p)))
+ fail("unsupported value '%s' of type '%s'" % (p, type(p)))
def encode_list(list):
- return "[%%s]" %% ", ".join([encode_primitive(item) for item in list])
+ return "[%s]" % ", ".join([encode_primitive(item) for item in list])
def encode_list_or_primitive(v):
return encode_list(v) if type(v) == "list" else encode_primitive(v)
if type(input) == "dict":
# TODO(juu): the result is read line by line so can't use '\n' yet
- kv_pairs = [("%%s: %%s" %% (encode_primitive(k), encode_list_or_primitive(v))) for (k, v) in input.items()]
- return "{ %%s }" %% ", ".join(kv_pairs)
+ kv_pairs = [("%s: %s" % (encode_primitive(k), encode_list_or_primitive(v))) for (k, v) in input.items()]
+ return "{ %s }" % ", ".join(kv_pairs)
else:
return encode_list_or_primitive(input)
-# Label Map Section
-%s
+{LABEL_REGISTRATION_MAP_SECTION}
-# Function Def Section
-%s
+{FUNCTION_DEF_SECTION}
def get_arch(target):
# TODO(b/199363072): filegroups and file targets aren't associated with any
@@ -811,22 +835,26 @@ def get_arch(target):
# File targets do not have buildoptions. File targets aren't associated with
# any specific platform architecture in mixed builds, so use the host.
return "x86_64|linux"
- platforms = build_options(target)["//command_line_option:platforms"]
+ platforms = buildoptions["//command_line_option:platforms"]
if len(platforms) != 1:
# An individual configured target should have only one platform architecture.
# Note that it's fine for there to be multiple architectures for the same label,
# but each is its own configured target.
fail("expected exactly 1 platform for " + str(target.label) + " but got " + str(platforms))
- platform_name = build_options(target)["//command_line_option:platforms"][0].name
+ platform_name = platforms[0].name
if platform_name == "host":
return "HOST"
+ if not platform_name.startswith("{TARGET_PRODUCT}-{TARGET_BUILD_VARIANT}"):
+ fail("expected platform name of the form '{TARGET_PRODUCT}-{TARGET_BUILD_VARIANT}_android_<arch>' or '{TARGET_PRODUCT}-{TARGET_BUILD_VARIANT}_linux_<arch>', but was " + str(platforms))
+ platform_name = platform_name.removeprefix("{TARGET_PRODUCT}-{TARGET_BUILD_VARIANT}").removeprefix("_")
+ if not platform_name:
+ return "target|android"
elif platform_name.startswith("android_"):
- return platform_name[len("android_"):] + "|" + platform_name[:len("android_")-1]
+ return platform_name.removeprefix("android_") + "|android"
elif platform_name.startswith("linux_"):
- return platform_name[len("linux_"):] + "|" + platform_name[:len("linux_")-1]
+ return platform_name.removeprefix("linux_") + "|linux"
else:
- fail("expected platform name of the form 'android_<arch>' or 'linux_<arch>', but was " + str(platforms))
- return "UNKNOWN"
+ fail("expected platform name of the form '{TARGET_PRODUCT}-{TARGET_BUILD_VARIANT}_android_<arch>' or '{TARGET_PRODUCT}-{TARGET_BUILD_VARIANT}_linux_<arch>', but was " + str(platforms))
def format(target):
id_string = str(target.label) + "|" + get_arch(target)
@@ -835,15 +863,20 @@ def format(target):
if id_string.startswith("//"):
id_string = "@" + id_string
- # Main switch section
- %s
+ {MAIN_SWITCH_SECTION}
+
# This target was not requested via cquery, and thus must be a dependency
# of a requested target.
return id_string + ">>NONE"
`
-
- return []byte(fmt.Sprintf(formatString, labelRegistrationMapSection, functionDefSection,
- mainSwitchSection))
+ replacer := strings.NewReplacer(
+ "{TARGET_PRODUCT}", context.targetProduct,
+ "{TARGET_BUILD_VARIANT}", context.targetBuildVariant,
+ "{LABEL_REGISTRATION_MAP_SECTION}", labelRegistrationMapSection,
+ "{FUNCTION_DEF_SECTION}", functionDefSection,
+ "{MAIN_SWITCH_SECTION}", mainSwitchSection)
+
+ return []byte(replacer.Replace(formatString))
}
// Returns a path containing build-related metadata required for interfacing