1*c8dee2aaSAndroid Build Coastguard Worker""" 2*c8dee2aaSAndroid Build Coastguard WorkerThis file specifies a clang toolchain that can run on a Linux host which doesn't depend on any 3*c8dee2aaSAndroid Build Coastguard Workerinstalled packages from the host machine. 4*c8dee2aaSAndroid Build Coastguard Worker 5*c8dee2aaSAndroid Build Coastguard WorkerSee download_linux_amd64_toolchain.bzl for more details on the creation of the toolchain. 6*c8dee2aaSAndroid Build Coastguard Worker 7*c8dee2aaSAndroid Build Coastguard WorkerIt uses the usr subfolder of the built toolchain as a sysroot 8*c8dee2aaSAndroid Build Coastguard Worker 9*c8dee2aaSAndroid Build Coastguard WorkerIt follows the example of: 10*c8dee2aaSAndroid Build Coastguard Worker - https://docs.bazel.build/versions/4.2.1/tutorial/cc-toolchain-config.html 11*c8dee2aaSAndroid Build Coastguard Worker - https://github.com/emscripten-core/emsdk/blob/7f39d100d8cd207094decea907121df72065517e/bazel/emscripten_toolchain/crosstool.bzl 12*c8dee2aaSAndroid Build Coastguard Worker""" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker# https://github.com/bazelbuild/bazel/blob/master/tools/build_defs/cc/action_names.bzl 15*c8dee2aaSAndroid Build Coastguard Workerload("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker# https://github.com/bazelbuild/bazel/blob/master/tools/cpp/cc_toolchain_config_lib.bzl 18*c8dee2aaSAndroid Build Coastguard Workerload( 19*c8dee2aaSAndroid Build Coastguard Worker "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", 20*c8dee2aaSAndroid Build Coastguard Worker "action_config", 21*c8dee2aaSAndroid Build Coastguard Worker "feature", 22*c8dee2aaSAndroid Build Coastguard Worker "flag_group", 23*c8dee2aaSAndroid Build Coastguard Worker "flag_set", 24*c8dee2aaSAndroid Build Coastguard Worker "tool", 25*c8dee2aaSAndroid Build Coastguard Worker "variable_with_value", 26*c8dee2aaSAndroid Build Coastguard Worker) 27*c8dee2aaSAndroid Build Coastguard Workerload(":clang_layering_check.bzl", "make_layering_check_features") 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker# The location of the created clang toolchain. 30*c8dee2aaSAndroid Build Coastguard WorkerEXTERNAL_TOOLCHAIN = "external/clang_linux_amd64" 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Workerdef _linux_amd64_toolchain_info(ctx): 33*c8dee2aaSAndroid Build Coastguard Worker action_configs = _make_action_configs() 34*c8dee2aaSAndroid Build Coastguard Worker features = [] 35*c8dee2aaSAndroid Build Coastguard Worker features += _make_default_flags() 36*c8dee2aaSAndroid Build Coastguard Worker features += make_layering_check_features() 37*c8dee2aaSAndroid Build Coastguard Worker features += _make_diagnostic_flags() 38*c8dee2aaSAndroid Build Coastguard Worker features += _make_iwyu_flags() 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker # https://bazel.build/rules/lib/cc_common#create_cc_toolchain_config_info 41*c8dee2aaSAndroid Build Coastguard Worker # Note, this rule is defined in Java code, not Starlark 42*c8dee2aaSAndroid Build Coastguard Worker # https://cs.opensource.google/bazel/bazel/+/master:src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java 43*c8dee2aaSAndroid Build Coastguard Worker return cc_common.create_cc_toolchain_config_info( 44*c8dee2aaSAndroid Build Coastguard Worker ctx = ctx, 45*c8dee2aaSAndroid Build Coastguard Worker features = features, 46*c8dee2aaSAndroid Build Coastguard Worker action_configs = action_configs, 47*c8dee2aaSAndroid Build Coastguard Worker # This is important because the linker will complain if the libc shared libraries are not 48*c8dee2aaSAndroid Build Coastguard Worker # under this directory. Because we extract the libc libraries to 49*c8dee2aaSAndroid Build Coastguard Worker # EXTERNAL_TOOLCHAIN/lib, and the various headers and shared libraries to 50*c8dee2aaSAndroid Build Coastguard Worker # EXTERNAL_TOOLCHAIN/usr, we make the top level folder the sysroot so the linker can 51*c8dee2aaSAndroid Build Coastguard Worker # find the referenced libraries (e.g. EXTERNAL_TOOLCHAIN/usr/lib/x86_64-linux-gnu/libc.so 52*c8dee2aaSAndroid Build Coastguard Worker # is just a text file that refers to "/lib/x86_64-linux-gnu/libc.so.6" and 53*c8dee2aaSAndroid Build Coastguard Worker # "/lib64/ld-linux-x86-64.so.2" which will use the sysroot as the root). 54*c8dee2aaSAndroid Build Coastguard Worker builtin_sysroot = EXTERNAL_TOOLCHAIN, 55*c8dee2aaSAndroid Build Coastguard Worker # These are required, but do nothing 56*c8dee2aaSAndroid Build Coastguard Worker compiler = "", 57*c8dee2aaSAndroid Build Coastguard Worker target_cpu = "", 58*c8dee2aaSAndroid Build Coastguard Worker target_libc = "", 59*c8dee2aaSAndroid Build Coastguard Worker target_system_name = "", 60*c8dee2aaSAndroid Build Coastguard Worker toolchain_identifier = "", 61*c8dee2aaSAndroid Build Coastguard Worker ) 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Workerprovide_linux_amd64_toolchain_config = rule( 64*c8dee2aaSAndroid Build Coastguard Worker attrs = {}, 65*c8dee2aaSAndroid Build Coastguard Worker provides = [CcToolchainConfigInfo], 66*c8dee2aaSAndroid Build Coastguard Worker implementation = _linux_amd64_toolchain_info, 67*c8dee2aaSAndroid Build Coastguard Worker) 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Workerdef _make_action_configs(): 70*c8dee2aaSAndroid Build Coastguard Worker """ 71*c8dee2aaSAndroid Build Coastguard Worker This function sets up the tools needed to perform the various compile/link actions. 72*c8dee2aaSAndroid Build Coastguard Worker 73*c8dee2aaSAndroid Build Coastguard Worker Bazel normally restricts us to referring to (and therefore running) executables/scripts 74*c8dee2aaSAndroid Build Coastguard Worker that are in this directory (That is EXEC_ROOT/toolchain). However, the executables we want 75*c8dee2aaSAndroid Build Coastguard Worker to run are brought in via WORKSPACE.bazel and are located in EXEC_ROOT/external/clang.... 76*c8dee2aaSAndroid Build Coastguard Worker Therefore, we make use of "trampoline scripts" that will call the binaries from the 77*c8dee2aaSAndroid Build Coastguard Worker toolchain directory. 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Worker These action_configs also let us dynamically specify arguments from the Bazel 80*c8dee2aaSAndroid Build Coastguard Worker environment if necessary (see cpp_link_static_library_action). 81*c8dee2aaSAndroid Build Coastguard Worker """ 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker # https://cs.opensource.google/bazel/bazel/+/master:tools/cpp/cc_toolchain_config_lib.bzl;l=435;drc=3b9e6f201a9a3465720aad8712ab7bcdeaf2e5da 84*c8dee2aaSAndroid Build Coastguard Worker clang_tool = tool(path = "linux_trampolines/clang_trampoline_linux.sh") 85*c8dee2aaSAndroid Build Coastguard Worker ar_tool = tool(path = "linux_trampolines/ar_trampoline_linux.sh") 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker # https://cs.opensource.google/bazel/bazel/+/master:tools/cpp/cc_toolchain_config_lib.bzl;l=488;drc=3b9e6f201a9a3465720aad8712ab7bcdeaf2e5da 88*c8dee2aaSAndroid Build Coastguard Worker assemble_action = action_config( 89*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.assemble, 90*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 91*c8dee2aaSAndroid Build Coastguard Worker ) 92*c8dee2aaSAndroid Build Coastguard Worker c_compile_action = action_config( 93*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.c_compile, 94*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 95*c8dee2aaSAndroid Build Coastguard Worker ) 96*c8dee2aaSAndroid Build Coastguard Worker cpp_compile_action = action_config( 97*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.cpp_compile, 98*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 99*c8dee2aaSAndroid Build Coastguard Worker ) 100*c8dee2aaSAndroid Build Coastguard Worker linkstamp_compile_action = action_config( 101*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.linkstamp_compile, 102*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 103*c8dee2aaSAndroid Build Coastguard Worker ) 104*c8dee2aaSAndroid Build Coastguard Worker preprocess_assemble_action = action_config( 105*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.preprocess_assemble, 106*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 107*c8dee2aaSAndroid Build Coastguard Worker ) 108*c8dee2aaSAndroid Build Coastguard Worker 109*c8dee2aaSAndroid Build Coastguard Worker cpp_link_dynamic_library_action = action_config( 110*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.cpp_link_dynamic_library, 111*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 112*c8dee2aaSAndroid Build Coastguard Worker ) 113*c8dee2aaSAndroid Build Coastguard Worker cpp_link_executable_action = action_config( 114*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.cpp_link_executable, 115*c8dee2aaSAndroid Build Coastguard Worker # Bazel assumes it is talking to clang when building an executable. There are 116*c8dee2aaSAndroid Build Coastguard Worker # "-Wl" flags on the command: https://releases.llvm.org/6.0.1/tools/clang/docs/ClangCommandLineReference.html#cmdoption-clang-Wl 117*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 118*c8dee2aaSAndroid Build Coastguard Worker ) 119*c8dee2aaSAndroid Build Coastguard Worker cpp_link_nodeps_dynamic_library_action = action_config( 120*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.cpp_link_nodeps_dynamic_library, 121*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 122*c8dee2aaSAndroid Build Coastguard Worker ) 123*c8dee2aaSAndroid Build Coastguard Worker 124*c8dee2aaSAndroid Build Coastguard Worker # This is the same rule as 125*c8dee2aaSAndroid Build Coastguard Worker # https://github.com/emscripten-core/emsdk/blob/7f39d100d8cd207094decea907121df72065517e/bazel/emscripten_toolchain/crosstool.bzl#L143 126*c8dee2aaSAndroid Build Coastguard Worker # By default, there are no flags or libraries passed to the llvm-ar tool, so 127*c8dee2aaSAndroid Build Coastguard Worker # we need to specify them. The variables mentioned by expand_if_available are defined 128*c8dee2aaSAndroid Build Coastguard Worker # https://bazel.build/docs/cc-toolchain-config-reference#cctoolchainconfiginfo-build-variables 129*c8dee2aaSAndroid Build Coastguard Worker cpp_link_static_library_action = action_config( 130*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.cpp_link_static_library, 131*c8dee2aaSAndroid Build Coastguard Worker flag_sets = [ 132*c8dee2aaSAndroid Build Coastguard Worker flag_set( 133*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 134*c8dee2aaSAndroid Build Coastguard Worker flag_group( 135*c8dee2aaSAndroid Build Coastguard Worker # https://llvm.org/docs/CommandGuide/llvm-ar.html 136*c8dee2aaSAndroid Build Coastguard Worker # replace existing files or insert them if they already exist, 137*c8dee2aaSAndroid Build Coastguard Worker # create the file if it doesn't already exist 138*c8dee2aaSAndroid Build Coastguard Worker # symbol table should be added 139*c8dee2aaSAndroid Build Coastguard Worker # Deterministic timestamps should be used 140*c8dee2aaSAndroid Build Coastguard Worker flags = ["rcsD", "%{output_execpath}"], 141*c8dee2aaSAndroid Build Coastguard Worker # Despite the name, output_execpath just refers to linker output, 142*c8dee2aaSAndroid Build Coastguard Worker # e.g. libFoo.a 143*c8dee2aaSAndroid Build Coastguard Worker expand_if_available = "output_execpath", 144*c8dee2aaSAndroid Build Coastguard Worker ), 145*c8dee2aaSAndroid Build Coastguard Worker ], 146*c8dee2aaSAndroid Build Coastguard Worker ), 147*c8dee2aaSAndroid Build Coastguard Worker flag_set( 148*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 149*c8dee2aaSAndroid Build Coastguard Worker flag_group( 150*c8dee2aaSAndroid Build Coastguard Worker iterate_over = "libraries_to_link", 151*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 152*c8dee2aaSAndroid Build Coastguard Worker flag_group( 153*c8dee2aaSAndroid Build Coastguard Worker flags = ["%{libraries_to_link.name}"], 154*c8dee2aaSAndroid Build Coastguard Worker expand_if_equal = variable_with_value( 155*c8dee2aaSAndroid Build Coastguard Worker name = "libraries_to_link.type", 156*c8dee2aaSAndroid Build Coastguard Worker value = "object_file", 157*c8dee2aaSAndroid Build Coastguard Worker ), 158*c8dee2aaSAndroid Build Coastguard Worker ), 159*c8dee2aaSAndroid Build Coastguard Worker flag_group( 160*c8dee2aaSAndroid Build Coastguard Worker flags = ["%{libraries_to_link.object_files}"], 161*c8dee2aaSAndroid Build Coastguard Worker iterate_over = "libraries_to_link.object_files", 162*c8dee2aaSAndroid Build Coastguard Worker expand_if_equal = variable_with_value( 163*c8dee2aaSAndroid Build Coastguard Worker name = "libraries_to_link.type", 164*c8dee2aaSAndroid Build Coastguard Worker value = "object_file_group", 165*c8dee2aaSAndroid Build Coastguard Worker ), 166*c8dee2aaSAndroid Build Coastguard Worker ), 167*c8dee2aaSAndroid Build Coastguard Worker ], 168*c8dee2aaSAndroid Build Coastguard Worker expand_if_available = "libraries_to_link", 169*c8dee2aaSAndroid Build Coastguard Worker ), 170*c8dee2aaSAndroid Build Coastguard Worker ], 171*c8dee2aaSAndroid Build Coastguard Worker ), 172*c8dee2aaSAndroid Build Coastguard Worker flag_set( 173*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 174*c8dee2aaSAndroid Build Coastguard Worker flag_group( 175*c8dee2aaSAndroid Build Coastguard Worker flags = ["@%{linker_param_file}"], 176*c8dee2aaSAndroid Build Coastguard Worker expand_if_available = "linker_param_file", 177*c8dee2aaSAndroid Build Coastguard Worker ), 178*c8dee2aaSAndroid Build Coastguard Worker ], 179*c8dee2aaSAndroid Build Coastguard Worker ), 180*c8dee2aaSAndroid Build Coastguard Worker ], 181*c8dee2aaSAndroid Build Coastguard Worker tools = [ar_tool], 182*c8dee2aaSAndroid Build Coastguard Worker ) 183*c8dee2aaSAndroid Build Coastguard Worker 184*c8dee2aaSAndroid Build Coastguard Worker action_configs = [ 185*c8dee2aaSAndroid Build Coastguard Worker assemble_action, 186*c8dee2aaSAndroid Build Coastguard Worker c_compile_action, 187*c8dee2aaSAndroid Build Coastguard Worker cpp_compile_action, 188*c8dee2aaSAndroid Build Coastguard Worker cpp_link_dynamic_library_action, 189*c8dee2aaSAndroid Build Coastguard Worker cpp_link_executable_action, 190*c8dee2aaSAndroid Build Coastguard Worker cpp_link_nodeps_dynamic_library_action, 191*c8dee2aaSAndroid Build Coastguard Worker cpp_link_static_library_action, 192*c8dee2aaSAndroid Build Coastguard Worker linkstamp_compile_action, 193*c8dee2aaSAndroid Build Coastguard Worker preprocess_assemble_action, 194*c8dee2aaSAndroid Build Coastguard Worker ] 195*c8dee2aaSAndroid Build Coastguard Worker return action_configs 196*c8dee2aaSAndroid Build Coastguard Worker 197*c8dee2aaSAndroid Build Coastguard Workerdef _make_default_flags(): 198*c8dee2aaSAndroid Build Coastguard Worker """Here we define the flags for certain actions that are always applied. 199*c8dee2aaSAndroid Build Coastguard Worker 200*c8dee2aaSAndroid Build Coastguard Worker For any flag that might be conditionally applied, it should be defined in //bazel/copts.bzl. 201*c8dee2aaSAndroid Build Coastguard Worker 202*c8dee2aaSAndroid Build Coastguard Worker Flags that are set here will be unconditionally applied to everything we compile with 203*c8dee2aaSAndroid Build Coastguard Worker this toolchain, even third_party deps. 204*c8dee2aaSAndroid Build Coastguard Worker """ 205*c8dee2aaSAndroid Build Coastguard Worker 206*c8dee2aaSAndroid Build Coastguard Worker # Note: These values must be kept in sync with those defined in cmake_exporter.go. 207*c8dee2aaSAndroid Build Coastguard Worker cxx_compile_includes = flag_set( 208*c8dee2aaSAndroid Build Coastguard Worker actions = [ 209*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.c_compile, 210*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_compile, 211*c8dee2aaSAndroid Build Coastguard Worker ], 212*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 213*c8dee2aaSAndroid Build Coastguard Worker flag_group( 214*c8dee2aaSAndroid Build Coastguard Worker flags = [ 215*c8dee2aaSAndroid Build Coastguard Worker # THIS ORDER MATTERS GREATLY. If these are in the wrong order, the 216*c8dee2aaSAndroid Build Coastguard Worker # #include_next directives will fail to find the files, causing a compilation 217*c8dee2aaSAndroid Build Coastguard Worker # error (or, without -no-canonical-prefixes, a mysterious case where files 218*c8dee2aaSAndroid Build Coastguard Worker # are included with an absolute path and fail the build). 219*c8dee2aaSAndroid Build Coastguard Worker "-isystem", 220*c8dee2aaSAndroid Build Coastguard Worker EXTERNAL_TOOLCHAIN + "/include/c++/v1", 221*c8dee2aaSAndroid Build Coastguard Worker # https://github.com/llvm/llvm-project/issues/57104 222*c8dee2aaSAndroid Build Coastguard Worker "-isystem", 223*c8dee2aaSAndroid Build Coastguard Worker EXTERNAL_TOOLCHAIN + "/include/x86_64-unknown-linux-gnu/c++/v1/", 224*c8dee2aaSAndroid Build Coastguard Worker "-isystem", 225*c8dee2aaSAndroid Build Coastguard Worker EXTERNAL_TOOLCHAIN + "/usr/include", 226*c8dee2aaSAndroid Build Coastguard Worker "-isystem", 227*c8dee2aaSAndroid Build Coastguard Worker EXTERNAL_TOOLCHAIN + "/lib/clang/15.0.1/include", 228*c8dee2aaSAndroid Build Coastguard Worker "-isystem", 229*c8dee2aaSAndroid Build Coastguard Worker EXTERNAL_TOOLCHAIN + "/usr/include/x86_64-linux-gnu", 230*c8dee2aaSAndroid Build Coastguard Worker # We do not want clang to search in absolute paths for files. This makes 231*c8dee2aaSAndroid Build Coastguard Worker # Bazel think we are using an outside resource and fail the compile. 232*c8dee2aaSAndroid Build Coastguard Worker "-no-canonical-prefixes", 233*c8dee2aaSAndroid Build Coastguard Worker ], 234*c8dee2aaSAndroid Build Coastguard Worker ), 235*c8dee2aaSAndroid Build Coastguard Worker ], 236*c8dee2aaSAndroid Build Coastguard Worker ) 237*c8dee2aaSAndroid Build Coastguard Worker 238*c8dee2aaSAndroid Build Coastguard Worker cpp_compile_flags = flag_set( 239*c8dee2aaSAndroid Build Coastguard Worker actions = [ 240*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_compile, 241*c8dee2aaSAndroid Build Coastguard Worker ], 242*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 243*c8dee2aaSAndroid Build Coastguard Worker flag_group( 244*c8dee2aaSAndroid Build Coastguard Worker flags = [ 245*c8dee2aaSAndroid Build Coastguard Worker "-std=c++17", 246*c8dee2aaSAndroid Build Coastguard Worker "-stdlib=libc++", 247*c8dee2aaSAndroid Build Coastguard Worker ], 248*c8dee2aaSAndroid Build Coastguard Worker ), 249*c8dee2aaSAndroid Build Coastguard Worker ], 250*c8dee2aaSAndroid Build Coastguard Worker ) 251*c8dee2aaSAndroid Build Coastguard Worker 252*c8dee2aaSAndroid Build Coastguard Worker link_exe_flags = flag_set( 253*c8dee2aaSAndroid Build Coastguard Worker actions = [ 254*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_link_executable, 255*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_link_dynamic_library, 256*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_link_nodeps_dynamic_library, 257*c8dee2aaSAndroid Build Coastguard Worker ], 258*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 259*c8dee2aaSAndroid Build Coastguard Worker flag_group( 260*c8dee2aaSAndroid Build Coastguard Worker flags = [ 261*c8dee2aaSAndroid Build Coastguard Worker "-fuse-ld=lld", 262*c8dee2aaSAndroid Build Coastguard Worker # We chose to use the llvm runtime, not the gcc one because it is already 263*c8dee2aaSAndroid Build Coastguard Worker # included in the clang binary 264*c8dee2aaSAndroid Build Coastguard Worker "--rtlib=compiler-rt", 265*c8dee2aaSAndroid Build Coastguard Worker "-std=c++17", 266*c8dee2aaSAndroid Build Coastguard Worker "-stdlib=libc++", 267*c8dee2aaSAndroid Build Coastguard Worker # We statically include these libc++ libraries so they do not need to be 268*c8dee2aaSAndroid Build Coastguard Worker # on a developer's machine (they can be tricky to get). 269*c8dee2aaSAndroid Build Coastguard Worker EXTERNAL_TOOLCHAIN + "/lib/x86_64-unknown-linux-gnu/libc++.a", 270*c8dee2aaSAndroid Build Coastguard Worker EXTERNAL_TOOLCHAIN + "/lib/x86_64-unknown-linux-gnu/libc++abi.a", 271*c8dee2aaSAndroid Build Coastguard Worker EXTERNAL_TOOLCHAIN + "/lib/x86_64-unknown-linux-gnu/libunwind.a", 272*c8dee2aaSAndroid Build Coastguard Worker # Dynamically Link in the other parts of glibc (not needed in glibc 2.34+) 273*c8dee2aaSAndroid Build Coastguard Worker "-lpthread", 274*c8dee2aaSAndroid Build Coastguard Worker "-lm", 275*c8dee2aaSAndroid Build Coastguard Worker "-ldl", 276*c8dee2aaSAndroid Build Coastguard Worker ], 277*c8dee2aaSAndroid Build Coastguard Worker ), 278*c8dee2aaSAndroid Build Coastguard Worker ], 279*c8dee2aaSAndroid Build Coastguard Worker ) 280*c8dee2aaSAndroid Build Coastguard Worker return [feature( 281*c8dee2aaSAndroid Build Coastguard Worker "default_flags", 282*c8dee2aaSAndroid Build Coastguard Worker enabled = True, 283*c8dee2aaSAndroid Build Coastguard Worker flag_sets = [ 284*c8dee2aaSAndroid Build Coastguard Worker cxx_compile_includes, 285*c8dee2aaSAndroid Build Coastguard Worker cpp_compile_flags, 286*c8dee2aaSAndroid Build Coastguard Worker link_exe_flags, 287*c8dee2aaSAndroid Build Coastguard Worker ], 288*c8dee2aaSAndroid Build Coastguard Worker )] 289*c8dee2aaSAndroid Build Coastguard Worker 290*c8dee2aaSAndroid Build Coastguard Workerdef _make_diagnostic_flags(): 291*c8dee2aaSAndroid Build Coastguard Worker """Here we define the flags that can be turned on via features to yield debug info.""" 292*c8dee2aaSAndroid Build Coastguard Worker cxx_diagnostic = flag_set( 293*c8dee2aaSAndroid Build Coastguard Worker actions = [ 294*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.c_compile, 295*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_compile, 296*c8dee2aaSAndroid Build Coastguard Worker ], 297*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 298*c8dee2aaSAndroid Build Coastguard Worker flag_group( 299*c8dee2aaSAndroid Build Coastguard Worker flags = [ 300*c8dee2aaSAndroid Build Coastguard Worker "--trace-includes", 301*c8dee2aaSAndroid Build Coastguard Worker "-v", 302*c8dee2aaSAndroid Build Coastguard Worker ], 303*c8dee2aaSAndroid Build Coastguard Worker ), 304*c8dee2aaSAndroid Build Coastguard Worker ], 305*c8dee2aaSAndroid Build Coastguard Worker ) 306*c8dee2aaSAndroid Build Coastguard Worker 307*c8dee2aaSAndroid Build Coastguard Worker link_diagnostic = flag_set( 308*c8dee2aaSAndroid Build Coastguard Worker actions = [ACTION_NAMES.cpp_link_executable], 309*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 310*c8dee2aaSAndroid Build Coastguard Worker flag_group( 311*c8dee2aaSAndroid Build Coastguard Worker flags = [ 312*c8dee2aaSAndroid Build Coastguard Worker "-Wl,--verbose", 313*c8dee2aaSAndroid Build Coastguard Worker "-v", 314*c8dee2aaSAndroid Build Coastguard Worker ], 315*c8dee2aaSAndroid Build Coastguard Worker ), 316*c8dee2aaSAndroid Build Coastguard Worker ], 317*c8dee2aaSAndroid Build Coastguard Worker ) 318*c8dee2aaSAndroid Build Coastguard Worker 319*c8dee2aaSAndroid Build Coastguard Worker link_search_dirs = flag_set( 320*c8dee2aaSAndroid Build Coastguard Worker actions = [ACTION_NAMES.cpp_link_executable], 321*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 322*c8dee2aaSAndroid Build Coastguard Worker flag_group( 323*c8dee2aaSAndroid Build Coastguard Worker flags = [ 324*c8dee2aaSAndroid Build Coastguard Worker "--print-search-dirs", 325*c8dee2aaSAndroid Build Coastguard Worker ], 326*c8dee2aaSAndroid Build Coastguard Worker ), 327*c8dee2aaSAndroid Build Coastguard Worker ], 328*c8dee2aaSAndroid Build Coastguard Worker ) 329*c8dee2aaSAndroid Build Coastguard Worker return [ 330*c8dee2aaSAndroid Build Coastguard Worker # Running a Bazel command with --features diagnostic will cause the compilation and 331*c8dee2aaSAndroid Build Coastguard Worker # link steps to be more verbose. 332*c8dee2aaSAndroid Build Coastguard Worker feature( 333*c8dee2aaSAndroid Build Coastguard Worker "diagnostic", 334*c8dee2aaSAndroid Build Coastguard Worker enabled = False, 335*c8dee2aaSAndroid Build Coastguard Worker flag_sets = [ 336*c8dee2aaSAndroid Build Coastguard Worker cxx_diagnostic, 337*c8dee2aaSAndroid Build Coastguard Worker link_diagnostic, 338*c8dee2aaSAndroid Build Coastguard Worker ], 339*c8dee2aaSAndroid Build Coastguard Worker ), 340*c8dee2aaSAndroid Build Coastguard Worker feature( 341*c8dee2aaSAndroid Build Coastguard Worker "diagnostic_link", 342*c8dee2aaSAndroid Build Coastguard Worker enabled = False, 343*c8dee2aaSAndroid Build Coastguard Worker flag_sets = [ 344*c8dee2aaSAndroid Build Coastguard Worker link_diagnostic, 345*c8dee2aaSAndroid Build Coastguard Worker ], 346*c8dee2aaSAndroid Build Coastguard Worker ), 347*c8dee2aaSAndroid Build Coastguard Worker # Running a Bazel command with --features print_search_dirs will cause the link to fail 348*c8dee2aaSAndroid Build Coastguard Worker # but directories searched for libraries, etc will be displayed. 349*c8dee2aaSAndroid Build Coastguard Worker feature( 350*c8dee2aaSAndroid Build Coastguard Worker "print_search_dirs", 351*c8dee2aaSAndroid Build Coastguard Worker enabled = False, 352*c8dee2aaSAndroid Build Coastguard Worker flag_sets = [ 353*c8dee2aaSAndroid Build Coastguard Worker link_search_dirs, 354*c8dee2aaSAndroid Build Coastguard Worker ], 355*c8dee2aaSAndroid Build Coastguard Worker ), 356*c8dee2aaSAndroid Build Coastguard Worker ] 357*c8dee2aaSAndroid Build Coastguard Worker 358*c8dee2aaSAndroid Build Coastguard Workerdef _make_iwyu_flags(): 359*c8dee2aaSAndroid Build Coastguard Worker """Here we define the flags that signal whether or not to enforce IWYU.""" 360*c8dee2aaSAndroid Build Coastguard Worker 361*c8dee2aaSAndroid Build Coastguard Worker # https://bazel.build/docs/cc-toolchain-config-reference#features 362*c8dee2aaSAndroid Build Coastguard Worker opt_file_into_iwyu = flag_set( 363*c8dee2aaSAndroid Build Coastguard Worker actions = [ 364*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.c_compile, 365*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_compile, 366*c8dee2aaSAndroid Build Coastguard Worker ], 367*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 368*c8dee2aaSAndroid Build Coastguard Worker flag_group( 369*c8dee2aaSAndroid Build Coastguard Worker flags = [ 370*c8dee2aaSAndroid Build Coastguard Worker # This define does not impact compilation, but it acts as a signal to the 371*c8dee2aaSAndroid Build Coastguard Worker # clang_trampoline.sh whether to maybe check the file with include-what-you-use 372*c8dee2aaSAndroid Build Coastguard Worker # A define was chosen because it is ignored by clang and IWYU, but can be 373*c8dee2aaSAndroid Build Coastguard Worker # easily found with bash. 374*c8dee2aaSAndroid Build Coastguard Worker # The clang_trampoline.sh file has a list of allowed subdirectories for which 375*c8dee2aaSAndroid Build Coastguard Worker # IWYU should be enforced, allowing us to slowly opt more and more directories 376*c8dee2aaSAndroid Build Coastguard Worker # in over time. 377*c8dee2aaSAndroid Build Coastguard Worker "-DSKIA_ENFORCE_IWYU", 378*c8dee2aaSAndroid Build Coastguard Worker ], 379*c8dee2aaSAndroid Build Coastguard Worker ), 380*c8dee2aaSAndroid Build Coastguard Worker ], 381*c8dee2aaSAndroid Build Coastguard Worker ) 382*c8dee2aaSAndroid Build Coastguard Worker 383*c8dee2aaSAndroid Build Coastguard Worker return [ 384*c8dee2aaSAndroid Build Coastguard Worker feature( 385*c8dee2aaSAndroid Build Coastguard Worker "skia_enforce_iwyu", 386*c8dee2aaSAndroid Build Coastguard Worker enabled = False, 387*c8dee2aaSAndroid Build Coastguard Worker flag_sets = [ 388*c8dee2aaSAndroid Build Coastguard Worker opt_file_into_iwyu, 389*c8dee2aaSAndroid Build Coastguard Worker ], 390*c8dee2aaSAndroid Build Coastguard Worker ), 391*c8dee2aaSAndroid Build Coastguard Worker ] 392