blob: 35b173c7b66cd51b6c13012f3101221279b47dd6 [file] [log] [blame]
Jingwen Chen1c106912021-09-23 10:09:19 +00001load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES")
2load("@soong_injection//cc_toolchain:constants.bzl", _generated_constants = "constants")
3
Jingwen Chen1c106912021-09-23 10:09:19 +00004# This file uses structs to organize and control the visibility of symbols.
5
6# Handcrafted default flags.
7flags = struct(
8 # =============
9 # Compiler flags
10 # =============
11 compiler_flags = [
12 "-fPIC",
13 ],
14 asm_compiler_flags = [
15 "-D__ASSEMBLY__",
16 ],
Jingwen Chen1c106912021-09-23 10:09:19 +000017 # ============
18 # Linker flags
19 # ============
20 bionic_linker_flags = [
21 # These are the linker flags for OSes that use Bionic: LinuxBionic, Android
22 "-nostdlib",
Jingwen Chen1c106912021-09-23 10:09:19 +000023 "-Wl,--gc-sections",
24 ],
Treehugger Robota1997f92021-10-05 07:40:52 +000025 bionic_static_executable_linker_flags = [
26 "-Bstatic",
27 ],
28 bionic_dynamic_executable_linker_flags = [
29 "-pie",
30 "-Bdynamic",
31 "-Wl,-z,nocopyreloc",
32 ],
Jingwen Chen1c106912021-09-23 10:09:19 +000033 # ===========
34 # Other flags
35 # ===========
36 non_external_defines = [
37 # These defines should only apply to targets which are not under
38 # @external/. This can be controlled by adding "-non_external_compiler_flags"
39 # to the features list for external/ packages.
40 # This corresponds to special-casing in Soong (see "external/" in build/soong/cc/compiler.go).
41 "-DANDROID_STRICT",
42 ],
43)
44
45# Generated flags dumped from Soong's cc toolchain code.
46generated_constants = _generated_constants
47
48# The set of C and C++ actions used in the Android build. There are other types
49# of actions available in ACTION_NAMES, but those are not used in
50# Android yet.
51actions = struct(
52 compile = [
53 ACTION_NAMES.c_compile,
54 ACTION_NAMES.cpp_compile,
55 ACTION_NAMES.assemble,
56 ACTION_NAMES.preprocess_assemble,
57 ],
Jingwen Chen360066f2021-09-27 08:28:02 +000058 c_compile = ACTION_NAMES.c_compile,
59 cpp_compile = ACTION_NAMES.cpp_compile,
Jingwen Chen1c106912021-09-23 10:09:19 +000060 # Assembler actions for .s and .S files.
61 assemble = [
62 ACTION_NAMES.assemble,
63 ACTION_NAMES.preprocess_assemble,
64 ],
65 # Link actions
66 link = [
67 ACTION_NAMES.cpp_link_executable,
68 ACTION_NAMES.cpp_link_dynamic_library,
69 ACTION_NAMES.cpp_link_nodeps_dynamic_library,
70 ],
Jingwen Chenfbb92482021-09-27 09:59:14 +000071 # Differentiate archive actions from link actions
72 archive = [
73 ACTION_NAMES.cpp_link_static_library,
74 ],
Jingwen Chen360066f2021-09-27 08:28:02 +000075 cpp_link_dynamic_library = ACTION_NAMES.cpp_link_dynamic_library,
Jingwen Chenfbb92482021-09-27 09:59:14 +000076 cpp_link_nodeps_dynamic_library = ACTION_NAMES.cpp_link_nodeps_dynamic_library,
77 cpp_link_static_library = ACTION_NAMES.cpp_link_static_library,
Jingwen Chen360066f2021-09-27 08:28:02 +000078 cpp_link_executable = ACTION_NAMES.cpp_link_executable,
Jingwen Chenfbb92482021-09-27 09:59:14 +000079 strip = ACTION_NAMES.strip,
Jingwen Chen1c106912021-09-23 10:09:19 +000080)
Jingwen Chen018e5fc2021-09-29 11:44:03 +000081
Liz Kammere0d20942021-10-11 11:36:18 -040082bionic_crt = struct(
Jingwen Chen018e5fc2021-09-29 11:44:03 +000083 # crtbegin and crtend libraries for compiling cc_library_shared and
84 # cc_binary against the Bionic runtime
85 shared_library_crtbegin = "//bionic/libc:crtbegin_so",
86 shared_library_crtend = "//bionic/libc:crtend_so",
87 shared_binary_crtbegin = "//bionic/libc:crtbegin_dynamic",
Jingwen Chen018e5fc2021-09-29 11:44:03 +000088 static_binary_crtbegin = "//bionic/libc:crtbegin_static",
Liz Kammere0d20942021-10-11 11:36:18 -040089 binary_crtend = "//bionic/libc:crtend_android",
Jingwen Chen018e5fc2021-09-29 11:44:03 +000090)
Jingwen Chen9ed38972021-10-11 17:48:31 +000091
92default_cpp_std_version = "gnu++17"
93cpp_std_versions = [
94 "gnu++98",
95 "gnu++11",
96 "gnu++17",
97 "gnu++2a",
98 "c++98",
99 "c++11",
100 "c++17",
101 "c++2a",
102]
Chris Parsonsf2112382021-11-09 11:40:03 -0500103
Chris Parsonsfdc14782021-11-29 17:54:05 -0500104default_c_std_version = "gnu99"
105c_std_versions = [
106 "gnu11",
107 "gnu99",
108 "c11",
109 "c99",
110]
111
Chris Parsonsf2112382021-11-09 11:40:03 -0500112# Added by linker.go for non-bionic, non-musl, non-windows toolchains.
113# Should be added to host builds to match the default behavior of device builds.
114device_compatibility_flags_non_windows = [
115 "-ldl",
116 "-lpthread",
117 "-lm",
118]
119
120# Added by linker.go for non-bionic, non-musl, non-darwin toolchains.
121# Should be added to host builds to match the default behavior of device builds.
Liz Kammer95ee8432022-02-18 17:30:44 -0500122device_compatibility_flags_non_darwin = ["-lrt"]
123
124arches = struct(
125 Arm = "arm",
126 Arm64 = "arm64",
127 X86 = "x86",
128 X86_64 = "x86_64",
129)
130
131def _variant_combinations(arch_variants = {}, cpu_variants = {}):
132 combinations = []
133 for arch in arch_variants:
134 if "" not in cpu_variants:
135 combinations.append(struct(arch_variant = arch, cpu_variant = ""))
136 for cpu in cpu_variants:
137 combinations.append(struct(arch_variant = arch, cpu_variant = cpu))
138 return combinations
139
140arch_to_variants = {
141 arches.Arm: _variant_combinations(arch_variants = _generated_constants.ArmArchVariantCflags, cpu_variants = _generated_constants.ArmCpuVariantCflags),
142 arches.Arm64: _variant_combinations(arch_variants = _generated_constants.Arm64ArchVariantCflags, cpu_variants = _generated_constants.Arm64CpuVariantCflags),
143 arches.X86: _variant_combinations(arch_variants = _generated_constants.X86ArchVariantCflags),
144 arches.X86_64: _variant_combinations(arch_variants = _generated_constants.X86_64ArchVariantCflags),
145}
146
147def arm_extra_ldflags(variant):
148 if variant.arch_variant == "armv7-a-neon":
149 if variant.cpu_variant in ("cortex-a8", ""):
150 return _generated_constants.ArmFixCortexA8LdFlags
151 else:
152 return _generated_constants.ArmNoFixCortexA8LdFlags
153 elif variant.arch_variant == "armv7-a":
154 return _generated_constants.ArmFixCortexA8LdFlags
155 return []
Liz Kammercfd18932022-03-18 19:01:00 -0400156
157# enabled_features returns a list of enabled features for the given arch variant, defaults to empty list
158def enabled_features(arch_variant, arch_variant_to_features = {}):
159 if arch_variant == None:
160 arch_variant = ""
161 return arch_variant_to_features.get(arch_variant, [])
162
163# variant_name creates a name based on a variant struct with arch_variant and cpu_variant
164def variant_name(variant):
165 ret = ""
166 if variant.arch_variant:
167 ret += "_" + variant.arch_variant
168 if variant.cpu_variant:
169 ret += "_" + variant.cpu_variant
170 return ret
171
172# variant_constraints gets constraints based on variant struct and arch_variant_features
173def variant_constraints(variant, arch_variant_features = {}):
174 ret = []
175 if variant.arch_variant:
176 ret.append("//build/bazel/platforms/arch/variants:" + variant.arch_variant)
177 if variant.cpu_variant:
178 ret.append("//build/bazel/platforms/arch/variants:" + variant.cpu_variant)
179 features = enabled_features(variant.arch_variant, arch_variant_features)
180 for feature in features:
181 ret.append("//build/bazel/platforms/arch/variants:" + feature)
182 return ret