273 lines
11 KiB
Python
273 lines
11 KiB
Python
load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES")
|
|
load("@soong_injection//cc_toolchain:config_constants.bzl", _generated_config_constants = "constants")
|
|
load("@soong_injection//cc_toolchain:sanitizer_constants.bzl", _generated_sanitizer_constants = "constants")
|
|
|
|
# This file uses structs to organize and control the visibility of symbols.
|
|
|
|
# Handcrafted default flags.
|
|
flags = struct(
|
|
# =============
|
|
# Compiler flags
|
|
# =============
|
|
compiler_flags = [
|
|
],
|
|
# ============
|
|
# Linker flags
|
|
# ============
|
|
host_non_windows_dynamic_executable_linker_flags = [
|
|
"-pie",
|
|
],
|
|
bionic_linker_flags = [
|
|
# These are the linker flags for OSes that use Bionic: LinuxBionic, Android
|
|
"-nostdlib",
|
|
"-Wl,--gc-sections",
|
|
],
|
|
bionic_static_executable_linker_flags = [
|
|
"-Bstatic",
|
|
],
|
|
bionic_dynamic_executable_linker_flags = [
|
|
"-pie",
|
|
"-Bdynamic",
|
|
"-Wl,-z,nocopyreloc",
|
|
],
|
|
# ===========
|
|
# Other flags
|
|
# ===========
|
|
non_darwin_archiver_flags = [
|
|
"--format=gnu",
|
|
],
|
|
non_external_defines = [
|
|
# These defines should only apply to targets which are not under
|
|
# @external/. This can be controlled by adding "-non_external_compiler_flags"
|
|
# to the features list for external/ packages.
|
|
# This corresponds to special-casing in Soong (see "external/" in build/soong/cc/compiler.go).
|
|
"-DANDROID_STRICT",
|
|
],
|
|
)
|
|
|
|
# Generated flags dumped from Soong's cc toolchain code.
|
|
generated_config_constants = _generated_config_constants
|
|
generated_sanitizer_constants = _generated_sanitizer_constants
|
|
|
|
# The set of C and C++ actions used in the Android build. There are other types
|
|
# of actions available in ACTION_NAMES, but those are not used in
|
|
# Android yet.
|
|
actions = struct(
|
|
compile = [
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
],
|
|
c_and_cpp_compile = [
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
],
|
|
c_compile = ACTION_NAMES.c_compile,
|
|
cpp_compile = ACTION_NAMES.cpp_compile,
|
|
# Assembler actions for .s and .S files.
|
|
assemble = [
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
],
|
|
# Link actions
|
|
link = [
|
|
ACTION_NAMES.cpp_link_executable,
|
|
ACTION_NAMES.cpp_link_dynamic_library,
|
|
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
|
|
],
|
|
# Differentiate archive actions from link actions
|
|
archive = [
|
|
ACTION_NAMES.cpp_link_static_library,
|
|
],
|
|
cpp_link_dynamic_library = ACTION_NAMES.cpp_link_dynamic_library,
|
|
cpp_link_nodeps_dynamic_library = ACTION_NAMES.cpp_link_nodeps_dynamic_library,
|
|
cpp_link_static_library = ACTION_NAMES.cpp_link_static_library,
|
|
cpp_link_executable = ACTION_NAMES.cpp_link_executable,
|
|
strip = ACTION_NAMES.strip,
|
|
)
|
|
|
|
bionic_crt = struct(
|
|
# crtbegin and crtend libraries for compiling cc_library_shared and
|
|
# cc_binary against the Bionic runtime
|
|
shared_library_crtbegin = "//bionic/libc:crtbegin_so",
|
|
shared_library_crtend = "//bionic/libc:crtend_so",
|
|
shared_binary_crtbegin = "//bionic/libc:crtbegin_dynamic",
|
|
static_binary_crtbegin = "//bionic/libc:crtbegin_static",
|
|
binary_crtend = "//bionic/libc:crtend_android",
|
|
)
|
|
|
|
musl_crt = struct(
|
|
# crtbegin and crtend libraries for compiling cc_library_shared and
|
|
# cc_binary against Musl libc
|
|
shared_library_crtbegin = "//external/musl:libc_musl_crtbegin_so",
|
|
shared_library_crtend = "//external/musl:libc_musl_crtend_so",
|
|
shared_binary_crtbegin = "//external/musl:libc_musl_crtbegin_dynamic",
|
|
static_binary_crtbegin = "//external/musl:libc_musl_crtbegin_static",
|
|
binary_crtend = "//external/musl:libc_musl_crtend",
|
|
)
|
|
|
|
default_cpp_std_version = generated_config_constants.CppStdVersion
|
|
experimental_cpp_std_version = generated_config_constants.ExperimentalCppStdVersion
|
|
default_cpp_std_version_no_gnu = generated_config_constants.CppStdVersion.replace("gnu", "c")
|
|
experimental_cpp_std_version_no_gnu = generated_config_constants.ExperimentalCppStdVersion.replace("gnu", "c")
|
|
_cpp_std_versions = {
|
|
"gnu++98": True,
|
|
"gnu++11": True,
|
|
"gnu++17": True,
|
|
"gnu++20": True,
|
|
"gnu++2a": True,
|
|
"gnu++2b": True,
|
|
"c++98": True,
|
|
"c++11": True,
|
|
"c++17": True,
|
|
"c++2a": True,
|
|
}
|
|
_cpp_std_versions[default_cpp_std_version] = True
|
|
_cpp_std_versions[experimental_cpp_std_version] = True
|
|
_cpp_std_versions[default_cpp_std_version_no_gnu] = True
|
|
_cpp_std_versions[experimental_cpp_std_version_no_gnu] = True
|
|
|
|
cpp_std_versions = [k for k in _cpp_std_versions.keys()]
|
|
|
|
default_c_std_version = generated_config_constants.CStdVersion
|
|
experimental_c_std_version = generated_config_constants.ExperimentalCStdVersion
|
|
default_c_std_version_no_gnu = generated_config_constants.CStdVersion.replace("gnu", "c")
|
|
experimental_c_std_version_no_gnu = generated_config_constants.ExperimentalCStdVersion.replace("gnu", "c")
|
|
|
|
_c_std_versions = {
|
|
"gnu99": True,
|
|
"gnu11": True,
|
|
"gnu17": True,
|
|
"c99": True,
|
|
"c11": True,
|
|
"c17": True,
|
|
}
|
|
_c_std_versions[default_c_std_version] = True
|
|
_c_std_versions[experimental_c_std_version] = True
|
|
_c_std_versions[default_c_std_version_no_gnu] = True
|
|
_c_std_versions[experimental_c_std_version_no_gnu] = True
|
|
|
|
c_std_versions = [k for k in _c_std_versions.keys()]
|
|
|
|
# Added by linker.go for non-bionic, non-musl, non-windows toolchains.
|
|
# Should be added to host builds to match the default behavior of device builds.
|
|
device_compatibility_flags_non_windows = [
|
|
"-ldl",
|
|
"-lpthread",
|
|
"-lm",
|
|
]
|
|
|
|
# Added by linker.go for non-bionic, non-musl, non-darwin toolchains.
|
|
# Should be added to host builds to match the default behavior of device builds.
|
|
device_compatibility_flags_non_darwin = ["-lrt"]
|
|
|
|
arches = struct(
|
|
Arm = "arm",
|
|
Arm64 = "arm64",
|
|
X86 = "x86",
|
|
X86_64 = "x86_64",
|
|
)
|
|
|
|
oses = struct(
|
|
Android = "android",
|
|
LinuxGlibc = "linux_glibc",
|
|
LinuxBionic = "linux_bionic",
|
|
LinuxMusl = "linux_musl",
|
|
Darwin = "darwin",
|
|
Windows = "windows",
|
|
)
|
|
|
|
def _variant_combinations(arch_variants = {}, cpu_variants = {}):
|
|
combinations = []
|
|
for arch in arch_variants:
|
|
if "" not in cpu_variants:
|
|
combinations.append(struct(arch_variant = arch, cpu_variant = ""))
|
|
for cpu in cpu_variants:
|
|
combinations.append(struct(arch_variant = arch, cpu_variant = cpu))
|
|
return combinations
|
|
|
|
arch_to_variants = {
|
|
arches.Arm: _variant_combinations(arch_variants = generated_config_constants.ArmArchVariantCflags, cpu_variants = generated_config_constants.ArmCpuVariantCflags),
|
|
arches.Arm64: _variant_combinations(arch_variants = generated_config_constants.Arm64ArchVariantCflags, cpu_variants = generated_config_constants.Arm64CpuVariantCflags),
|
|
arches.X86: _variant_combinations(arch_variants = generated_config_constants.X86ArchVariantCflags),
|
|
arches.X86_64: _variant_combinations(arch_variants = generated_config_constants.X86_64ArchVariantCflags),
|
|
}
|
|
|
|
# enabled_features returns a list of enabled features for the given arch variant, defaults to empty list
|
|
def enabled_features(arch_variant, arch_variant_to_features = {}):
|
|
if arch_variant == None:
|
|
arch_variant = ""
|
|
return arch_variant_to_features.get(arch_variant, [])
|
|
|
|
# variant_name creates a name based on a variant struct with arch_variant and cpu_variant
|
|
def variant_name(variant):
|
|
ret = ""
|
|
if variant.arch_variant:
|
|
ret += "_" + variant.arch_variant
|
|
if variant.cpu_variant:
|
|
ret += "_" + variant.cpu_variant
|
|
return ret
|
|
|
|
# variant_constraints gets constraints based on variant struct and arch_variant_features
|
|
def variant_constraints(variant, arch_variant_features = {}):
|
|
ret = []
|
|
if variant.arch_variant:
|
|
ret.append("//build/bazel/platforms/arch/variants:" + variant.arch_variant)
|
|
if variant.cpu_variant:
|
|
ret.append("//build/bazel/platforms/arch/variants:" + variant.cpu_variant)
|
|
features = enabled_features(variant.arch_variant, arch_variant_features)
|
|
for feature in features:
|
|
ret.append("//build/bazel/platforms/arch/variants:" + feature)
|
|
return ret
|
|
|
|
x86_64_host_toolchains = [
|
|
("cc_toolchain_x86_64_linux_host", "@bazel_tools//tools/cpp:toolchain_type"),
|
|
("cc_toolchain_x86_64_linux_host_nocrt", "nocrt_toolchain"),
|
|
]
|
|
x86_host_toolchains = [
|
|
("cc_toolchain_x86_linux_host", "@bazel_tools//tools/cpp:toolchain_type"),
|
|
("cc_toolchain_x86_linux_host_nocrt", "nocrt_toolchain"),
|
|
]
|
|
|
|
x86_64_musl_host_toolchains = [
|
|
("cc_toolchain_x86_64_linux_musl_host", "@bazel_tools//tools/cpp:toolchain_type"),
|
|
("cc_toolchain_x86_64_linux_musl_host_nocrt", "nocrt_toolchain"),
|
|
]
|
|
|
|
x86_musl_host_toolchains = [
|
|
("cc_toolchain_x86_linux_musl_host", "@bazel_tools//tools/cpp:toolchain_type"),
|
|
("cc_toolchain_x86_linux_musl_host_nocrt", "nocrt_toolchain"),
|
|
]
|
|
|
|
_libclang_rt_prefix = "%s/lib/clang/%s/lib/linux" % (
|
|
generated_config_constants.ClangVersion,
|
|
generated_config_constants.ClangShortVersion,
|
|
)
|
|
|
|
libclang_rt_prebuilt_map = {
|
|
"//build/bazel/platforms/os_arch:android_arm": _libclang_rt_prefix + "/libclang_rt.builtins-arm-android.a",
|
|
"//build/bazel/platforms/os_arch:android_arm64": _libclang_rt_prefix + "/libclang_rt.builtins-aarch64-android.a",
|
|
"//build/bazel/platforms/os_arch:android_x86": _libclang_rt_prefix + "/libclang_rt.builtins-i686-android.a",
|
|
"//build/bazel/platforms/os_arch:android_x86_64": _libclang_rt_prefix + "/libclang_rt.builtins-x86_64-android.a",
|
|
"//build/bazel/platforms/os_arch:linux_bionic_x86_64": _libclang_rt_prefix + "/libclang_rt.builtins-x86_64-android.a",
|
|
"//build/bazel/platforms/os_arch:linux_glibc_x86": _libclang_rt_prefix + "/libclang_rt.builtins-i386.a",
|
|
"//build/bazel/platforms/os_arch:linux_glibc_x86_64": _libclang_rt_prefix + "/libclang_rt.builtins-x86_64.a",
|
|
"//build/bazel/platforms/os_arch:linux_musl_x86": _libclang_rt_prefix + "/i686-unknown-linux-musl/lib/linux/libclang_rt.builtins-i386.a",
|
|
"//build/bazel/platforms/os_arch:linux_musl_x86_64": _libclang_rt_prefix + "/x86_64-unknown-linux-musl/lib/linux/libclang_rt.builtins-x86_64.a",
|
|
"//conditions:default": None,
|
|
}
|
|
|
|
libclang_ubsan_minimal_rt_prebuilt_map = {
|
|
"//build/bazel/platforms/os_arch:android_arm": _libclang_rt_prefix + "/libclang_rt.ubsan_minimal-arm-android.a",
|
|
"//build/bazel/platforms/os_arch:android_arm64": _libclang_rt_prefix + "/libclang_rt.ubsan_minimal-aarch64-android.a",
|
|
"//build/bazel/platforms/os_arch:android_x86": _libclang_rt_prefix + "/libclang_rt.ubsan_minimal-i686-android.a",
|
|
"//build/bazel/platforms/os_arch:android_x86_64": _libclang_rt_prefix + "/libclang_rt.ubsan_minimal-x86_64-android.a",
|
|
"//build/bazel/platforms/os_arch:linux_bionic_x86_64": _libclang_rt_prefix + "/libclang_rt.ubsan_minimal-x86_64-android.a",
|
|
"//build/bazel/platforms/os_arch:linux_glibc_x86": _libclang_rt_prefix + "/libclang_rt.ubsan_minimal-i386.a",
|
|
"//build/bazel/platforms/os_arch:linux_glibc_x86_64": _libclang_rt_prefix + "/libclang_rt.ubsan_minimal-x86_64.a",
|
|
"//build/bazel/platforms/os_arch:linux_musl_x86": _libclang_rt_prefix + "/i686-unknown-linux-musl/lib/linux/libclang_rt.ubsan_minimal-i386.a",
|
|
"//build/bazel/platforms/os_arch:linux_musl_x86_64": _libclang_rt_prefix + "/x86_64-unknown-linux-musl/lib/linux/libclang_rt.ubsan_minimal-x86_64.a",
|
|
"//conditions:default": None,
|
|
}
|