xref: /aosp_15_r20/external/skia/toolchain/mac_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 (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