1*c8dee2aaSAndroid Build Coastguard Worker""" 2*c8dee2aaSAndroid Build Coastguard WorkerThis file specifies a clang toolchain that can run on a Mac host (with either M1 or Intel CPU). 3*c8dee2aaSAndroid Build Coastguard Worker 4*c8dee2aaSAndroid Build Coastguard WorkerHermetic toolchains still need access to Xcode for sys headers included in Skia's codebase. 5*c8dee2aaSAndroid Build Coastguard Worker 6*c8dee2aaSAndroid Build Coastguard WorkerSee download_mac_toolchain.bzl for more details on the creation of the toolchain. 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard WorkerIt uses the usr subfolder of the built toolchain as a sysroot 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard WorkerIt follows the example of: 11*c8dee2aaSAndroid Build Coastguard Worker - linux_amd64_toolchain_config.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_mac" 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker# Root of our symlinks. These symlinks are created in download_mac_toolchain.bzl 33*c8dee2aaSAndroid Build Coastguard WorkerXCODE_MACSDK_SYMLINK = EXTERNAL_TOOLCHAIN + "/symlinks/xcode/MacSDK" 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker_platform_constraints_to_import = { 36*c8dee2aaSAndroid Build Coastguard Worker "@platforms//cpu:arm64": "_arm64_cpu", 37*c8dee2aaSAndroid Build Coastguard Worker "@platforms//cpu:x86_64": "_x86_64_cpu", 38*c8dee2aaSAndroid Build Coastguard Worker} 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Workerdef _mac_toolchain_info(ctx): 41*c8dee2aaSAndroid Build Coastguard Worker action_configs = _make_action_configs() 42*c8dee2aaSAndroid Build Coastguard Worker features = [] 43*c8dee2aaSAndroid Build Coastguard Worker features += _make_default_flags() 44*c8dee2aaSAndroid Build Coastguard Worker features += make_layering_check_features() 45*c8dee2aaSAndroid Build Coastguard Worker features += _make_diagnostic_flags() 46*c8dee2aaSAndroid Build Coastguard Worker features += _make_target_specific_flags(ctx) 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker # https://bazel.build/rules/lib/cc_common#create_cc_toolchain_config_info 49*c8dee2aaSAndroid Build Coastguard Worker # Note, this rule is defined in Java code, not Starlark 50*c8dee2aaSAndroid Build Coastguard Worker # https://cs.opensource.google/bazel/bazel/+/master:src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java 51*c8dee2aaSAndroid Build Coastguard Worker return cc_common.create_cc_toolchain_config_info( 52*c8dee2aaSAndroid Build Coastguard Worker ctx = ctx, 53*c8dee2aaSAndroid Build Coastguard Worker features = features, 54*c8dee2aaSAndroid Build Coastguard Worker action_configs = action_configs, 55*c8dee2aaSAndroid Build Coastguard Worker builtin_sysroot = EXTERNAL_TOOLCHAIN, 56*c8dee2aaSAndroid Build Coastguard Worker cxx_builtin_include_directories = [ 57*c8dee2aaSAndroid Build Coastguard Worker # https://stackoverflow.com/a/61419490 58*c8dee2aaSAndroid Build Coastguard Worker # "If the compiler has --sysroot support, then these paths should use %sysroot% 59*c8dee2aaSAndroid Build Coastguard Worker # rather than the include path" 60*c8dee2aaSAndroid Build Coastguard Worker # https://bazel.build/rules/lib/cc_common#create_cc_toolchain_config_info.cxx_builtin_include_directories 61*c8dee2aaSAndroid Build Coastguard Worker "%sysroot%/symlinks/xcode/MacSDK/System/Library/Frameworks/", 62*c8dee2aaSAndroid Build Coastguard Worker ], 63*c8dee2aaSAndroid Build Coastguard Worker # If `ctx.attr.cpu` is blank (which is declared as optional below), this config will target 64*c8dee2aaSAndroid Build Coastguard Worker # the host CPU. Specifying a target_cpu allows this config to be used for cross compilation. 65*c8dee2aaSAndroid Build Coastguard Worker target_cpu = ctx.attr.cpu, 66*c8dee2aaSAndroid Build Coastguard Worker # These are required, but do nothing 67*c8dee2aaSAndroid Build Coastguard Worker compiler = "", 68*c8dee2aaSAndroid Build Coastguard Worker target_libc = "", 69*c8dee2aaSAndroid Build Coastguard Worker target_system_name = "", 70*c8dee2aaSAndroid Build Coastguard Worker toolchain_identifier = "", 71*c8dee2aaSAndroid Build Coastguard Worker ) 72*c8dee2aaSAndroid Build Coastguard Worker 73*c8dee2aaSAndroid Build Coastguard Workerdef _import_platform_constraints(): 74*c8dee2aaSAndroid Build Coastguard Worker # In order to "import" constraint values so they can be passed in as parameters to 75*c8dee2aaSAndroid Build Coastguard Worker # ctx.target_platform_has_constraint(), we need to list them as a default value on a 76*c8dee2aaSAndroid Build Coastguard Worker # private attributes. It doesn't really matter what we call these private attributes, 77*c8dee2aaSAndroid Build Coastguard Worker # but to make it easier to read elsewhere, we create a mapping between the "official" 78*c8dee2aaSAndroid Build Coastguard Worker # name of the constraints and the private name. Then, we can refer to the official name 79*c8dee2aaSAndroid Build Coastguard Worker # without having to remember the secondary name. 80*c8dee2aaSAndroid Build Coastguard Worker # https://bazel.build/rules/rules#private_attributes_and_implicit_dependencies 81*c8dee2aaSAndroid Build Coastguard Worker # https://github.com/bazelbuild/proposals/blob/91579f36031f768bcf68b18a86b8df8b43cc590b/designs/2019-11-11-target-platform-constraints.md 82*c8dee2aaSAndroid Build Coastguard Worker rule_attributes = {} 83*c8dee2aaSAndroid Build Coastguard Worker for constraint in _platform_constraints_to_import: 84*c8dee2aaSAndroid Build Coastguard Worker private_attr = _platform_constraints_to_import[constraint] 85*c8dee2aaSAndroid Build Coastguard Worker rule_attributes[private_attr] = attr.label(default = constraint) 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker # Define an optional attribute to allow the target architecture to be explicitly specified (e.g. 88*c8dee2aaSAndroid Build Coastguard Worker # when selecting a cross-compilation toolchain). 89*c8dee2aaSAndroid Build Coastguard Worker rule_attributes["cpu"] = attr.string( 90*c8dee2aaSAndroid Build Coastguard Worker mandatory = False, 91*c8dee2aaSAndroid Build Coastguard Worker values = ["arm64", "x64"], 92*c8dee2aaSAndroid Build Coastguard Worker ) 93*c8dee2aaSAndroid Build Coastguard Worker return rule_attributes 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Workerdef _has_platform_constraint(ctx, official_constraint_name): 96*c8dee2aaSAndroid Build Coastguard Worker # ctx is of type https://bazel.build/rules/lib/ctx 97*c8dee2aaSAndroid Build Coastguard Worker # This pattern is from 98*c8dee2aaSAndroid Build Coastguard Worker # https://github.com/bazelbuild/proposals/blob/91579f36031f768bcf68b18a86b8df8b43cc590b/designs/2019-11-11-target-platform-constraints.md 99*c8dee2aaSAndroid Build Coastguard Worker private_attr = _platform_constraints_to_import[official_constraint_name] 100*c8dee2aaSAndroid Build Coastguard Worker constraint = getattr(ctx.attr, private_attr)[platform_common.ConstraintValueInfo] 101*c8dee2aaSAndroid Build Coastguard Worker return ctx.target_platform_has_constraint(constraint) 102*c8dee2aaSAndroid Build Coastguard Worker 103*c8dee2aaSAndroid Build Coastguard Workerprovide_mac_toolchain_config = rule( 104*c8dee2aaSAndroid Build Coastguard Worker attrs = _import_platform_constraints(), 105*c8dee2aaSAndroid Build Coastguard Worker provides = [CcToolchainConfigInfo], 106*c8dee2aaSAndroid Build Coastguard Worker implementation = _mac_toolchain_info, 107*c8dee2aaSAndroid Build Coastguard Worker) 108*c8dee2aaSAndroid Build Coastguard Worker 109*c8dee2aaSAndroid Build Coastguard Workerdef _make_action_configs(): 110*c8dee2aaSAndroid Build Coastguard Worker """ 111*c8dee2aaSAndroid Build Coastguard Worker This function sets up the tools needed to perform the various compile/link actions. 112*c8dee2aaSAndroid Build Coastguard Worker 113*c8dee2aaSAndroid Build Coastguard Worker Bazel normally restricts us to referring to (and therefore running) executables/scripts 114*c8dee2aaSAndroid Build Coastguard Worker that are in this directory (That is EXEC_ROOT/toolchain). However, the executables we want 115*c8dee2aaSAndroid Build Coastguard Worker to run are brought in via WORKSPACE.bazel and are located in EXEC_ROOT/external/clang.... 116*c8dee2aaSAndroid Build Coastguard Worker Therefore, we make use of "trampoline scripts" that will call the binaries from the 117*c8dee2aaSAndroid Build Coastguard Worker toolchain directory. 118*c8dee2aaSAndroid Build Coastguard Worker 119*c8dee2aaSAndroid Build Coastguard Worker These action_configs also let us dynamically specify arguments from the Bazel 120*c8dee2aaSAndroid Build Coastguard Worker environment if necessary (see cpp_link_static_library_action). 121*c8dee2aaSAndroid Build Coastguard Worker """ 122*c8dee2aaSAndroid Build Coastguard Worker 123*c8dee2aaSAndroid Build Coastguard Worker # https://cs.opensource.google/bazel/bazel/+/master:tools/cpp/cc_toolchain_config_lib.bzl;l=435;drc=3b9e6f201a9a3465720aad8712ab7bcdeaf2e5da 124*c8dee2aaSAndroid Build Coastguard Worker clang_tool = tool(path = "mac_trampolines/clang_trampoline_mac.sh") 125*c8dee2aaSAndroid Build Coastguard Worker ar_tool = tool(path = "mac_trampolines/ar_trampoline_mac.sh") 126*c8dee2aaSAndroid Build Coastguard Worker 127*c8dee2aaSAndroid Build Coastguard Worker # https://cs.opensource.google/bazel/bazel/+/master:tools/cpp/cc_toolchain_config_lib.bzl;l=488;drc=3b9e6f201a9a3465720aad8712ab7bcdeaf2e5da 128*c8dee2aaSAndroid Build Coastguard Worker assemble_action = action_config( 129*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.assemble, 130*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 131*c8dee2aaSAndroid Build Coastguard Worker ) 132*c8dee2aaSAndroid Build Coastguard Worker c_compile_action = action_config( 133*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.c_compile, 134*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 135*c8dee2aaSAndroid Build Coastguard Worker ) 136*c8dee2aaSAndroid Build Coastguard Worker cpp_compile_action = action_config( 137*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.cpp_compile, 138*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 139*c8dee2aaSAndroid Build Coastguard Worker ) 140*c8dee2aaSAndroid Build Coastguard Worker objc_compile_action = action_config( 141*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.objc_compile, 142*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 143*c8dee2aaSAndroid Build Coastguard Worker ) 144*c8dee2aaSAndroid Build Coastguard Worker objcpp_compile_action = action_config( 145*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.objcpp_compile, 146*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 147*c8dee2aaSAndroid Build Coastguard Worker ) 148*c8dee2aaSAndroid Build Coastguard Worker linkstamp_compile_action = action_config( 149*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.linkstamp_compile, 150*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 151*c8dee2aaSAndroid Build Coastguard Worker ) 152*c8dee2aaSAndroid Build Coastguard Worker preprocess_assemble_action = action_config( 153*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.preprocess_assemble, 154*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 155*c8dee2aaSAndroid Build Coastguard Worker ) 156*c8dee2aaSAndroid Build Coastguard Worker 157*c8dee2aaSAndroid Build Coastguard Worker cpp_link_dynamic_library_action = action_config( 158*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.cpp_link_dynamic_library, 159*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 160*c8dee2aaSAndroid Build Coastguard Worker ) 161*c8dee2aaSAndroid Build Coastguard Worker cpp_link_executable_action = action_config( 162*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.cpp_link_executable, 163*c8dee2aaSAndroid Build Coastguard Worker # Bazel assumes it is talking to clang when building an executable. There are 164*c8dee2aaSAndroid Build Coastguard Worker # "-Wl" flags on the command: https://releases.llvm.org/6.0.1/tools/clang/docs/ClangCommandLineReference.html#cmdoption-clang-Wl 165*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 166*c8dee2aaSAndroid Build Coastguard Worker ) 167*c8dee2aaSAndroid Build Coastguard Worker cpp_link_nodeps_dynamic_library_action = action_config( 168*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.cpp_link_nodeps_dynamic_library, 169*c8dee2aaSAndroid Build Coastguard Worker tools = [clang_tool], 170*c8dee2aaSAndroid Build Coastguard Worker ) 171*c8dee2aaSAndroid Build Coastguard Worker 172*c8dee2aaSAndroid Build Coastguard Worker # objc archiver and cpp archiver actions use the same base flags 173*c8dee2aaSAndroid Build Coastguard Worker common_archive_flags = [ 174*c8dee2aaSAndroid Build Coastguard Worker flag_set( 175*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 176*c8dee2aaSAndroid Build Coastguard Worker flag_group( 177*c8dee2aaSAndroid Build Coastguard Worker # https://llvm.org/docs/CommandGuide/llvm-ar.html 178*c8dee2aaSAndroid Build Coastguard Worker # [r]eplace existing files or insert them if they already exist, 179*c8dee2aaSAndroid Build Coastguard Worker # [c]reate the file if it doesn't already exist 180*c8dee2aaSAndroid Build Coastguard Worker # [s]ymbol table should be added 181*c8dee2aaSAndroid Build Coastguard Worker # [D]eterministic timestamps should be used 182*c8dee2aaSAndroid Build Coastguard Worker flags = ["rcsD", "%{output_execpath}"], 183*c8dee2aaSAndroid Build Coastguard Worker # Despite the name, output_execpath just refers to linker output, 184*c8dee2aaSAndroid Build Coastguard Worker # e.g. libFoo.a 185*c8dee2aaSAndroid Build Coastguard Worker expand_if_available = "output_execpath", 186*c8dee2aaSAndroid Build Coastguard Worker ), 187*c8dee2aaSAndroid Build Coastguard Worker ], 188*c8dee2aaSAndroid Build Coastguard Worker ), 189*c8dee2aaSAndroid Build Coastguard Worker flag_set( 190*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 191*c8dee2aaSAndroid Build Coastguard Worker flag_group( 192*c8dee2aaSAndroid Build Coastguard Worker iterate_over = "libraries_to_link", 193*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 194*c8dee2aaSAndroid Build Coastguard Worker flag_group( 195*c8dee2aaSAndroid Build Coastguard Worker flags = ["%{libraries_to_link.name}"], 196*c8dee2aaSAndroid Build Coastguard Worker expand_if_equal = variable_with_value( 197*c8dee2aaSAndroid Build Coastguard Worker name = "libraries_to_link.type", 198*c8dee2aaSAndroid Build Coastguard Worker value = "object_file", 199*c8dee2aaSAndroid Build Coastguard Worker ), 200*c8dee2aaSAndroid Build Coastguard Worker ), 201*c8dee2aaSAndroid Build Coastguard Worker flag_group( 202*c8dee2aaSAndroid Build Coastguard Worker flags = ["%{libraries_to_link.object_files}"], 203*c8dee2aaSAndroid Build Coastguard Worker iterate_over = "libraries_to_link.object_files", 204*c8dee2aaSAndroid Build Coastguard Worker expand_if_equal = variable_with_value( 205*c8dee2aaSAndroid Build Coastguard Worker name = "libraries_to_link.type", 206*c8dee2aaSAndroid Build Coastguard Worker value = "object_file_group", 207*c8dee2aaSAndroid Build Coastguard Worker ), 208*c8dee2aaSAndroid Build Coastguard Worker ), 209*c8dee2aaSAndroid Build Coastguard Worker ], 210*c8dee2aaSAndroid Build Coastguard Worker expand_if_available = "libraries_to_link", 211*c8dee2aaSAndroid Build Coastguard Worker ), 212*c8dee2aaSAndroid Build Coastguard Worker ], 213*c8dee2aaSAndroid Build Coastguard Worker ), 214*c8dee2aaSAndroid Build Coastguard Worker flag_set( 215*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 216*c8dee2aaSAndroid Build Coastguard Worker flag_group( 217*c8dee2aaSAndroid Build Coastguard Worker flags = ["@%{linker_param_file}"], 218*c8dee2aaSAndroid Build Coastguard Worker expand_if_available = "linker_param_file", 219*c8dee2aaSAndroid Build Coastguard Worker ), 220*c8dee2aaSAndroid Build Coastguard Worker ], 221*c8dee2aaSAndroid Build Coastguard Worker ), 222*c8dee2aaSAndroid Build Coastguard Worker ] 223*c8dee2aaSAndroid Build Coastguard Worker 224*c8dee2aaSAndroid Build Coastguard Worker # This is the same rule as 225*c8dee2aaSAndroid Build Coastguard Worker # https://github.com/emscripten-core/emsdk/blob/7f39d100d8cd207094decea907121df72065517e/bazel/emscripten_toolchain/crosstool.bzl#L143 226*c8dee2aaSAndroid Build Coastguard Worker # By default, there are no flags or libraries passed to the llvm-ar tool, so 227*c8dee2aaSAndroid Build Coastguard Worker # we need to specify them. The variables mentioned by expand_if_available are defined 228*c8dee2aaSAndroid Build Coastguard Worker # https://bazel.build/docs/cc-toolchain-config-reference#cctoolchainconfiginfo-build-variables 229*c8dee2aaSAndroid Build Coastguard Worker cpp_link_static_library_action = action_config( 230*c8dee2aaSAndroid Build Coastguard Worker action_name = ACTION_NAMES.cpp_link_static_library, 231*c8dee2aaSAndroid Build Coastguard Worker flag_sets = common_archive_flags, 232*c8dee2aaSAndroid Build Coastguard Worker tools = [ar_tool], 233*c8dee2aaSAndroid Build Coastguard Worker ) 234*c8dee2aaSAndroid Build Coastguard Worker 235*c8dee2aaSAndroid Build Coastguard Worker action_configs = [ 236*c8dee2aaSAndroid Build Coastguard Worker assemble_action, 237*c8dee2aaSAndroid Build Coastguard Worker c_compile_action, 238*c8dee2aaSAndroid Build Coastguard Worker cpp_compile_action, 239*c8dee2aaSAndroid Build Coastguard Worker cpp_link_dynamic_library_action, 240*c8dee2aaSAndroid Build Coastguard Worker cpp_link_executable_action, 241*c8dee2aaSAndroid Build Coastguard Worker cpp_link_nodeps_dynamic_library_action, 242*c8dee2aaSAndroid Build Coastguard Worker cpp_link_static_library_action, 243*c8dee2aaSAndroid Build Coastguard Worker linkstamp_compile_action, 244*c8dee2aaSAndroid Build Coastguard Worker objc_compile_action, 245*c8dee2aaSAndroid Build Coastguard Worker objcpp_compile_action, 246*c8dee2aaSAndroid Build Coastguard Worker preprocess_assemble_action, 247*c8dee2aaSAndroid Build Coastguard Worker ] 248*c8dee2aaSAndroid Build Coastguard Worker return action_configs 249*c8dee2aaSAndroid Build Coastguard Worker 250*c8dee2aaSAndroid Build Coastguard Worker# In addition to pointing the c and cpp compile actions to our toolchain, we also need to set objc 251*c8dee2aaSAndroid Build Coastguard Worker# and objcpp action flags as well. We build .m and .mm files with the objc_library rule, which 252*c8dee2aaSAndroid Build Coastguard Worker# will use the default toolchain if not specified here. 253*c8dee2aaSAndroid Build Coastguard Worker# https://docs.bazel.build/versions/3.3.0/be/objective-c.html#objc_library 254*c8dee2aaSAndroid Build Coastguard Worker# 255*c8dee2aaSAndroid Build Coastguard Worker# Note: These values must be kept in sync with those defined in cmake_exporter.go. 256*c8dee2aaSAndroid Build Coastguard Workerdef _make_default_flags(): 257*c8dee2aaSAndroid Build Coastguard Worker """Here we define the flags for certain actions that are always applied. 258*c8dee2aaSAndroid Build Coastguard Worker 259*c8dee2aaSAndroid Build Coastguard Worker For any flag that might be conditionally applied, it should be defined in //bazel/copts.bzl. 260*c8dee2aaSAndroid Build Coastguard Worker 261*c8dee2aaSAndroid Build Coastguard Worker Flags that are set here will be unconditionally applied to everything we compile with 262*c8dee2aaSAndroid Build Coastguard Worker this toolchain, even third_party deps. 263*c8dee2aaSAndroid Build Coastguard Worker 264*c8dee2aaSAndroid Build Coastguard Worker """ 265*c8dee2aaSAndroid Build Coastguard Worker cxx_compile_includes = flag_set( 266*c8dee2aaSAndroid Build Coastguard Worker actions = [ 267*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.c_compile, 268*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_compile, 269*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.objc_compile, 270*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.objcpp_compile, 271*c8dee2aaSAndroid Build Coastguard Worker ], 272*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 273*c8dee2aaSAndroid Build Coastguard Worker flag_group( 274*c8dee2aaSAndroid Build Coastguard Worker flags = [ 275*c8dee2aaSAndroid Build Coastguard Worker # THIS ORDER MATTERS GREATLY. If these are in the wrong order, the 276*c8dee2aaSAndroid Build Coastguard Worker # #include_next directives will fail to find the files, causing a compilation 277*c8dee2aaSAndroid Build Coastguard Worker # error (or, without -no-canonical-prefixes, a mysterious case where files 278*c8dee2aaSAndroid Build Coastguard Worker # are included with an absolute path and fail the build). 279*c8dee2aaSAndroid Build Coastguard Worker "-isystem", 280*c8dee2aaSAndroid Build Coastguard Worker EXTERNAL_TOOLCHAIN + "/include/c++/v1", 281*c8dee2aaSAndroid Build Coastguard Worker "-isystem", 282*c8dee2aaSAndroid Build Coastguard Worker XCODE_MACSDK_SYMLINK + "/usr/include", 283*c8dee2aaSAndroid Build Coastguard Worker "-isystem", 284*c8dee2aaSAndroid Build Coastguard Worker EXTERNAL_TOOLCHAIN + "/lib/clang/15.0.1/include", 285*c8dee2aaSAndroid Build Coastguard Worker # Set the framework path to the Mac SDK framework directory. This has 286*c8dee2aaSAndroid Build Coastguard Worker # subfolders like OpenGL.framework 287*c8dee2aaSAndroid Build Coastguard Worker # We want -iframework so Clang hides diagnostic warnings from those header 288*c8dee2aaSAndroid Build Coastguard Worker # files we include. -F does not hide those. 289*c8dee2aaSAndroid Build Coastguard Worker "-iframework", 290*c8dee2aaSAndroid Build Coastguard Worker XCODE_MACSDK_SYMLINK + "/System/Library/Frameworks", 291*c8dee2aaSAndroid Build Coastguard Worker # We do not want clang to search in absolute paths for files. This makes 292*c8dee2aaSAndroid Build Coastguard Worker # Bazel think we are using an outside resource and fail the compile. 293*c8dee2aaSAndroid Build Coastguard Worker "-no-canonical-prefixes", 294*c8dee2aaSAndroid Build Coastguard Worker ], 295*c8dee2aaSAndroid Build Coastguard Worker ), 296*c8dee2aaSAndroid Build Coastguard Worker ], 297*c8dee2aaSAndroid Build Coastguard Worker ) 298*c8dee2aaSAndroid Build Coastguard Worker 299*c8dee2aaSAndroid Build Coastguard Worker cpp_compile_flags = flag_set( 300*c8dee2aaSAndroid Build Coastguard Worker actions = [ 301*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_compile, 302*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.objc_compile, 303*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.objcpp_compile, 304*c8dee2aaSAndroid Build Coastguard Worker ], 305*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 306*c8dee2aaSAndroid Build Coastguard Worker flag_group( 307*c8dee2aaSAndroid Build Coastguard Worker flags = [ 308*c8dee2aaSAndroid Build Coastguard Worker "-std=c++17", 309*c8dee2aaSAndroid Build Coastguard Worker ], 310*c8dee2aaSAndroid Build Coastguard Worker ), 311*c8dee2aaSAndroid Build Coastguard Worker ], 312*c8dee2aaSAndroid Build Coastguard Worker ) 313*c8dee2aaSAndroid Build Coastguard Worker 314*c8dee2aaSAndroid Build Coastguard Worker # copts and defines appear to not automatically be set 315*c8dee2aaSAndroid Build Coastguard Worker # https://bazel.build/docs/cc-toolchain-config-reference#cctoolchainconfiginfo-build-variables 316*c8dee2aaSAndroid Build Coastguard Worker # https://github.com/bazelbuild/bazel/blob/5ad4a6126be2bdc53ee7e2457e076c90efe86d56/tools/cpp/cc_toolchain_config_lib.bzl#L200-L209 317*c8dee2aaSAndroid Build Coastguard Worker objc_compile_flags = flag_set( 318*c8dee2aaSAndroid Build Coastguard Worker actions = [ 319*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.objc_compile, 320*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.objcpp_compile, 321*c8dee2aaSAndroid Build Coastguard Worker ], 322*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 323*c8dee2aaSAndroid Build Coastguard Worker flag_group( 324*c8dee2aaSAndroid Build Coastguard Worker iterate_over = "user_compile_flags", 325*c8dee2aaSAndroid Build Coastguard Worker flags = ["%{user_compile_flags}"], 326*c8dee2aaSAndroid Build Coastguard Worker ), 327*c8dee2aaSAndroid Build Coastguard Worker flag_group( 328*c8dee2aaSAndroid Build Coastguard Worker iterate_over = "preprocessor_defines", 329*c8dee2aaSAndroid Build Coastguard Worker flags = ["-D%{preprocessor_defines}"], 330*c8dee2aaSAndroid Build Coastguard Worker ), 331*c8dee2aaSAndroid Build Coastguard Worker ], 332*c8dee2aaSAndroid Build Coastguard Worker ) 333*c8dee2aaSAndroid Build Coastguard Worker 334*c8dee2aaSAndroid Build Coastguard Worker link_exe_flags = flag_set( 335*c8dee2aaSAndroid Build Coastguard Worker actions = [ 336*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_link_executable, 337*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_link_dynamic_library, 338*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_link_nodeps_dynamic_library, 339*c8dee2aaSAndroid Build Coastguard Worker ], 340*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 341*c8dee2aaSAndroid Build Coastguard Worker flag_group( 342*c8dee2aaSAndroid Build Coastguard Worker flags = [ 343*c8dee2aaSAndroid Build Coastguard Worker # lld goes through dynamic library dependencies for dylib and tbh files through 344*c8dee2aaSAndroid Build Coastguard Worker # absolute paths (/System/Library/Frameworks). However, the dependencies live in 345*c8dee2aaSAndroid Build Coastguard Worker # [Xcode dir]/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks 346*c8dee2aaSAndroid Build Coastguard Worker # -Wl tells clang to forward the next flag to the linker. 347*c8dee2aaSAndroid Build Coastguard Worker # -syslibroot appends to the beginning of the dylib dependency path. 348*c8dee2aaSAndroid Build Coastguard Worker # https://github.com/llvm/llvm-project/blob/d61341768cf0cff7ceeaddecc2f769b5c1b901c4/lld/MachO/InputFiles.cpp#L1418-L1420 349*c8dee2aaSAndroid Build Coastguard Worker "-Wl,-syslibroot", 350*c8dee2aaSAndroid Build Coastguard Worker XCODE_MACSDK_SYMLINK, 351*c8dee2aaSAndroid Build Coastguard Worker # This path is relative to the syslibroot above, and we want lld to look in the 352*c8dee2aaSAndroid Build Coastguard Worker # Frameworks symlink that was created in download_mac_toolchain.bzl. 353*c8dee2aaSAndroid Build Coastguard Worker "-F/System/Library/Frameworks", 354*c8dee2aaSAndroid Build Coastguard Worker "-fuse-ld=lld", 355*c8dee2aaSAndroid Build Coastguard Worker "-std=c++17", 356*c8dee2aaSAndroid Build Coastguard Worker "-stdlib=libc++", 357*c8dee2aaSAndroid Build Coastguard Worker EXTERNAL_TOOLCHAIN + "/lib/libc++.a", 358*c8dee2aaSAndroid Build Coastguard Worker EXTERNAL_TOOLCHAIN + "/lib/libc++abi.a", 359*c8dee2aaSAndroid Build Coastguard Worker EXTERNAL_TOOLCHAIN + "/lib/libunwind.a", 360*c8dee2aaSAndroid Build Coastguard Worker ], 361*c8dee2aaSAndroid Build Coastguard Worker ), 362*c8dee2aaSAndroid Build Coastguard Worker ], 363*c8dee2aaSAndroid Build Coastguard Worker ) 364*c8dee2aaSAndroid Build Coastguard Worker 365*c8dee2aaSAndroid Build Coastguard Worker return [feature( 366*c8dee2aaSAndroid Build Coastguard Worker "default_flags", 367*c8dee2aaSAndroid Build Coastguard Worker enabled = True, 368*c8dee2aaSAndroid Build Coastguard Worker flag_sets = [ 369*c8dee2aaSAndroid Build Coastguard Worker cpp_compile_flags, 370*c8dee2aaSAndroid Build Coastguard Worker cxx_compile_includes, 371*c8dee2aaSAndroid Build Coastguard Worker link_exe_flags, 372*c8dee2aaSAndroid Build Coastguard Worker objc_compile_flags, 373*c8dee2aaSAndroid Build Coastguard Worker ], 374*c8dee2aaSAndroid Build Coastguard Worker )] 375*c8dee2aaSAndroid Build Coastguard Worker 376*c8dee2aaSAndroid Build Coastguard Workerdef _make_diagnostic_flags(): 377*c8dee2aaSAndroid Build Coastguard Worker """Here we define the flags that can be turned on via features to yield debug info.""" 378*c8dee2aaSAndroid Build Coastguard Worker cxx_diagnostic = flag_set( 379*c8dee2aaSAndroid Build Coastguard Worker actions = [ 380*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.c_compile, 381*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_compile, 382*c8dee2aaSAndroid Build Coastguard Worker ], 383*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 384*c8dee2aaSAndroid Build Coastguard Worker flag_group( 385*c8dee2aaSAndroid Build Coastguard Worker flags = [ 386*c8dee2aaSAndroid Build Coastguard Worker "--trace-includes", 387*c8dee2aaSAndroid Build Coastguard Worker "-v", 388*c8dee2aaSAndroid Build Coastguard Worker ], 389*c8dee2aaSAndroid Build Coastguard Worker ), 390*c8dee2aaSAndroid Build Coastguard Worker ], 391*c8dee2aaSAndroid Build Coastguard Worker ) 392*c8dee2aaSAndroid Build Coastguard Worker 393*c8dee2aaSAndroid Build Coastguard Worker link_diagnostic = flag_set( 394*c8dee2aaSAndroid Build Coastguard Worker actions = [ACTION_NAMES.cpp_link_executable], 395*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 396*c8dee2aaSAndroid Build Coastguard Worker flag_group( 397*c8dee2aaSAndroid Build Coastguard Worker flags = [ 398*c8dee2aaSAndroid Build Coastguard Worker "-Wl,--verbose", 399*c8dee2aaSAndroid Build Coastguard Worker "-v", 400*c8dee2aaSAndroid Build Coastguard Worker ], 401*c8dee2aaSAndroid Build Coastguard Worker ), 402*c8dee2aaSAndroid Build Coastguard Worker ], 403*c8dee2aaSAndroid Build Coastguard Worker ) 404*c8dee2aaSAndroid Build Coastguard Worker 405*c8dee2aaSAndroid Build Coastguard Worker link_search_dirs = flag_set( 406*c8dee2aaSAndroid Build Coastguard Worker actions = [ACTION_NAMES.cpp_link_executable], 407*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 408*c8dee2aaSAndroid Build Coastguard Worker flag_group( 409*c8dee2aaSAndroid Build Coastguard Worker flags = [ 410*c8dee2aaSAndroid Build Coastguard Worker "--print-search-dirs", 411*c8dee2aaSAndroid Build Coastguard Worker ], 412*c8dee2aaSAndroid Build Coastguard Worker ), 413*c8dee2aaSAndroid Build Coastguard Worker ], 414*c8dee2aaSAndroid Build Coastguard Worker ) 415*c8dee2aaSAndroid Build Coastguard Worker return [ 416*c8dee2aaSAndroid Build Coastguard Worker # Running a Bazel command with --features diagnostic will cause the compilation and 417*c8dee2aaSAndroid Build Coastguard Worker # link steps to be more verbose. 418*c8dee2aaSAndroid Build Coastguard Worker feature( 419*c8dee2aaSAndroid Build Coastguard Worker "diagnostic", 420*c8dee2aaSAndroid Build Coastguard Worker enabled = False, 421*c8dee2aaSAndroid Build Coastguard Worker flag_sets = [ 422*c8dee2aaSAndroid Build Coastguard Worker cxx_diagnostic, 423*c8dee2aaSAndroid Build Coastguard Worker link_diagnostic, 424*c8dee2aaSAndroid Build Coastguard Worker ], 425*c8dee2aaSAndroid Build Coastguard Worker ), 426*c8dee2aaSAndroid Build Coastguard Worker feature( 427*c8dee2aaSAndroid Build Coastguard Worker "link_diagnostic", 428*c8dee2aaSAndroid Build Coastguard Worker enabled = False, 429*c8dee2aaSAndroid Build Coastguard Worker flag_sets = [ 430*c8dee2aaSAndroid Build Coastguard Worker link_diagnostic, 431*c8dee2aaSAndroid Build Coastguard Worker ], 432*c8dee2aaSAndroid Build Coastguard Worker ), 433*c8dee2aaSAndroid Build Coastguard Worker # Running a Bazel command with --features print_search_dirs will cause the link to fail 434*c8dee2aaSAndroid Build Coastguard Worker # but directories searched for libraries, etc will be displayed. 435*c8dee2aaSAndroid Build Coastguard Worker feature( 436*c8dee2aaSAndroid Build Coastguard Worker "print_search_dirs", 437*c8dee2aaSAndroid Build Coastguard Worker enabled = False, 438*c8dee2aaSAndroid Build Coastguard Worker flag_sets = [ 439*c8dee2aaSAndroid Build Coastguard Worker link_search_dirs, 440*c8dee2aaSAndroid Build Coastguard Worker ], 441*c8dee2aaSAndroid Build Coastguard Worker ), 442*c8dee2aaSAndroid Build Coastguard Worker ] 443*c8dee2aaSAndroid Build Coastguard Worker 444*c8dee2aaSAndroid Build Coastguard Worker# The parameter is of type https://bazel.build/rules/lib/ctx 445*c8dee2aaSAndroid Build Coastguard Workerdef _make_target_specific_flags(ctx): 446*c8dee2aaSAndroid Build Coastguard Worker m1_mac_target = flag_set( 447*c8dee2aaSAndroid Build Coastguard Worker actions = [ 448*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.assemble, 449*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.preprocess_assemble, 450*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.c_compile, 451*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_compile, 452*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.objc_compile, 453*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.objcpp_compile, 454*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_link_executable, 455*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_link_dynamic_library, 456*c8dee2aaSAndroid Build Coastguard Worker ], 457*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 458*c8dee2aaSAndroid Build Coastguard Worker flag_group( 459*c8dee2aaSAndroid Build Coastguard Worker flags = [ 460*c8dee2aaSAndroid Build Coastguard Worker "--target=arm64-apple-macos12", 461*c8dee2aaSAndroid Build Coastguard Worker ], 462*c8dee2aaSAndroid Build Coastguard Worker ), 463*c8dee2aaSAndroid Build Coastguard Worker ], 464*c8dee2aaSAndroid Build Coastguard Worker ) 465*c8dee2aaSAndroid Build Coastguard Worker intel_mac_target = flag_set( 466*c8dee2aaSAndroid Build Coastguard Worker actions = [ 467*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.assemble, 468*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.preprocess_assemble, 469*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.c_compile, 470*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_compile, 471*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.objc_compile, 472*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.objcpp_compile, 473*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_link_executable, 474*c8dee2aaSAndroid Build Coastguard Worker ACTION_NAMES.cpp_link_dynamic_library, 475*c8dee2aaSAndroid Build Coastguard Worker ], 476*c8dee2aaSAndroid Build Coastguard Worker flag_groups = [ 477*c8dee2aaSAndroid Build Coastguard Worker flag_group( 478*c8dee2aaSAndroid Build Coastguard Worker flags = [ 479*c8dee2aaSAndroid Build Coastguard Worker "--target=x86_64-apple-macos12", 480*c8dee2aaSAndroid Build Coastguard Worker ], 481*c8dee2aaSAndroid Build Coastguard Worker ), 482*c8dee2aaSAndroid Build Coastguard Worker ], 483*c8dee2aaSAndroid Build Coastguard Worker ) 484*c8dee2aaSAndroid Build Coastguard Worker 485*c8dee2aaSAndroid Build Coastguard Worker target_specific_features = [] 486*c8dee2aaSAndroid Build Coastguard Worker if _has_platform_constraint(ctx, "@platforms//cpu:arm64"): 487*c8dee2aaSAndroid Build Coastguard Worker target_specific_features.append( 488*c8dee2aaSAndroid Build Coastguard Worker feature( 489*c8dee2aaSAndroid Build Coastguard Worker name = "_m1_mac_target", 490*c8dee2aaSAndroid Build Coastguard Worker enabled = True, 491*c8dee2aaSAndroid Build Coastguard Worker flag_sets = [m1_mac_target], 492*c8dee2aaSAndroid Build Coastguard Worker ), 493*c8dee2aaSAndroid Build Coastguard Worker ) 494*c8dee2aaSAndroid Build Coastguard Worker elif _has_platform_constraint(ctx, "@platforms//cpu:x86_64"): 495*c8dee2aaSAndroid Build Coastguard Worker target_specific_features.append( 496*c8dee2aaSAndroid Build Coastguard Worker feature( 497*c8dee2aaSAndroid Build Coastguard Worker name = "_intel_mac_target", 498*c8dee2aaSAndroid Build Coastguard Worker enabled = True, 499*c8dee2aaSAndroid Build Coastguard Worker flag_sets = [intel_mac_target], 500*c8dee2aaSAndroid Build Coastguard Worker ), 501*c8dee2aaSAndroid Build Coastguard Worker ) 502*c8dee2aaSAndroid Build Coastguard Worker 503*c8dee2aaSAndroid Build Coastguard Worker return target_specific_features 504