1# Copyright (C) 2023 The Android Open Source Project 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") 16load("@soong_injection//cc_toolchain:config_constants.bzl", _generated_config_constants = "constants") 17load("@soong_injection//cc_toolchain:sanitizer_constants.bzl", _generated_sanitizer_constants = "constants") 18 19# This file uses structs to organize and control the visibility of symbols. 20 21# Handcrafted default flags. 22flags = struct( 23 # ============= 24 # Compiler flags 25 # ============= 26 compiler_flags = [ 27 ], 28 # ============ 29 # Linker flags 30 # ============ 31 host_non_windows_dynamic_executable_linker_flags = [ 32 "-pie", 33 ], 34 bionic_linker_flags = [ 35 # These are the linker flags for OSes that use Bionic: LinuxBionic, Android 36 "-nostdlib", 37 "-Wl,--gc-sections", 38 ], 39 bionic_static_executable_linker_flags = [ 40 "-Bstatic", 41 ], 42 bionic_dynamic_executable_linker_flags = [ 43 "-pie", 44 "-Bdynamic", 45 "-Wl,-z,nocopyreloc", 46 ], 47 # =========== 48 # Other flags 49 # =========== 50 non_darwin_archiver_flags = [ 51 "--format=gnu", 52 ], 53 non_external_defines = [ 54 # These defines should only apply to targets which are not under 55 # @external/. This can be controlled by adding "-non_external_compiler_flags" 56 # to the features list for external/ packages. 57 # This corresponds to special-casing in Soong (see "external/" in build/soong/cc/compiler.go). 58 "-DANDROID_STRICT", 59 ], 60) 61 62# Generated flags dumped from Soong's cc toolchain code. 63generated_config_constants = _generated_config_constants 64generated_sanitizer_constants = _generated_sanitizer_constants 65 66# The set of C and C++ actions used in the Android build. There are other types 67# of actions available in ACTION_NAMES, but those are not used in 68# Android yet. 69actions = struct( 70 compile = [ 71 ACTION_NAMES.c_compile, 72 ACTION_NAMES.cpp_compile, 73 ACTION_NAMES.assemble, 74 ACTION_NAMES.preprocess_assemble, 75 ], 76 c_and_cpp_compile = [ 77 ACTION_NAMES.c_compile, 78 ACTION_NAMES.cpp_compile, 79 ], 80 c_compile = ACTION_NAMES.c_compile, 81 cpp_compile = ACTION_NAMES.cpp_compile, 82 # Assembler actions for .s and .S files. 83 assemble = [ 84 ACTION_NAMES.assemble, 85 ACTION_NAMES.preprocess_assemble, 86 ], 87 # Link actions 88 link = [ 89 ACTION_NAMES.cpp_link_executable, 90 ACTION_NAMES.cpp_link_dynamic_library, 91 ACTION_NAMES.cpp_link_nodeps_dynamic_library, 92 ], 93 # Differentiate archive actions from link actions 94 archive = [ 95 ACTION_NAMES.cpp_link_static_library, 96 ], 97 cpp_link_dynamic_library = ACTION_NAMES.cpp_link_dynamic_library, 98 cpp_link_nodeps_dynamic_library = ACTION_NAMES.cpp_link_nodeps_dynamic_library, 99 cpp_link_static_library = ACTION_NAMES.cpp_link_static_library, 100 cpp_link_executable = ACTION_NAMES.cpp_link_executable, 101 strip = ACTION_NAMES.strip, 102) 103 104bionic_crt = struct( 105 # crtbegin and crtend libraries for compiling cc_library_shared and 106 # cc_binary against the Bionic runtime 107 shared_library_crtbegin = "//bionic/libc:crtbegin_so", 108 shared_library_crtend = "//bionic/libc:crtend_so", 109 shared_binary_crtbegin = "//bionic/libc:crtbegin_dynamic", 110 static_binary_crtbegin = "//bionic/libc:crtbegin_static", 111 binary_crtend = "//bionic/libc:crtend_android", 112) 113 114musl_crt = struct( 115 # crtbegin and crtend libraries for compiling cc_library_shared and 116 # cc_binary against Musl libc 117 shared_library_crtbegin = "//external/musl:libc_musl_crtbegin_so", 118 shared_library_crtend = "//external/musl:libc_musl_crtend_so", 119 shared_binary_crtbegin = "//external/musl:libc_musl_crtbegin_dynamic", 120 static_binary_crtbegin = "//external/musl:libc_musl_crtbegin_static", 121 binary_crtend = "//external/musl:libc_musl_crtend", 122) 123 124default_cpp_std_version = generated_config_constants.CppStdVersion 125experimental_cpp_std_version = generated_config_constants.ExperimentalCppStdVersion 126default_cpp_std_version_no_gnu = generated_config_constants.CppStdVersion.replace("gnu", "c") 127experimental_cpp_std_version_no_gnu = generated_config_constants.ExperimentalCppStdVersion.replace("gnu", "c") 128_cpp_std_versions = { 129 "gnu++98": True, 130 "gnu++11": True, 131 "gnu++17": True, 132 "gnu++20": True, 133 "gnu++2a": True, 134 "gnu++2b": True, 135 "c++98": True, 136 "c++11": True, 137 "c++17": True, 138 "c++2a": True, 139} 140_cpp_std_versions[default_cpp_std_version] = True 141_cpp_std_versions[experimental_cpp_std_version] = True 142_cpp_std_versions[default_cpp_std_version_no_gnu] = True 143_cpp_std_versions[experimental_cpp_std_version_no_gnu] = True 144 145cpp_std_versions = [k for k in _cpp_std_versions.keys()] 146 147default_c_std_version = generated_config_constants.CStdVersion 148experimental_c_std_version = generated_config_constants.ExperimentalCStdVersion 149default_c_std_version_no_gnu = generated_config_constants.CStdVersion.replace("gnu", "c") 150experimental_c_std_version_no_gnu = generated_config_constants.ExperimentalCStdVersion.replace("gnu", "c") 151 152_c_std_versions = { 153 "gnu99": True, 154 "gnu11": True, 155 "gnu17": True, 156 "c99": True, 157 "c11": True, 158 "c17": True, 159} 160_c_std_versions[default_c_std_version] = True 161_c_std_versions[experimental_c_std_version] = True 162_c_std_versions[default_c_std_version_no_gnu] = True 163_c_std_versions[experimental_c_std_version_no_gnu] = True 164 165c_std_versions = [k for k in _c_std_versions.keys()] 166 167# Added by linker.go for non-bionic, non-musl, non-windows toolchains. 168# Should be added to host builds to match the default behavior of device builds. 169device_compatibility_flags_non_windows = [ 170 "-ldl", 171 "-lpthread", 172 "-lm", 173] 174 175# Added by linker.go for non-bionic, non-musl, non-darwin toolchains. 176# Should be added to host builds to match the default behavior of device builds. 177device_compatibility_flags_non_darwin = ["-lrt"] 178 179arches = struct( 180 Arm = "arm", 181 Arm64 = "arm64", 182 X86 = "x86", 183 X86_64 = "x86_64", 184) 185 186oses = struct( 187 Android = "android", 188 LinuxGlibc = "linux_glibc", 189 LinuxBionic = "linux_bionic", 190 LinuxMusl = "linux_musl", 191 Darwin = "darwin", 192 Windows = "windows", 193) 194 195def _variant_combinations(arch_variants = {}, cpu_variants = {}): 196 combinations = [] 197 for arch in arch_variants: 198 if "" not in cpu_variants: 199 combinations.append(struct(arch_variant = arch, cpu_variant = "")) 200 for cpu in cpu_variants: 201 combinations.append(struct(arch_variant = arch, cpu_variant = cpu)) 202 return combinations 203 204arch_to_variants = { 205 arches.Arm: _variant_combinations(arch_variants = generated_config_constants.ArmArchVariantCflags, cpu_variants = generated_config_constants.ArmCpuVariantCflags), 206 arches.Arm64: _variant_combinations(arch_variants = generated_config_constants.Arm64ArchVariantCflags, cpu_variants = generated_config_constants.Arm64CpuVariantCflags), 207 arches.X86: _variant_combinations(arch_variants = generated_config_constants.X86ArchVariantCflags), 208 arches.X86_64: _variant_combinations(arch_variants = generated_config_constants.X86_64ArchVariantCflags), 209} 210 211# enabled_features returns a list of enabled features for the given arch variant, defaults to empty list 212def enabled_features(arch_variant, arch_variant_to_features = {}): 213 if arch_variant == None: 214 arch_variant = "" 215 return arch_variant_to_features.get(arch_variant, []) 216 217# variant_name creates a name based on a variant struct with arch_variant and cpu_variant 218def variant_name(variant): 219 ret = "" 220 if variant.arch_variant: 221 ret += "_" + variant.arch_variant 222 if variant.cpu_variant: 223 ret += "_" + variant.cpu_variant 224 return ret 225 226# variant_constraints gets constraints based on variant struct and arch_variant_features 227def variant_constraints(variant, arch_variant_features = {}): 228 ret = [] 229 if variant.arch_variant: 230 ret.append("//build/bazel/platforms/arch/variants:" + variant.arch_variant) 231 if variant.cpu_variant: 232 ret.append("//build/bazel/platforms/arch/variants:" + variant.cpu_variant) 233 features = enabled_features(variant.arch_variant, arch_variant_features) 234 for feature in features: 235 ret.append("//build/bazel/platforms/arch/variants:" + feature) 236 return ret 237 238x86_64_host_toolchains = [ 239 ("cc_toolchain_x86_64_linux_host", "@bazel_tools//tools/cpp:toolchain_type"), 240 ("cc_toolchain_x86_64_linux_host_nocrt", "nocrt_toolchain"), 241] 242x86_host_toolchains = [ 243 ("cc_toolchain_x86_linux_host", "@bazel_tools//tools/cpp:toolchain_type"), 244 ("cc_toolchain_x86_linux_host_nocrt", "nocrt_toolchain"), 245] 246 247x86_64_musl_host_toolchains = [ 248 ("cc_toolchain_x86_64_linux_musl_host", "@bazel_tools//tools/cpp:toolchain_type"), 249 ("cc_toolchain_x86_64_linux_musl_host_nocrt", "nocrt_toolchain"), 250] 251 252x86_musl_host_toolchains = [ 253 ("cc_toolchain_x86_linux_musl_host", "@bazel_tools//tools/cpp:toolchain_type"), 254 ("cc_toolchain_x86_linux_musl_host_nocrt", "nocrt_toolchain"), 255] 256 257libclang_rt_prebuilt_map = { 258 "//build/bazel_common_rules/platforms/os_arch:android_arm": "//prebuilts/clang/host/linux-x86:libclang_rt_builtins_android_arm", 259 "//build/bazel_common_rules/platforms/os_arch:android_arm64": "//prebuilts/clang/host/linux-x86:libclang_rt_builtins_android_arm64", 260 "//build/bazel_common_rules/platforms/os_arch:android_x86": "//prebuilts/clang/host/linux-x86:libclang_rt_builtins_android_x86", 261 "//build/bazel_common_rules/platforms/os_arch:android_x86_64": "//prebuilts/clang/host/linux-x86:libclang_rt_builtins_android_x86_64", 262 "//build/bazel_common_rules/platforms/os_arch:linux_bionic_x86_64": "//prebuilts/clang/host/linux-x86:libclang_rt_builtins_linux_bionic_x86_64", 263 "//build/bazel_common_rules/platforms/os_arch:linux_glibc_x86": "//prebuilts/clang/host/linux-x86:libclang_rt_builtins_linux_glibc_x86", 264 "//build/bazel_common_rules/platforms/os_arch:linux_glibc_x86_64": "//prebuilts/clang/host/linux-x86:libclang_rt_builtins_linux_glibc_x86_64", 265 "//build/bazel_common_rules/platforms/os_arch:linux_musl_x86": "//prebuilts/clang/host/linux-x86:libclang_rt_builtins_linux_musl_x86", 266 "//build/bazel_common_rules/platforms/os_arch:linux_musl_x86_64": "//prebuilts/clang/host/linux-x86:libclang_rt_builtins_linux_musl_x86_64", 267 "//conditions:default": None, 268} 269 270libclang_ubsan_minimal_rt_prebuilt_map = { 271 "//build/bazel_common_rules/platforms/os_arch:android_arm": "//prebuilts/clang/host/linux-x86:libclang_rt_ubsan_minimal_android_arm", 272 "//build/bazel_common_rules/platforms/os_arch:android_arm64": "//prebuilts/clang/host/linux-x86:libclang_rt_ubsan_minimal_android_arm64", 273 "//build/bazel_common_rules/platforms/os_arch:android_x86": "//prebuilts/clang/host/linux-x86:libclang_rt_ubsan_minimal_android_x86", 274 "//build/bazel_common_rules/platforms/os_arch:android_x86_64": "//prebuilts/clang/host/linux-x86:libclang_rt_ubsan_minimal_android_x86_64", 275 "//build/bazel_common_rules/platforms/os_arch:linux_bionic_x86_64": "//prebuilts/clang/host/linux-x86:libclang_rt_ubsan_minimal_linux_bionic_x86_64", 276 "//build/bazel_common_rules/platforms/os_arch:linux_glibc_x86": "//prebuilts/clang/host/linux-x86:libclang_rt_ubsan_minimal_linux_glibc_x86", 277 "//build/bazel_common_rules/platforms/os_arch:linux_glibc_x86_64": "//prebuilts/clang/host/linux-x86:libclang_rt_ubsan_minimal_linux_glibc_x86_64", 278 "//build/bazel_common_rules/platforms/os_arch:linux_musl_x86": "//prebuilts/clang/host/linux-x86:libclang_rt_ubsan_minimal_linux_musl_x86", 279 "//build/bazel_common_rules/platforms/os_arch:linux_musl_x86_64": "//prebuilts/clang/host/linux-x86:libclang_rt_ubsan_minimal_linux_musl_x86_64", 280 "//conditions:default": None, 281} 282