kleaf: SSOT for all supported architectures.
Instead of declaring the architectures in BUILD.bazel,
move it to architecture_constants.bzl so it is easier
to add more toolchains for all supported architectures.
This change intentionally violates DAMP because the
target names are implementation details and should
only be used by register.bzl. Their visbility has also
been private ever since.
Bug: 253562056
Test: TH
Change-Id: I4d4aa48c44a36065ebd4c7171050bf96405deac0
diff --git a/kleaf/BUILD.bazel b/kleaf/BUILD.bazel
index bc6eca9..3b47f66 100644
--- a/kleaf/BUILD.bazel
+++ b/kleaf/BUILD.bazel
@@ -17,18 +17,17 @@
"@kernel_toolchain_info//:dict.bzl",
"VARS",
)
-load(
- ":clang_toolchain.bzl",
- "android_arm64_clang_toolchain",
- "android_arm_clang_toolchain",
- "android_i386_clang_toolchain",
- "android_riscv64_clang_toolchain",
- "android_x86_64_clang_toolchain",
- "linux_x86_64_clang_toolchain",
-)
+load(":architecture_constants.bzl", "SUPPORTED_ARCHITECTURES")
+load(":clang_toolchain.bzl", "clang_toolchain")
load(":versions.bzl", "VERSIONS")
bzl_library(
+ name = "architecture_constants",
+ srcs = ["architecture_constants.bzl"],
+ visibility = ["//visibility:private"],
+)
+
+bzl_library(
name = "versions",
srcs = ["versions.bzl"],
visibility = ["//visibility:public"],
@@ -38,42 +37,22 @@
name = "register",
srcs = ["register.bzl"],
visibility = ["//visibility:public"],
- deps = [":versions"],
+ deps = [
+ ":architecture_constants",
+ ":versions",
+ ],
)
-# Default toolchain for cc_* rules.
+# Default toolchains.
-linux_x86_64_clang_toolchain(
- name = "linux_x86_64_clang_toolchain",
+[clang_toolchain(
+ name = "{}_{}_clang_toolchain".format(target_os, target_cpu),
clang_version = VARS["CLANG_VERSION"],
-)
+ target_cpu = target_cpu,
+ target_os = target_os,
+) for target_os, target_cpu in SUPPORTED_ARCHITECTURES]
-android_arm64_clang_toolchain(
- name = "android_arm64_clang_toolchain",
- clang_version = VARS["CLANG_VERSION"],
-)
-
-android_arm_clang_toolchain(
- name = "android_arm_clang_toolchain",
- clang_version = VARS["CLANG_VERSION"],
-)
-
-android_i386_clang_toolchain(
- name = "android_i386_clang_toolchain",
- clang_version = VARS["CLANG_VERSION"],
-)
-
-android_x86_64_clang_toolchain(
- name = "android_x86_64_clang_toolchain",
- clang_version = VARS["CLANG_VERSION"],
-)
-
-android_riscv64_clang_toolchain(
- name = "android_riscv64_clang_toolchain",
- clang_version = VARS["CLANG_VERSION"],
-)
-
-# Extra toolchain for kernel_* rules
+# Versioned toolchains: extra toolchains when a certain version is requested.
constraint_setting(name = "clang_version")
@@ -83,38 +62,10 @@
visibility = ["//visibility:public"],
) for version in VERSIONS]
-[linux_x86_64_clang_toolchain(
- name = version + "_linux_x86_64_clang_toolchain",
+[clang_toolchain(
+ name = "{}_{}_{}_clang_toolchain".format(version, target_os, target_cpu),
clang_version = version,
extra_compatible_with = [version],
-) for version in VERSIONS]
-
-[android_arm64_clang_toolchain(
- name = version + "_android_arm64_clang_toolchain",
- clang_version = version,
- extra_compatible_with = [version],
-) for version in VERSIONS]
-
-[android_arm_clang_toolchain(
- name = version + "_android_arm_clang_toolchain",
- clang_version = version,
- extra_compatible_with = [version],
-) for version in VERSIONS]
-
-[android_i386_clang_toolchain(
- name = version + "_android_i386_clang_toolchain",
- clang_version = version,
- extra_compatible_with = [version],
-) for version in VERSIONS]
-
-[android_x86_64_clang_toolchain(
- name = version + "_android_x86_64_clang_toolchain",
- clang_version = version,
- extra_compatible_with = [version],
-) for version in VERSIONS]
-
-[android_riscv64_clang_toolchain(
- name = version + "_android_riscv64_clang_toolchain",
- clang_version = version,
- extra_compatible_with = [version],
-) for version in VERSIONS]
+ target_cpu = target_cpu,
+ target_os = target_os,
+) for version in VERSIONS for target_os, target_cpu in SUPPORTED_ARCHITECTURES]
diff --git a/kleaf/architecture_constants.bzl b/kleaf/architecture_constants.bzl
new file mode 100644
index 0000000..400be31
--- /dev/null
+++ b/kleaf/architecture_constants.bzl
@@ -0,0 +1,24 @@
+# Copyright (C) 2023 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.
+
+"""List of supported architectures by Kleaf."""
+
+SUPPORTED_ARCHITECTURES = [
+ ("linux", "x86_64"),
+ ("android", "arm64"),
+ ("android", "arm"),
+ ("android", "x86_64"),
+ ("android", "i386"),
+ ("android", "riscv64"),
+]
diff --git a/kleaf/clang_toolchain.bzl b/kleaf/clang_toolchain.bzl
index 50073f7..830cc64 100644
--- a/kleaf/clang_toolchain.bzl
+++ b/kleaf/clang_toolchain.bzl
@@ -19,9 +19,10 @@
"@kernel_toolchain_info//:dict.bzl",
"VARS",
)
+load(":architecture_constants.bzl", "SUPPORTED_ARCHITECTURES")
load(":clang_config.bzl", "clang_config")
-def clang_toolchain(
+def _clang_toolchain_internal(
name,
clang_version,
target_cpu,
@@ -156,20 +157,42 @@
toolchain_type = CPP_TOOLCHAIN_TYPE,
)
-def linux_x86_64_clang_toolchain(
+def clang_toolchain(
name,
clang_version,
+ target_cpu,
+ target_os,
extra_compatible_with = None):
- """Declare an linux_x86_64 toolchain.
+ """Declare a clang toolchain for the given OS-architecture.
+
+ The toolchain should be under `prebuilts/clang/host/linux-x86`.
Args:
- name: name prefix
- clang_version: `CLANG_VERSION`
- extra_compatible_with: extra `exec_compatible_with` and `target_compatible_with`
+ name: name of the toolchain
+ clang_version: nonconfigurable. version of the toolchain
+ target_cpu: nonconfigurable. CPU of the toolchain
+ target_os: nonconfigurable. OS of the toolchain
+ extra_compatible_with: nonconfigurable. extra `exec_compatible_with` and `target_compatible_with`
"""
- clang_toolchain(
+
+ if sorted(ARCH_CONFIG.keys()) != sorted(SUPPORTED_ARCHITECTURES):
+ fail("FATAL: ARCH_CONFIG is not up-to-date with SUPPORTED_ARCHITECTURES!")
+
+ extra_kwargs = ARCH_CONFIG[(target_os, target_cpu)]
+
+ _clang_toolchain_internal(
name = name,
clang_version = clang_version,
+ target_os = target_os,
+ target_cpu = target_cpu,
+ extra_compatible_with = extra_compatible_with,
+ **extra_kwargs
+ )
+
+# Keys: (target_os, target_cpu)
+# Values: arguments to clang_toolchain()
+ARCH_CONFIG = {
+ ("linux", "x86_64"): dict(
linker_files = [
# From _setup_env.sh, HOSTLDFLAGS
Label("//prebuilts/kernel-build-tools:linux-x86-libs"),
@@ -178,124 +201,37 @@
# sysroot_flags+="--sysroot=${ROOT_DIR}/build/kernel/build-tools/sysroot "
sysroot_label = Label("//build/kernel:sysroot"),
sysroot_path = "build/kernel/build-tools/sysroot",
- target_cpu = "x86_64",
- target_os = "linux",
- extra_compatible_with = extra_compatible_with,
- )
-
-def android_arm64_clang_toolchain(
- name,
- clang_version,
- extra_compatible_with = None):
- """Declare an android_arm64 toolchain.
-
- Args:
- name: name prefix
- clang_version: `CLANG_VERSION`
- extra_compatible_with: extra `exec_compatible_with` and `target_compatible_with`
- """
- clang_toolchain(
- name = name,
- clang_version = clang_version,
+ ),
+ ("android", "arm64"): dict(
ndk_triple = VARS.get("AARCH64_NDK_TRIPLE"),
# From _setup_env.sh: when NDK triple is set,
# --sysroot=${NDK_DIR}/toolchains/llvm/prebuilt/linux-x86_64/sysroot
sysroot_label = "@prebuilt_ndk//:sysroot" if "AARCH64_NDK_TRIPLE" in VARS else None,
sysroot_path = "external/prebuilt_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot" if "AARCH64_NDK_TRIPLE" in VARS else None,
- target_cpu = "arm64",
- target_os = "android",
- extra_compatible_with = extra_compatible_with,
- )
-
-def android_arm_clang_toolchain(
- name,
- clang_version,
- extra_compatible_with = None):
- """Declare an android_arm (32-bit) toolchain.
-
- Args:
- name: name prefix
- clang_version: `CLANG_VERSION`
- extra_compatible_with: extra `exec_compatible_with` and `target_compatible_with`
- """
- clang_toolchain(
- name = name,
- clang_version = clang_version,
+ ),
+ ("android", "arm"): dict(
ndk_triple = VARS.get("ARM_NDK_TRIPLE"),
# From _setup_env.sh: when NDK triple is set,
# --sysroot=${NDK_DIR}/toolchains/llvm/prebuilt/linux-x86_64/sysroot
sysroot_label = "@prebuilt_ndk//:sysroot" if "ARM_NDK_TRIPLE" in VARS else None,
sysroot_path = "external/prebuilt_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot" if "AARCH64_NDK_TRIPLE" in VARS else None,
- target_cpu = "arm",
- target_os = "android",
- extra_compatible_with = extra_compatible_with,
- )
-
-def android_x86_64_clang_toolchain(
- name,
- clang_version,
- extra_compatible_with = None):
- """Declare an android_x86_64 toolchain.
-
- Args:
- name: name prefix
- clang_version: `CLANG_VERSION`
- extra_compatible_with: extra `exec_compatible_with` and `target_compatible_with`
- """
- clang_toolchain(
- name = name,
- clang_version = clang_version,
+ ),
+ ("android", "x86_64"): dict(
ndk_triple = VARS.get("X86_64_NDK_TRIPLE"),
# From _setup_env.sh: when NDK triple is set,
# --sysroot=${NDK_DIR}/toolchains/llvm/prebuilt/linux-x86_64/sysroot
sysroot_label = "@prebuilt_ndk//:sysroot" if "X86_64_NDK_TRIPLE" in VARS else None,
sysroot_path = "external/prebuilt_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot" if "X86_64_NDK_TRIPLE" in VARS else None,
- target_cpu = "x86_64",
- target_os = "android",
- extra_compatible_with = extra_compatible_with,
- )
-
-def android_i386_clang_toolchain(
- name,
- clang_version,
- extra_compatible_with = None):
- """Declare an android_i386 toolchain.
-
- Args:
- name: name prefix
- clang_version: `CLANG_VERSION`
- extra_compatible_with: extra `exec_compatible_with` and `target_compatible_with`
- """
- clang_toolchain(
- name = name,
- clang_version = clang_version,
+ ),
+ ("android", "i386"): dict(
# i386 uses the same NDK_TRIPLE as x86_64
ndk_triple = VARS.get("X86_64_NDK_TRIPLE"),
# From _setup_env.sh: when NDK triple is set,
# --sysroot=${NDK_DIR}/toolchains/llvm/prebuilt/linux-x86_64/sysroot
sysroot_label = "@prebuilt_ndk//:sysroot" if "X86_64_NDK_TRIPLE" in VARS else None,
sysroot_path = "external/prebuilt_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot" if "X86_64_NDK_TRIPLE" in VARS else None,
- target_cpu = "i386",
- target_os = "android",
- extra_compatible_with = extra_compatible_with,
- )
-
-def android_riscv64_clang_toolchain(
- name,
- clang_version,
- extra_compatible_with = None):
- """Declare an android_riscv toolchain.
-
- Args:
- name: name prefix
- clang_version: `CLANG_VERSION`
- extra_compatible_with: extra `exec_compatible_with` and `target_compatible_with`
- """
- clang_toolchain(
- name = name,
- clang_version = clang_version,
- target_cpu = "riscv64",
- target_os = "android",
- extra_compatible_with = extra_compatible_with,
+ ),
+ ("android", "riscv64"): dict(
# TODO(b/271919464): We need NDK_TRIPLE for riscv
- )
+ ),
+}
diff --git a/kleaf/register.bzl b/kleaf/register.bzl
index 43ed6a4..72a3950 100644
--- a/kleaf/register.bzl
+++ b/kleaf/register.bzl
@@ -14,26 +14,19 @@
"""Registers all clang toolchains defined in this package."""
+load(":architecture_constants.bzl", "SUPPORTED_ARCHITECTURES")
load(":versions.bzl", "VERSIONS")
# buildifier: disable=unnamed-macro
def register_clang_toolchains():
"""Registers all clang toolchains defined in this package."""
for version in VERSIONS:
- native.register_toolchains(
- "//prebuilts/clang/host/linux-x86/kleaf:{}_android_arm64_clang_toolchain".format(version),
- "//prebuilts/clang/host/linux-x86/kleaf:{}_android_arm_clang_toolchain".format(version),
- "//prebuilts/clang/host/linux-x86/kleaf:{}_android_i386_clang_toolchain".format(version),
- "//prebuilts/clang/host/linux-x86/kleaf:{}_android_riscv64_clang_toolchain".format(version),
- "//prebuilts/clang/host/linux-x86/kleaf:{}_android_x86_64_clang_toolchain".format(version),
- "//prebuilts/clang/host/linux-x86/kleaf:{}_linux_x86_64_clang_toolchain".format(version),
- )
+ for target_os, target_cpu in SUPPORTED_ARCHITECTURES:
+ native.register_toolchains(
+ "//prebuilts/clang/host/linux-x86/kleaf:{}_{}_{}_clang_toolchain".format(version, target_os, target_cpu),
+ )
- native.register_toolchains(
- "//prebuilts/clang/host/linux-x86/kleaf:android_arm64_clang_toolchain",
- "//prebuilts/clang/host/linux-x86/kleaf:android_arm_clang_toolchain",
- "//prebuilts/clang/host/linux-x86/kleaf:android_i386_clang_toolchain",
- "//prebuilts/clang/host/linux-x86/kleaf:android_riscv64_clang_toolchain",
- "//prebuilts/clang/host/linux-x86/kleaf:android_x86_64_clang_toolchain",
- "//prebuilts/clang/host/linux-x86/kleaf:linux_x86_64_clang_toolchain",
- )
+ for target_os, target_cpu in SUPPORTED_ARCHITECTURES:
+ native.register_toolchains(
+ "//prebuilts/clang/host/linux-x86/kleaf:{}_{}_clang_toolchain".format(target_os, target_cpu),
+ )