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