xref: /aosp_15_r20/external/skia/toolchain/windows_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 Windows host.
3*c8dee2aaSAndroid Build Coastguard Worker
4*c8dee2aaSAndroid Build Coastguard WorkerSee download_windows_toolchain.bzl for more details on the creation of the toolchain.
5*c8dee2aaSAndroid Build Coastguard Worker
6*c8dee2aaSAndroid Build Coastguard WorkerIt uses the usr subfolder of the built toolchain as a sysroot
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard WorkerIt follows the example of:
9*c8dee2aaSAndroid Build Coastguard Worker - linux_amd64_toolchain_config.bzl
10*c8dee2aaSAndroid Build Coastguard Worker"""
11*c8dee2aaSAndroid Build Coastguard Worker
12*c8dee2aaSAndroid Build Coastguard Worker# https://github.com/bazelbuild/bazel/blob/master/tools/build_defs/cc/action_names.bzl
13*c8dee2aaSAndroid Build Coastguard Workerload("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES")
14*c8dee2aaSAndroid Build Coastguard Worker
15*c8dee2aaSAndroid Build Coastguard Worker# https://github.com/bazelbuild/bazel/blob/master/tools/cpp/cc_toolchain_config_lib.bzl
16*c8dee2aaSAndroid Build Coastguard Workerload(
17*c8dee2aaSAndroid Build Coastguard Worker    "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl",
18*c8dee2aaSAndroid Build Coastguard Worker    "action_config",
19*c8dee2aaSAndroid Build Coastguard Worker    "feature",
20*c8dee2aaSAndroid Build Coastguard Worker    "flag_group",
21*c8dee2aaSAndroid Build Coastguard Worker    "flag_set",
22*c8dee2aaSAndroid Build Coastguard Worker    "tool",
23*c8dee2aaSAndroid Build Coastguard Worker    "variable_with_value",
24*c8dee2aaSAndroid Build Coastguard Worker)
25*c8dee2aaSAndroid Build Coastguard Worker
26*c8dee2aaSAndroid Build Coastguard Worker# TODO(borenet): These variables were copied from the automatically-generated
27*c8dee2aaSAndroid Build Coastguard Worker# @clang_windows_amd64//:vars.bzl file. They are available to be directly
28*c8dee2aaSAndroid Build Coastguard Worker# used here, but in order to do so, Bazel needs access to both the Clang and
29*c8dee2aaSAndroid Build Coastguard Worker# MSVC archives, even when we aren't going to use this toolchain. Due to the
30*c8dee2aaSAndroid Build Coastguard Worker# time required to download and extract these archives, we've opted to hard-code
31*c8dee2aaSAndroid Build Coastguard Worker# the versions and paths here.
32*c8dee2aaSAndroid Build Coastguard Worker#load("@clang_windows_amd64//:vars.bzl", "MSVC_INCLUDE", "MSVC_LIB", "WIN_SDK_INCLUDE", "WIN_SDK_LIB")
33*c8dee2aaSAndroid Build Coastguard WorkerMSVC_VERSION = "14.39.33519"
34*c8dee2aaSAndroid Build Coastguard WorkerMSVC_INCLUDE = "VC/Tools/MSVC/" + MSVC_VERSION + "/include"
35*c8dee2aaSAndroid Build Coastguard WorkerMSVC_LIB = "VC/Tools/MSVC/" + MSVC_VERSION + "/lib"
36*c8dee2aaSAndroid Build Coastguard WorkerWIN_SDK_VERSION = "10.0.22621.0"
37*c8dee2aaSAndroid Build Coastguard WorkerWIN_SDK_INCLUDE = "win_sdk/Include/" + WIN_SDK_VERSION
38*c8dee2aaSAndroid Build Coastguard WorkerWIN_SDK_LIB = "win_sdk/Lib/" + WIN_SDK_VERSION
39*c8dee2aaSAndroid Build Coastguard Worker
40*c8dee2aaSAndroid Build Coastguard Worker# The location of the downloaded clang toolchain.
41*c8dee2aaSAndroid Build Coastguard WorkerCLANG_TOOLCHAIN = "external/clang_windows_amd64"
42*c8dee2aaSAndroid Build Coastguard Worker
43*c8dee2aaSAndroid Build Coastguard Worker# Paths inside the win_toolchain CIPD package.
44*c8dee2aaSAndroid Build Coastguard WorkerFULL_MSVC_INCLUDE = CLANG_TOOLCHAIN + "/" + MSVC_INCLUDE
45*c8dee2aaSAndroid Build Coastguard WorkerFULL_MSVC_LIB = CLANG_TOOLCHAIN + "/" + MSVC_LIB
46*c8dee2aaSAndroid Build Coastguard WorkerFULL_WIN_SDK_INCLUDE = CLANG_TOOLCHAIN + "/" + WIN_SDK_INCLUDE
47*c8dee2aaSAndroid Build Coastguard WorkerFULL_WIN_SDK_LIB = CLANG_TOOLCHAIN + "/" + WIN_SDK_LIB
48*c8dee2aaSAndroid Build Coastguard Worker
49*c8dee2aaSAndroid Build Coastguard Workerdef _windows_amd64_toolchain_info(ctx):
50*c8dee2aaSAndroid Build Coastguard Worker    action_configs = _make_action_configs()
51*c8dee2aaSAndroid Build Coastguard Worker    features = [
52*c8dee2aaSAndroid Build Coastguard Worker        feature(
53*c8dee2aaSAndroid Build Coastguard Worker            name = "archive_param_file",
54*c8dee2aaSAndroid Build Coastguard Worker            enabled = True,
55*c8dee2aaSAndroid Build Coastguard Worker        ),
56*c8dee2aaSAndroid Build Coastguard Worker    ]
57*c8dee2aaSAndroid Build Coastguard Worker    features += _make_default_flags()
58*c8dee2aaSAndroid Build Coastguard Worker    features += _make_diagnostic_flags()
59*c8dee2aaSAndroid Build Coastguard Worker
60*c8dee2aaSAndroid Build Coastguard Worker    # https://bazel.build/rules/lib/cc_common#create_cc_toolchain_config_info
61*c8dee2aaSAndroid Build Coastguard Worker    # Note, this rule is defined in Java code, not Starlark
62*c8dee2aaSAndroid Build Coastguard Worker    # https://cs.opensource.google/bazel/bazel/+/master:src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java
63*c8dee2aaSAndroid Build Coastguard Worker    return cc_common.create_cc_toolchain_config_info(
64*c8dee2aaSAndroid Build Coastguard Worker        ctx = ctx,
65*c8dee2aaSAndroid Build Coastguard Worker        features = features,
66*c8dee2aaSAndroid Build Coastguard Worker        action_configs = action_configs,
67*c8dee2aaSAndroid Build Coastguard Worker        # These are required, but do nothing
68*c8dee2aaSAndroid Build Coastguard Worker        compiler = "",
69*c8dee2aaSAndroid Build Coastguard Worker        target_cpu = "",
70*c8dee2aaSAndroid Build Coastguard Worker        target_libc = "",
71*c8dee2aaSAndroid Build Coastguard Worker        target_system_name = "",
72*c8dee2aaSAndroid Build Coastguard Worker        toolchain_identifier = "",
73*c8dee2aaSAndroid Build Coastguard Worker    )
74*c8dee2aaSAndroid Build Coastguard Worker
75*c8dee2aaSAndroid Build Coastguard Workerprovide_windows_amd64_toolchain_config = rule(
76*c8dee2aaSAndroid Build Coastguard Worker    attrs = {},
77*c8dee2aaSAndroid Build Coastguard Worker    provides = [CcToolchainConfigInfo],
78*c8dee2aaSAndroid Build Coastguard Worker    implementation = _windows_amd64_toolchain_info,
79*c8dee2aaSAndroid Build Coastguard Worker)
80*c8dee2aaSAndroid Build Coastguard Worker
81*c8dee2aaSAndroid Build Coastguard Workerdef _make_action_configs():
82*c8dee2aaSAndroid Build Coastguard Worker    """
83*c8dee2aaSAndroid Build Coastguard Worker    This function sets up the tools needed to perform the various compile/link actions.
84*c8dee2aaSAndroid Build Coastguard Worker
85*c8dee2aaSAndroid Build Coastguard Worker    Bazel normally restricts us to referring to (and therefore running) executables/scripts
86*c8dee2aaSAndroid Build Coastguard Worker    that are in this directory (That is EXEC_ROOT/toolchain). However, the executables we want
87*c8dee2aaSAndroid Build Coastguard Worker    to run are brought in via WORKSPACE.bazel and are located in EXEC_ROOT/external/clang....
88*c8dee2aaSAndroid Build Coastguard Worker    Therefore, we make use of "trampoline scripts" that will call the binaries from the
89*c8dee2aaSAndroid Build Coastguard Worker    toolchain directory.
90*c8dee2aaSAndroid Build Coastguard Worker
91*c8dee2aaSAndroid Build Coastguard Worker    These action_configs also let us dynamically specify arguments from the Bazel
92*c8dee2aaSAndroid Build Coastguard Worker    environment if necessary (see cpp_link_static_library_action).
93*c8dee2aaSAndroid Build Coastguard Worker    """
94*c8dee2aaSAndroid Build Coastguard Worker
95*c8dee2aaSAndroid Build Coastguard Worker    # https://cs.opensource.google/bazel/bazel/+/master:tools/cpp/cc_toolchain_config_lib.bzl;l=435;drc=3b9e6f201a9a3465720aad8712ab7bcdeaf2e5da
96*c8dee2aaSAndroid Build Coastguard Worker    clang_tool = tool(path = "windows_trampolines/clang_trampoline_windows.bat")
97*c8dee2aaSAndroid Build Coastguard Worker    ar_tool = tool(path = "windows_trampolines/ar_trampoline_windows.bat")
98*c8dee2aaSAndroid Build Coastguard Worker
99*c8dee2aaSAndroid Build Coastguard Worker    # https://cs.opensource.google/bazel/bazel/+/master:tools/cpp/cc_toolchain_config_lib.bzl;l=488;drc=3b9e6f201a9a3465720aad8712ab7bcdeaf2e5da
100*c8dee2aaSAndroid Build Coastguard Worker    assemble_action = action_config(
101*c8dee2aaSAndroid Build Coastguard Worker        action_name = ACTION_NAMES.assemble,
102*c8dee2aaSAndroid Build Coastguard Worker        tools = [clang_tool],
103*c8dee2aaSAndroid Build Coastguard Worker    )
104*c8dee2aaSAndroid Build Coastguard Worker    c_compile_action = action_config(
105*c8dee2aaSAndroid Build Coastguard Worker        action_name = ACTION_NAMES.c_compile,
106*c8dee2aaSAndroid Build Coastguard Worker        tools = [clang_tool],
107*c8dee2aaSAndroid Build Coastguard Worker    )
108*c8dee2aaSAndroid Build Coastguard Worker    cpp_compile_action = action_config(
109*c8dee2aaSAndroid Build Coastguard Worker        action_name = ACTION_NAMES.cpp_compile,
110*c8dee2aaSAndroid Build Coastguard Worker        tools = [clang_tool],
111*c8dee2aaSAndroid Build Coastguard Worker    )
112*c8dee2aaSAndroid Build Coastguard Worker    linkstamp_compile_action = action_config(
113*c8dee2aaSAndroid Build Coastguard Worker        action_name = ACTION_NAMES.linkstamp_compile,
114*c8dee2aaSAndroid Build Coastguard Worker        tools = [clang_tool],
115*c8dee2aaSAndroid Build Coastguard Worker    )
116*c8dee2aaSAndroid Build Coastguard Worker    preprocess_assemble_action = action_config(
117*c8dee2aaSAndroid Build Coastguard Worker        action_name = ACTION_NAMES.preprocess_assemble,
118*c8dee2aaSAndroid Build Coastguard Worker        tools = [clang_tool],
119*c8dee2aaSAndroid Build Coastguard Worker    )
120*c8dee2aaSAndroid Build Coastguard Worker
121*c8dee2aaSAndroid Build Coastguard Worker    cpp_link_dynamic_library_action = action_config(
122*c8dee2aaSAndroid Build Coastguard Worker        action_name = ACTION_NAMES.cpp_link_dynamic_library,
123*c8dee2aaSAndroid Build Coastguard Worker        tools = [clang_tool],
124*c8dee2aaSAndroid Build Coastguard Worker    )
125*c8dee2aaSAndroid Build Coastguard Worker    cpp_link_executable_action = action_config(
126*c8dee2aaSAndroid Build Coastguard Worker        action_name = ACTION_NAMES.cpp_link_executable,
127*c8dee2aaSAndroid Build Coastguard Worker        # Bazel assumes it is talking to clang when building an executable. There are
128*c8dee2aaSAndroid Build Coastguard Worker        # "-Wl" flags on the command: https://releases.llvm.org/6.0.1/tools/clang/docs/ClangCommandLineReference.html#cmdoption-clang-Wl
129*c8dee2aaSAndroid Build Coastguard Worker        tools = [clang_tool],
130*c8dee2aaSAndroid Build Coastguard Worker    )
131*c8dee2aaSAndroid Build Coastguard Worker    cpp_link_nodeps_dynamic_library_action = action_config(
132*c8dee2aaSAndroid Build Coastguard Worker        action_name = ACTION_NAMES.cpp_link_nodeps_dynamic_library,
133*c8dee2aaSAndroid Build Coastguard Worker        tools = [clang_tool],
134*c8dee2aaSAndroid Build Coastguard Worker    )
135*c8dee2aaSAndroid Build Coastguard Worker
136*c8dee2aaSAndroid Build Coastguard Worker    # By default, there are no flags or libraries passed to the llvm-ar tool, so
137*c8dee2aaSAndroid Build Coastguard Worker    # we need to specify them. The variables mentioned by expand_if_available are defined
138*c8dee2aaSAndroid Build Coastguard Worker    # https://bazel.build/docs/cc-toolchain-config-reference#cctoolchainconfiginfo-build-variables
139*c8dee2aaSAndroid Build Coastguard Worker    cpp_link_static_library_action = action_config(
140*c8dee2aaSAndroid Build Coastguard Worker        action_name = ACTION_NAMES.cpp_link_static_library,
141*c8dee2aaSAndroid Build Coastguard Worker        flag_sets = [
142*c8dee2aaSAndroid Build Coastguard Worker            flag_set(
143*c8dee2aaSAndroid Build Coastguard Worker                flag_groups = [
144*c8dee2aaSAndroid Build Coastguard Worker                    flag_group(
145*c8dee2aaSAndroid Build Coastguard Worker                        # https://llvm.org/docs/CommandGuide/llvm-ar.html
146*c8dee2aaSAndroid Build Coastguard Worker                        # replace existing files or insert them if they already exist,
147*c8dee2aaSAndroid Build Coastguard Worker                        # create the file if it doesn't already exist
148*c8dee2aaSAndroid Build Coastguard Worker                        # symbol table should be added
149*c8dee2aaSAndroid Build Coastguard Worker                        # Deterministic timestamps should be used
150*c8dee2aaSAndroid Build Coastguard Worker                        flags = ["rcsD", "%{output_execpath}"],
151*c8dee2aaSAndroid Build Coastguard Worker                        # Despite the name, output_execpath just refers to linker output,
152*c8dee2aaSAndroid Build Coastguard Worker                        # e.g. libFoo.a
153*c8dee2aaSAndroid Build Coastguard Worker                        expand_if_available = "output_execpath",
154*c8dee2aaSAndroid Build Coastguard Worker                    ),
155*c8dee2aaSAndroid Build Coastguard Worker                ],
156*c8dee2aaSAndroid Build Coastguard Worker            ),
157*c8dee2aaSAndroid Build Coastguard Worker            flag_set(
158*c8dee2aaSAndroid Build Coastguard Worker                flag_groups = [
159*c8dee2aaSAndroid Build Coastguard Worker                    flag_group(
160*c8dee2aaSAndroid Build Coastguard Worker                        iterate_over = "libraries_to_link",
161*c8dee2aaSAndroid Build Coastguard Worker                        flag_groups = [
162*c8dee2aaSAndroid Build Coastguard Worker                            flag_group(
163*c8dee2aaSAndroid Build Coastguard Worker                                flags = ["%{libraries_to_link.name}"],
164*c8dee2aaSAndroid Build Coastguard Worker                                expand_if_equal = variable_with_value(
165*c8dee2aaSAndroid Build Coastguard Worker                                    name = "libraries_to_link.type",
166*c8dee2aaSAndroid Build Coastguard Worker                                    value = "object_file",
167*c8dee2aaSAndroid Build Coastguard Worker                                ),
168*c8dee2aaSAndroid Build Coastguard Worker                            ),
169*c8dee2aaSAndroid Build Coastguard Worker                            flag_group(
170*c8dee2aaSAndroid Build Coastguard Worker                                flags = ["%{libraries_to_link.object_files}"],
171*c8dee2aaSAndroid Build Coastguard Worker                                iterate_over = "libraries_to_link.object_files",
172*c8dee2aaSAndroid Build Coastguard Worker                                expand_if_equal = variable_with_value(
173*c8dee2aaSAndroid Build Coastguard Worker                                    name = "libraries_to_link.type",
174*c8dee2aaSAndroid Build Coastguard Worker                                    value = "object_file_group",
175*c8dee2aaSAndroid Build Coastguard Worker                                ),
176*c8dee2aaSAndroid Build Coastguard Worker                            ),
177*c8dee2aaSAndroid Build Coastguard Worker                        ],
178*c8dee2aaSAndroid Build Coastguard Worker                        expand_if_available = "libraries_to_link",
179*c8dee2aaSAndroid Build Coastguard Worker                    ),
180*c8dee2aaSAndroid Build Coastguard Worker                ],
181*c8dee2aaSAndroid Build Coastguard Worker            ),
182*c8dee2aaSAndroid Build Coastguard Worker            flag_set(
183*c8dee2aaSAndroid Build Coastguard Worker                flag_groups = [
184*c8dee2aaSAndroid Build Coastguard Worker                    flag_group(
185*c8dee2aaSAndroid Build Coastguard Worker                        flags = ["@%{archive_param_file}"],
186*c8dee2aaSAndroid Build Coastguard Worker                        expand_if_available = "archive_param_file",
187*c8dee2aaSAndroid Build Coastguard Worker                    ),
188*c8dee2aaSAndroid Build Coastguard Worker                ],
189*c8dee2aaSAndroid Build Coastguard Worker            ),
190*c8dee2aaSAndroid Build Coastguard Worker        ],
191*c8dee2aaSAndroid Build Coastguard Worker        tools = [ar_tool],
192*c8dee2aaSAndroid Build Coastguard Worker    )
193*c8dee2aaSAndroid Build Coastguard Worker
194*c8dee2aaSAndroid Build Coastguard Worker    action_configs = [
195*c8dee2aaSAndroid Build Coastguard Worker        assemble_action,
196*c8dee2aaSAndroid Build Coastguard Worker        c_compile_action,
197*c8dee2aaSAndroid Build Coastguard Worker        cpp_compile_action,
198*c8dee2aaSAndroid Build Coastguard Worker        cpp_link_dynamic_library_action,
199*c8dee2aaSAndroid Build Coastguard Worker        cpp_link_executable_action,
200*c8dee2aaSAndroid Build Coastguard Worker        cpp_link_nodeps_dynamic_library_action,
201*c8dee2aaSAndroid Build Coastguard Worker        cpp_link_static_library_action,
202*c8dee2aaSAndroid Build Coastguard Worker        linkstamp_compile_action,
203*c8dee2aaSAndroid Build Coastguard Worker        preprocess_assemble_action,
204*c8dee2aaSAndroid Build Coastguard Worker    ]
205*c8dee2aaSAndroid Build Coastguard Worker    return action_configs
206*c8dee2aaSAndroid Build Coastguard Worker
207*c8dee2aaSAndroid Build Coastguard Workerdef _make_default_flags():
208*c8dee2aaSAndroid Build Coastguard Worker    """Here we define the flags for certain actions that are always applied.
209*c8dee2aaSAndroid Build Coastguard Worker
210*c8dee2aaSAndroid Build Coastguard Worker    For any flag that might be conditionally applied, it should be defined in //bazel/copts.bzl.
211*c8dee2aaSAndroid Build Coastguard Worker
212*c8dee2aaSAndroid Build Coastguard Worker    Flags that are set here will be unconditionally applied to everything we compile with
213*c8dee2aaSAndroid Build Coastguard Worker    this toolchain, even third_party deps.
214*c8dee2aaSAndroid Build Coastguard Worker    """
215*c8dee2aaSAndroid Build Coastguard Worker
216*c8dee2aaSAndroid Build Coastguard Worker    # Note: These values must be kept in sync with those defined in cmake_exporter.go.
217*c8dee2aaSAndroid Build Coastguard Worker    cxx_compile_includes = flag_set(
218*c8dee2aaSAndroid Build Coastguard Worker        actions = [
219*c8dee2aaSAndroid Build Coastguard Worker            ACTION_NAMES.c_compile,
220*c8dee2aaSAndroid Build Coastguard Worker            ACTION_NAMES.cpp_compile,
221*c8dee2aaSAndroid Build Coastguard Worker        ],
222*c8dee2aaSAndroid Build Coastguard Worker        flag_groups = [
223*c8dee2aaSAndroid Build Coastguard Worker            flag_group(
224*c8dee2aaSAndroid Build Coastguard Worker                flags = [
225*c8dee2aaSAndroid Build Coastguard Worker                    # THIS ORDER MATTERS GREATLY. If these are in the wrong order, the
226*c8dee2aaSAndroid Build Coastguard Worker                    # #include_next directives will fail to find the files, causing a compilation
227*c8dee2aaSAndroid Build Coastguard Worker                    # error (or, without -no-canonical-prefixes, a mysterious case where files
228*c8dee2aaSAndroid Build Coastguard Worker                    # are included with an absolute path and fail the build).
229*c8dee2aaSAndroid Build Coastguard Worker                    "-isystem",
230*c8dee2aaSAndroid Build Coastguard Worker                    CLANG_TOOLCHAIN + "/include/clang",
231*c8dee2aaSAndroid Build Coastguard Worker                    "-isystem",
232*c8dee2aaSAndroid Build Coastguard Worker                    CLANG_TOOLCHAIN + "/include/clang-c",
233*c8dee2aaSAndroid Build Coastguard Worker                    "-isystem",
234*c8dee2aaSAndroid Build Coastguard Worker                    CLANG_TOOLCHAIN + "/include/clang-tidy",
235*c8dee2aaSAndroid Build Coastguard Worker                    "-isystem",
236*c8dee2aaSAndroid Build Coastguard Worker                    CLANG_TOOLCHAIN + "/include/lld",
237*c8dee2aaSAndroid Build Coastguard Worker                    "-isystem",
238*c8dee2aaSAndroid Build Coastguard Worker                    CLANG_TOOLCHAIN + "/include/lldb",
239*c8dee2aaSAndroid Build Coastguard Worker                    "-isystem",
240*c8dee2aaSAndroid Build Coastguard Worker                    CLANG_TOOLCHAIN + "/include/llvm",
241*c8dee2aaSAndroid Build Coastguard Worker                    "-isystem",
242*c8dee2aaSAndroid Build Coastguard Worker                    CLANG_TOOLCHAIN + "/include/llvm-c",
243*c8dee2aaSAndroid Build Coastguard Worker                    "-isystem",
244*c8dee2aaSAndroid Build Coastguard Worker                    CLANG_TOOLCHAIN + "/lib/clang/18/include",
245*c8dee2aaSAndroid Build Coastguard Worker                    "-isystem",
246*c8dee2aaSAndroid Build Coastguard Worker                    FULL_WIN_SDK_INCLUDE + "/shared",
247*c8dee2aaSAndroid Build Coastguard Worker                    "-isystem",
248*c8dee2aaSAndroid Build Coastguard Worker                    FULL_WIN_SDK_INCLUDE + "/ucrt",
249*c8dee2aaSAndroid Build Coastguard Worker                    "-isystem",
250*c8dee2aaSAndroid Build Coastguard Worker                    FULL_WIN_SDK_INCLUDE + "/um",
251*c8dee2aaSAndroid Build Coastguard Worker                    "-isystem",
252*c8dee2aaSAndroid Build Coastguard Worker                    FULL_WIN_SDK_INCLUDE + "/winrt",
253*c8dee2aaSAndroid Build Coastguard Worker                    "-isystem",
254*c8dee2aaSAndroid Build Coastguard Worker                    FULL_WIN_SDK_INCLUDE + "/cppwinrt",
255*c8dee2aaSAndroid Build Coastguard Worker                    "-isystem",
256*c8dee2aaSAndroid Build Coastguard Worker                    FULL_MSVC_INCLUDE,
257*c8dee2aaSAndroid Build Coastguard Worker                    # We do not want clang to search in absolute paths for files. This makes
258*c8dee2aaSAndroid Build Coastguard Worker                    # Bazel think we are using an outside resource and fail the compile.
259*c8dee2aaSAndroid Build Coastguard Worker                    "-no-canonical-prefixes",
260*c8dee2aaSAndroid Build Coastguard Worker                ],
261*c8dee2aaSAndroid Build Coastguard Worker            ),
262*c8dee2aaSAndroid Build Coastguard Worker        ],
263*c8dee2aaSAndroid Build Coastguard Worker    )
264*c8dee2aaSAndroid Build Coastguard Worker
265*c8dee2aaSAndroid Build Coastguard Worker    cpp_compile_flags = flag_set(
266*c8dee2aaSAndroid Build Coastguard Worker        actions = [
267*c8dee2aaSAndroid Build Coastguard Worker            ACTION_NAMES.cpp_compile,
268*c8dee2aaSAndroid Build Coastguard Worker        ],
269*c8dee2aaSAndroid Build Coastguard Worker        flag_groups = [
270*c8dee2aaSAndroid Build Coastguard Worker            flag_group(
271*c8dee2aaSAndroid Build Coastguard Worker                flags = [
272*c8dee2aaSAndroid Build Coastguard Worker                    "-std=c++17",
273*c8dee2aaSAndroid Build Coastguard Worker                ],
274*c8dee2aaSAndroid Build Coastguard Worker            ),
275*c8dee2aaSAndroid Build Coastguard Worker        ],
276*c8dee2aaSAndroid Build Coastguard Worker    )
277*c8dee2aaSAndroid Build Coastguard Worker
278*c8dee2aaSAndroid Build Coastguard Worker    link_exe_flags = flag_set(
279*c8dee2aaSAndroid Build Coastguard Worker        actions = [
280*c8dee2aaSAndroid Build Coastguard Worker            ACTION_NAMES.cpp_link_executable,
281*c8dee2aaSAndroid Build Coastguard Worker            ACTION_NAMES.cpp_link_dynamic_library,
282*c8dee2aaSAndroid Build Coastguard Worker            ACTION_NAMES.cpp_link_nodeps_dynamic_library,
283*c8dee2aaSAndroid Build Coastguard Worker        ],
284*c8dee2aaSAndroid Build Coastguard Worker        flag_groups = [
285*c8dee2aaSAndroid Build Coastguard Worker            flag_group(
286*c8dee2aaSAndroid Build Coastguard Worker                flags = [
287*c8dee2aaSAndroid Build Coastguard Worker                    "-fuse-ld=lld",
288*c8dee2aaSAndroid Build Coastguard Worker                    # We chose to use the llvm runtime, not the gcc one because it is already
289*c8dee2aaSAndroid Build Coastguard Worker                    # included in the clang binary
290*c8dee2aaSAndroid Build Coastguard Worker                    "--rtlib=compiler-rt",
291*c8dee2aaSAndroid Build Coastguard Worker                    "-std=c++17",
292*c8dee2aaSAndroid Build Coastguard Worker                    "-L" + FULL_MSVC_LIB + "/x64",
293*c8dee2aaSAndroid Build Coastguard Worker                    "-L" + FULL_WIN_SDK_LIB + "/ucrt/x64",
294*c8dee2aaSAndroid Build Coastguard Worker                    "-L" + FULL_WIN_SDK_LIB + "/um/x64",
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    return [feature(
300*c8dee2aaSAndroid Build Coastguard Worker        "default_flags",
301*c8dee2aaSAndroid Build Coastguard Worker        enabled = True,
302*c8dee2aaSAndroid Build Coastguard Worker        flag_sets = [
303*c8dee2aaSAndroid Build Coastguard Worker            cxx_compile_includes,
304*c8dee2aaSAndroid Build Coastguard Worker            cpp_compile_flags,
305*c8dee2aaSAndroid Build Coastguard Worker            link_exe_flags,
306*c8dee2aaSAndroid Build Coastguard Worker        ],
307*c8dee2aaSAndroid Build Coastguard Worker    )]
308*c8dee2aaSAndroid Build Coastguard Worker
309*c8dee2aaSAndroid Build Coastguard Workerdef _make_diagnostic_flags():
310*c8dee2aaSAndroid Build Coastguard Worker    """Here we define the flags that can be turned on via features to yield debug info."""
311*c8dee2aaSAndroid Build Coastguard Worker    cxx_diagnostic = flag_set(
312*c8dee2aaSAndroid Build Coastguard Worker        actions = [
313*c8dee2aaSAndroid Build Coastguard Worker            ACTION_NAMES.c_compile,
314*c8dee2aaSAndroid Build Coastguard Worker            ACTION_NAMES.cpp_compile,
315*c8dee2aaSAndroid Build Coastguard Worker        ],
316*c8dee2aaSAndroid Build Coastguard Worker        flag_groups = [
317*c8dee2aaSAndroid Build Coastguard Worker            flag_group(
318*c8dee2aaSAndroid Build Coastguard Worker                flags = [
319*c8dee2aaSAndroid Build Coastguard Worker                    "--trace-includes",
320*c8dee2aaSAndroid Build Coastguard Worker                    "-v",
321*c8dee2aaSAndroid Build Coastguard Worker                ],
322*c8dee2aaSAndroid Build Coastguard Worker            ),
323*c8dee2aaSAndroid Build Coastguard Worker        ],
324*c8dee2aaSAndroid Build Coastguard Worker    )
325*c8dee2aaSAndroid Build Coastguard Worker
326*c8dee2aaSAndroid Build Coastguard Worker    link_diagnostic = flag_set(
327*c8dee2aaSAndroid Build Coastguard Worker        actions = [ACTION_NAMES.cpp_link_executable],
328*c8dee2aaSAndroid Build Coastguard Worker        flag_groups = [
329*c8dee2aaSAndroid Build Coastguard Worker            flag_group(
330*c8dee2aaSAndroid Build Coastguard Worker                flags = [
331*c8dee2aaSAndroid Build Coastguard Worker                    "-Wl,-verbose",
332*c8dee2aaSAndroid Build Coastguard Worker                    "-v",
333*c8dee2aaSAndroid Build Coastguard Worker                ],
334*c8dee2aaSAndroid Build Coastguard Worker            ),
335*c8dee2aaSAndroid Build Coastguard Worker        ],
336*c8dee2aaSAndroid Build Coastguard Worker    )
337*c8dee2aaSAndroid Build Coastguard Worker
338*c8dee2aaSAndroid Build Coastguard Worker    link_search_dirs = flag_set(
339*c8dee2aaSAndroid Build Coastguard Worker        actions = [ACTION_NAMES.cpp_link_executable],
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                    "--print-search-dirs",
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    return [
349*c8dee2aaSAndroid Build Coastguard Worker        # Running a Bazel command with --features diagnostic will cause the compilation and
350*c8dee2aaSAndroid Build Coastguard Worker        # link steps to be more verbose.
351*c8dee2aaSAndroid Build Coastguard Worker        feature(
352*c8dee2aaSAndroid Build Coastguard Worker            "diagnostic",
353*c8dee2aaSAndroid Build Coastguard Worker            enabled = False,
354*c8dee2aaSAndroid Build Coastguard Worker            flag_sets = [
355*c8dee2aaSAndroid Build Coastguard Worker                cxx_diagnostic,
356*c8dee2aaSAndroid Build Coastguard Worker                link_diagnostic,
357*c8dee2aaSAndroid Build Coastguard Worker            ],
358*c8dee2aaSAndroid Build Coastguard Worker        ),
359*c8dee2aaSAndroid Build Coastguard Worker        feature(
360*c8dee2aaSAndroid Build Coastguard Worker            "diagnostic_link",
361*c8dee2aaSAndroid Build Coastguard Worker            enabled = False,
362*c8dee2aaSAndroid Build Coastguard Worker            flag_sets = [
363*c8dee2aaSAndroid Build Coastguard Worker                link_diagnostic,
364*c8dee2aaSAndroid Build Coastguard Worker            ],
365*c8dee2aaSAndroid Build Coastguard Worker        ),
366*c8dee2aaSAndroid Build Coastguard Worker        # Running a Bazel command with --features print_search_dirs will cause the link to fail
367*c8dee2aaSAndroid Build Coastguard Worker        # but directories searched for libraries, etc will be displayed.
368*c8dee2aaSAndroid Build Coastguard Worker        feature(
369*c8dee2aaSAndroid Build Coastguard Worker            "print_search_dirs",
370*c8dee2aaSAndroid Build Coastguard Worker            enabled = False,
371*c8dee2aaSAndroid Build Coastguard Worker            flag_sets = [
372*c8dee2aaSAndroid Build Coastguard Worker                link_search_dirs,
373*c8dee2aaSAndroid Build Coastguard Worker            ],
374*c8dee2aaSAndroid Build Coastguard Worker        ),
375*c8dee2aaSAndroid Build Coastguard Worker    ]
376