xref: /aosp_15_r20/external/skia/toolchain/ios_toolchain_config.bzl (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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