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