Jingwen Chen | 1c10691 | 2021-09-23 10:09:19 +0000 | [diff] [blame] | 1 | load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") |
| 2 | load("@soong_injection//cc_toolchain:constants.bzl", _generated_constants = "constants") |
| 3 | |
Jingwen Chen | 1c10691 | 2021-09-23 10:09:19 +0000 | [diff] [blame] | 4 | # This file uses structs to organize and control the visibility of symbols. |
| 5 | |
| 6 | # Handcrafted default flags. |
| 7 | flags = struct( |
| 8 | # ============= |
| 9 | # Compiler flags |
| 10 | # ============= |
| 11 | compiler_flags = [ |
| 12 | "-fPIC", |
| 13 | ], |
| 14 | asm_compiler_flags = [ |
| 15 | "-D__ASSEMBLY__", |
| 16 | ], |
Jingwen Chen | 1c10691 | 2021-09-23 10:09:19 +0000 | [diff] [blame] | 17 | # ============ |
| 18 | # Linker flags |
| 19 | # ============ |
| 20 | bionic_linker_flags = [ |
| 21 | # These are the linker flags for OSes that use Bionic: LinuxBionic, Android |
| 22 | "-nostdlib", |
Jingwen Chen | 1c10691 | 2021-09-23 10:09:19 +0000 | [diff] [blame] | 23 | "-Wl,--gc-sections", |
| 24 | ], |
Treehugger Robot | a1997f9 | 2021-10-05 07:40:52 +0000 | [diff] [blame] | 25 | bionic_static_executable_linker_flags = [ |
| 26 | "-Bstatic", |
| 27 | ], |
| 28 | bionic_dynamic_executable_linker_flags = [ |
| 29 | "-pie", |
| 30 | "-Bdynamic", |
| 31 | "-Wl,-z,nocopyreloc", |
| 32 | ], |
Jingwen Chen | 1c10691 | 2021-09-23 10:09:19 +0000 | [diff] [blame] | 33 | # =========== |
| 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. |
| 46 | generated_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. |
| 51 | actions = struct( |
| 52 | compile = [ |
| 53 | ACTION_NAMES.c_compile, |
| 54 | ACTION_NAMES.cpp_compile, |
| 55 | ACTION_NAMES.assemble, |
| 56 | ACTION_NAMES.preprocess_assemble, |
| 57 | ], |
Jingwen Chen | 360066f | 2021-09-27 08:28:02 +0000 | [diff] [blame] | 58 | c_compile = ACTION_NAMES.c_compile, |
| 59 | cpp_compile = ACTION_NAMES.cpp_compile, |
Jingwen Chen | 1c10691 | 2021-09-23 10:09:19 +0000 | [diff] [blame] | 60 | # 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 Chen | fbb9248 | 2021-09-27 09:59:14 +0000 | [diff] [blame] | 71 | # Differentiate archive actions from link actions |
| 72 | archive = [ |
| 73 | ACTION_NAMES.cpp_link_static_library, |
| 74 | ], |
Jingwen Chen | 360066f | 2021-09-27 08:28:02 +0000 | [diff] [blame] | 75 | cpp_link_dynamic_library = ACTION_NAMES.cpp_link_dynamic_library, |
Jingwen Chen | fbb9248 | 2021-09-27 09:59:14 +0000 | [diff] [blame] | 76 | cpp_link_nodeps_dynamic_library = ACTION_NAMES.cpp_link_nodeps_dynamic_library, |
| 77 | cpp_link_static_library = ACTION_NAMES.cpp_link_static_library, |
Jingwen Chen | 360066f | 2021-09-27 08:28:02 +0000 | [diff] [blame] | 78 | cpp_link_executable = ACTION_NAMES.cpp_link_executable, |
Jingwen Chen | fbb9248 | 2021-09-27 09:59:14 +0000 | [diff] [blame] | 79 | strip = ACTION_NAMES.strip, |
Jingwen Chen | 1c10691 | 2021-09-23 10:09:19 +0000 | [diff] [blame] | 80 | ) |
Jingwen Chen | 018e5fc | 2021-09-29 11:44:03 +0000 | [diff] [blame] | 81 | |
Liz Kammer | e0d2094 | 2021-10-11 11:36:18 -0400 | [diff] [blame] | 82 | bionic_crt = struct( |
Jingwen Chen | 018e5fc | 2021-09-29 11:44:03 +0000 | [diff] [blame] | 83 | # 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 Chen | 018e5fc | 2021-09-29 11:44:03 +0000 | [diff] [blame] | 88 | static_binary_crtbegin = "//bionic/libc:crtbegin_static", |
Liz Kammer | e0d2094 | 2021-10-11 11:36:18 -0400 | [diff] [blame] | 89 | binary_crtend = "//bionic/libc:crtend_android", |
Jingwen Chen | 018e5fc | 2021-09-29 11:44:03 +0000 | [diff] [blame] | 90 | ) |
Jingwen Chen | 9ed3897 | 2021-10-11 17:48:31 +0000 | [diff] [blame] | 91 | |
| 92 | default_cpp_std_version = "gnu++17" |
| 93 | cpp_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 Parsons | f211238 | 2021-11-09 11:40:03 -0500 | [diff] [blame] | 103 | |
Chris Parsons | fdc1478 | 2021-11-29 17:54:05 -0500 | [diff] [blame] | 104 | default_c_std_version = "gnu99" |
| 105 | c_std_versions = [ |
| 106 | "gnu11", |
| 107 | "gnu99", |
| 108 | "c11", |
| 109 | "c99", |
| 110 | ] |
| 111 | |
Chris Parsons | f211238 | 2021-11-09 11:40:03 -0500 | [diff] [blame] | 112 | # 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. |
| 114 | device_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 Kammer | 95ee843 | 2022-02-18 17:30:44 -0500 | [diff] [blame] | 122 | device_compatibility_flags_non_darwin = ["-lrt"] |
| 123 | |
| 124 | arches = struct( |
| 125 | Arm = "arm", |
| 126 | Arm64 = "arm64", |
| 127 | X86 = "x86", |
| 128 | X86_64 = "x86_64", |
| 129 | ) |
| 130 | |
| 131 | def _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 | |
| 140 | arch_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 | |
| 147 | def 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 Kammer | cfd1893 | 2022-03-18 19:01:00 -0400 | [diff] [blame] | 156 | |
| 157 | # enabled_features returns a list of enabled features for the given arch variant, defaults to empty list |
| 158 | def 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 |
| 164 | def 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 |
| 173 | def 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 |