xref: /aosp_15_r20/build/bazel/toolchains/clang/host/linux-x86/cc_toolchain_constants.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
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