| 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, |
| } |