xref: /aosp_15_r20/external/cronet/build/config/win/BUILD.gn (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker# Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Workerimport("//build/config/c++/c++.gni")
6*6777b538SAndroid Build Coastguard Workerimport("//build/config/chrome_build.gni")
7*6777b538SAndroid Build Coastguard Workerimport("//build/config/clang/clang.gni")
8*6777b538SAndroid Build Coastguard Workerimport("//build/config/compiler/compiler.gni")
9*6777b538SAndroid Build Coastguard Workerimport("//build/config/rust.gni")
10*6777b538SAndroid Build Coastguard Workerimport("//build/config/sanitizers/sanitizers.gni")
11*6777b538SAndroid Build Coastguard Workerimport("//build/config/win/control_flow_guard.gni")
12*6777b538SAndroid Build Coastguard Workerimport("//build/config/win/visual_studio_version.gni")
13*6777b538SAndroid Build Coastguard Workerimport("//build/timestamp.gni")
14*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/rbe.gni")
15*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/toolchain.gni")
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Workerassert(is_win)
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Workerdeclare_args() {
20*6777b538SAndroid Build Coastguard Worker  # Turn this on to have the linker output extra timing information.
21*6777b538SAndroid Build Coastguard Worker  win_linker_timing = false
22*6777b538SAndroid Build Coastguard Worker
23*6777b538SAndroid Build Coastguard Worker  # possible values for target_winuwp_version:
24*6777b538SAndroid Build Coastguard Worker  #   "10" - Windows UWP 10
25*6777b538SAndroid Build Coastguard Worker  #   "8.1" - Windows RT 8.1
26*6777b538SAndroid Build Coastguard Worker  #   "8.0" - Windows RT 8.0
27*6777b538SAndroid Build Coastguard Worker  target_winuwp_version = "10"
28*6777b538SAndroid Build Coastguard Worker
29*6777b538SAndroid Build Coastguard Worker  # possible values:
30*6777b538SAndroid Build Coastguard Worker  #   "app" - Windows Store Applications
31*6777b538SAndroid Build Coastguard Worker  #   "phone" - Windows Phone Applications
32*6777b538SAndroid Build Coastguard Worker  #   "system" - Windows Drivers and Tools
33*6777b538SAndroid Build Coastguard Worker  #   "server" - Windows Server Applications
34*6777b538SAndroid Build Coastguard Worker  #   "desktop" - Windows Desktop Applications
35*6777b538SAndroid Build Coastguard Worker  target_winuwp_family = "app"
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Worker  # Set this to use clang-style diagnostics format instead of MSVC-style, which
38*6777b538SAndroid Build Coastguard Worker  # is useful in e.g. Emacs compilation mode.
39*6777b538SAndroid Build Coastguard Worker  # E.g.:
40*6777b538SAndroid Build Coastguard Worker  #  Without this, clang emits a diagnostic message like this:
41*6777b538SAndroid Build Coastguard Worker  #    foo/bar.cc(12,34): error: something went wrong
42*6777b538SAndroid Build Coastguard Worker  #  and with this switch, clang emits it like this:
43*6777b538SAndroid Build Coastguard Worker  #    foo/bar.cc:12:34: error: something went wrong
44*6777b538SAndroid Build Coastguard Worker  use_clang_diagnostics_format = false
45*6777b538SAndroid Build Coastguard Worker}
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Worker# This is included by reference in the //build/config/compiler config that
48*6777b538SAndroid Build Coastguard Worker# is applied to all targets. It is here to separate out the logic that is
49*6777b538SAndroid Build Coastguard Worker# Windows-only.
50*6777b538SAndroid Build Coastguard Workerconfig("compiler") {
51*6777b538SAndroid Build Coastguard Worker  if (current_cpu == "x86") {
52*6777b538SAndroid Build Coastguard Worker    asmflags = [
53*6777b538SAndroid Build Coastguard Worker      # When /safeseh is specified, the linker will only produce an image if it
54*6777b538SAndroid Build Coastguard Worker      # can also produce a table of the image's safe exception handlers. This
55*6777b538SAndroid Build Coastguard Worker      # table specifies for the operating system which exception handlers are
56*6777b538SAndroid Build Coastguard Worker      # valid for the image. Note that /SAFESEH isn't accepted on the command
57*6777b538SAndroid Build Coastguard Worker      # line, only /safeseh. This is only accepted by ml.exe, not ml64.exe.
58*6777b538SAndroid Build Coastguard Worker      "/safeseh",
59*6777b538SAndroid Build Coastguard Worker    ]
60*6777b538SAndroid Build Coastguard Worker  }
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Worker  cflags = [
63*6777b538SAndroid Build Coastguard Worker    "/Gy",  # Enable function-level linking.
64*6777b538SAndroid Build Coastguard Worker    "/FS",  # Preserve previous PDB behavior.
65*6777b538SAndroid Build Coastguard Worker    "/bigobj",  # Some of our files are bigger than the regular limits.
66*6777b538SAndroid Build Coastguard Worker    "/utf-8",  # Assume UTF-8 by default to avoid code page dependencies.
67*6777b538SAndroid Build Coastguard Worker  ]
68*6777b538SAndroid Build Coastguard Worker
69*6777b538SAndroid Build Coastguard Worker  if (is_clang) {
70*6777b538SAndroid Build Coastguard Worker    cflags += [
71*6777b538SAndroid Build Coastguard Worker      "/Zc:twoPhase",
72*6777b538SAndroid Build Coastguard Worker
73*6777b538SAndroid Build Coastguard Worker      # Consistently use backslash as the path separator when expanding the
74*6777b538SAndroid Build Coastguard Worker      # __FILE__ macro when targeting Windows regardless of the build
75*6777b538SAndroid Build Coastguard Worker      # environment.
76*6777b538SAndroid Build Coastguard Worker      "-ffile-reproducible",
77*6777b538SAndroid Build Coastguard Worker    ]
78*6777b538SAndroid Build Coastguard Worker  }
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Worker  # Force C/C++ mode for the given GN detected file type. This is necessary
81*6777b538SAndroid Build Coastguard Worker  # for precompiled headers where the same source file is compiled in both
82*6777b538SAndroid Build Coastguard Worker  # modes.
83*6777b538SAndroid Build Coastguard Worker  cflags_c = [ "/TC" ]
84*6777b538SAndroid Build Coastguard Worker  cflags_cc = [ "/TP" ]
85*6777b538SAndroid Build Coastguard Worker
86*6777b538SAndroid Build Coastguard Worker  cflags += [
87*6777b538SAndroid Build Coastguard Worker    # Work around crbug.com/526851, bug in VS 2015 RTM compiler.
88*6777b538SAndroid Build Coastguard Worker    "/Zc:sizedDealloc-",
89*6777b538SAndroid Build Coastguard Worker  ]
90*6777b538SAndroid Build Coastguard Worker
91*6777b538SAndroid Build Coastguard Worker  if (is_clang) {
92*6777b538SAndroid Build Coastguard Worker    # Required to make the 19041 SDK compatible with clang-cl.
93*6777b538SAndroid Build Coastguard Worker    # See https://crbug.com/1089996 issue #2 for details.
94*6777b538SAndroid Build Coastguard Worker    cflags += [ "/D__WRL_ENABLE_FUNCTION_STATICS__" ]
95*6777b538SAndroid Build Coastguard Worker
96*6777b538SAndroid Build Coastguard Worker    # Tell clang which version of MSVC to emulate.
97*6777b538SAndroid Build Coastguard Worker    cflags += [ "-fmsc-version=1934" ]
98*6777b538SAndroid Build Coastguard Worker
99*6777b538SAndroid Build Coastguard Worker    if (is_component_build) {
100*6777b538SAndroid Build Coastguard Worker      cflags += [
101*6777b538SAndroid Build Coastguard Worker        # Do not export inline member functions. This makes component builds
102*6777b538SAndroid Build Coastguard Worker        # faster. This is similar to -fvisibility-inlines-hidden.
103*6777b538SAndroid Build Coastguard Worker        "/Zc:dllexportInlines-",
104*6777b538SAndroid Build Coastguard Worker      ]
105*6777b538SAndroid Build Coastguard Worker    }
106*6777b538SAndroid Build Coastguard Worker
107*6777b538SAndroid Build Coastguard Worker    if (current_cpu == "x86") {
108*6777b538SAndroid Build Coastguard Worker      if (host_cpu == "x86" || host_cpu == "x64") {
109*6777b538SAndroid Build Coastguard Worker        cflags += [ "-m32" ]
110*6777b538SAndroid Build Coastguard Worker      } else {
111*6777b538SAndroid Build Coastguard Worker        cflags += [ "--target=i386-windows" ]
112*6777b538SAndroid Build Coastguard Worker      }
113*6777b538SAndroid Build Coastguard Worker    } else if (current_cpu == "x64") {
114*6777b538SAndroid Build Coastguard Worker      if (host_cpu == "x86" || host_cpu == "x64") {
115*6777b538SAndroid Build Coastguard Worker        cflags += [ "-m64" ]
116*6777b538SAndroid Build Coastguard Worker      } else {
117*6777b538SAndroid Build Coastguard Worker        cflags += [ "--target=x86_64-windows" ]
118*6777b538SAndroid Build Coastguard Worker      }
119*6777b538SAndroid Build Coastguard Worker    } else if (current_cpu == "arm64") {
120*6777b538SAndroid Build Coastguard Worker      cflags += [ "--target=aarch64-pc-windows" ]
121*6777b538SAndroid Build Coastguard Worker    } else {
122*6777b538SAndroid Build Coastguard Worker      assert(false, "unknown current_cpu " + current_cpu)
123*6777b538SAndroid Build Coastguard Worker    }
124*6777b538SAndroid Build Coastguard Worker
125*6777b538SAndroid Build Coastguard Worker    # Chrome currently requires SSE3. Clang supports targeting any Intel
126*6777b538SAndroid Build Coastguard Worker    # microarchitecture. MSVC only supports a subset of architectures, and the
127*6777b538SAndroid Build Coastguard Worker    # next step after SSE2 will be AVX.
128*6777b538SAndroid Build Coastguard Worker    if (current_cpu == "x86" || current_cpu == "x64") {
129*6777b538SAndroid Build Coastguard Worker      cflags += [ "-msse3" ]
130*6777b538SAndroid Build Coastguard Worker    }
131*6777b538SAndroid Build Coastguard Worker
132*6777b538SAndroid Build Coastguard Worker    # Enable ANSI escape codes if something emulating them is around (cmd.exe
133*6777b538SAndroid Build Coastguard Worker    # doesn't understand ANSI escape codes by default). Make sure to not enable
134*6777b538SAndroid Build Coastguard Worker    # this if remoteexec is in use, because this will lower cache hits.
135*6777b538SAndroid Build Coastguard Worker    if (!use_remoteexec &&
136*6777b538SAndroid Build Coastguard Worker        exec_script("//build/win/use_ansi_codes.py", [], "trim string") ==
137*6777b538SAndroid Build Coastguard Worker        "True") {
138*6777b538SAndroid Build Coastguard Worker      cflags += [ "-fansi-escape-codes" ]
139*6777b538SAndroid Build Coastguard Worker    }
140*6777b538SAndroid Build Coastguard Worker
141*6777b538SAndroid Build Coastguard Worker    if (use_clang_diagnostics_format) {
142*6777b538SAndroid Build Coastguard Worker      cflags += [ "/clang:-fdiagnostics-format=clang" ]
143*6777b538SAndroid Build Coastguard Worker    }
144*6777b538SAndroid Build Coastguard Worker  }
145*6777b538SAndroid Build Coastguard Worker
146*6777b538SAndroid Build Coastguard Worker  # Disabled with cc_wrapper because of https://github.com/mozilla/sccache/issues/264
147*6777b538SAndroid Build Coastguard Worker  if (use_lld && !use_thin_lto && cc_wrapper == "") {
148*6777b538SAndroid Build Coastguard Worker    # /Brepro lets the compiler not write the mtime field in the .obj output.
149*6777b538SAndroid Build Coastguard Worker    # link.exe /incremental relies on this field to work correctly, but lld
150*6777b538SAndroid Build Coastguard Worker    # never looks at this timestamp, so it's safe to pass this flag with
151*6777b538SAndroid Build Coastguard Worker    # lld and get more deterministic compiler output in return.
152*6777b538SAndroid Build Coastguard Worker    # In LTO builds, the compiler doesn't write .obj files containing mtimes,
153*6777b538SAndroid Build Coastguard Worker    # so /Brepro is ignored there.
154*6777b538SAndroid Build Coastguard Worker    cflags += [ "/Brepro" ]
155*6777b538SAndroid Build Coastguard Worker  }
156*6777b538SAndroid Build Coastguard Worker
157*6777b538SAndroid Build Coastguard Worker  ldflags = []
158*6777b538SAndroid Build Coastguard Worker
159*6777b538SAndroid Build Coastguard Worker  if (use_lld) {
160*6777b538SAndroid Build Coastguard Worker    # lld defaults to writing the current time in the pe/coff header.
161*6777b538SAndroid Build Coastguard Worker    # For build reproducibility, pass an explicit timestamp. See
162*6777b538SAndroid Build Coastguard Worker    # build/compute_build_timestamp.py for how the timestamp is chosen.
163*6777b538SAndroid Build Coastguard Worker    # (link.exe also writes the current time, but it doesn't have a flag to
164*6777b538SAndroid Build Coastguard Worker    # override that behavior.)
165*6777b538SAndroid Build Coastguard Worker    ldflags += [ "/TIMESTAMP:" + build_timestamp ]
166*6777b538SAndroid Build Coastguard Worker
167*6777b538SAndroid Build Coastguard Worker    # Don't look for libpaths in %LIB%, similar to /X in cflags above.
168*6777b538SAndroid Build Coastguard Worker    ldflags += [ "/lldignoreenv" ]
169*6777b538SAndroid Build Coastguard Worker  }
170*6777b538SAndroid Build Coastguard Worker
171*6777b538SAndroid Build Coastguard Worker  # Some binaries create PDBs larger than 4 GiB. Increasing the PDB page size
172*6777b538SAndroid Build Coastguard Worker  # to 8 KiB allows 8 GiB PDBs. The larger page size also allows larger block maps
173*6777b538SAndroid Build Coastguard Worker  # which is a PDB limit that was hit in https://crbug.com/1406510. The page size
174*6777b538SAndroid Build Coastguard Worker  # can easily be increased in the future to allow even larger PDBs or larger
175*6777b538SAndroid Build Coastguard Worker  # block maps.
176*6777b538SAndroid Build Coastguard Worker  # This flag requires lld-link.exe or link.exe from VS 2022 or later to create
177*6777b538SAndroid Build Coastguard Worker  # the PDBs, and tools from circa 22H2 or later to consume the PDBs.
178*6777b538SAndroid Build Coastguard Worker  # Debug component builds can generate PDBs that exceed 8 GiB, so use an
179*6777b538SAndroid Build Coastguard Worker  # even larger page size, allowing up to 16 GiB PDBs.
180*6777b538SAndroid Build Coastguard Worker  if (is_debug && !is_component_build) {
181*6777b538SAndroid Build Coastguard Worker    ldflags += [ "/pdbpagesize:16384" ]
182*6777b538SAndroid Build Coastguard Worker  } else {
183*6777b538SAndroid Build Coastguard Worker    ldflags += [ "/pdbpagesize:8192" ]
184*6777b538SAndroid Build Coastguard Worker  }
185*6777b538SAndroid Build Coastguard Worker
186*6777b538SAndroid Build Coastguard Worker  if (!is_debug && !is_component_build) {
187*6777b538SAndroid Build Coastguard Worker    # Enable standard linker optimizations like GC (/OPT:REF) and ICF in static
188*6777b538SAndroid Build Coastguard Worker    # release builds.
189*6777b538SAndroid Build Coastguard Worker    # Release builds always want these optimizations, so enable them explicitly.
190*6777b538SAndroid Build Coastguard Worker    ldflags += [
191*6777b538SAndroid Build Coastguard Worker      "/OPT:REF",
192*6777b538SAndroid Build Coastguard Worker      "/OPT:ICF",
193*6777b538SAndroid Build Coastguard Worker      "/INCREMENTAL:NO",
194*6777b538SAndroid Build Coastguard Worker      "/FIXED:NO",
195*6777b538SAndroid Build Coastguard Worker    ]
196*6777b538SAndroid Build Coastguard Worker
197*6777b538SAndroid Build Coastguard Worker    if (use_lld) {
198*6777b538SAndroid Build Coastguard Worker      # String tail merging leads to smaller binaries, but they don't compress
199*6777b538SAndroid Build Coastguard Worker      # as well, leading to increased mini_installer size (crbug.com/838449).
200*6777b538SAndroid Build Coastguard Worker      ldflags += [ "/OPT:NOLLDTAILMERGE" ]
201*6777b538SAndroid Build Coastguard Worker    }
202*6777b538SAndroid Build Coastguard Worker
203*6777b538SAndroid Build Coastguard Worker    # TODO(siggi): Is this of any use anymore?
204*6777b538SAndroid Build Coastguard Worker    # /PROFILE ensures that the PDB file contains FIXUP information (growing the
205*6777b538SAndroid Build Coastguard Worker    # PDB file by about 5%) but does not otherwise alter the output binary. It
206*6777b538SAndroid Build Coastguard Worker    # is enabled opportunistically for builds where it is not prohibited (not
207*6777b538SAndroid Build Coastguard Worker    # supported when incrementally linking, or using /debug:fastlink).
208*6777b538SAndroid Build Coastguard Worker    ldflags += [ "/PROFILE" ]
209*6777b538SAndroid Build Coastguard Worker  }
210*6777b538SAndroid Build Coastguard Worker
211*6777b538SAndroid Build Coastguard Worker  # arflags apply only to static_libraries. The normal linker configs are only
212*6777b538SAndroid Build Coastguard Worker  # set for executable and shared library targets so arflags must be set
213*6777b538SAndroid Build Coastguard Worker  # elsewhere. Since this is relatively contained, we just apply them in this
214*6777b538SAndroid Build Coastguard Worker  # more general config and they will only have an effect on static libraries.
215*6777b538SAndroid Build Coastguard Worker  arflags = [
216*6777b538SAndroid Build Coastguard Worker    # "No public symbols found; archive member will be inaccessible." This
217*6777b538SAndroid Build Coastguard Worker    # means that one or more object files in the library can never be
218*6777b538SAndroid Build Coastguard Worker    # pulled in to targets that link to this library. It's just a warning that
219*6777b538SAndroid Build Coastguard Worker    # the source file is a no-op.
220*6777b538SAndroid Build Coastguard Worker    "/ignore:4221",
221*6777b538SAndroid Build Coastguard Worker  ]
222*6777b538SAndroid Build Coastguard Worker}
223*6777b538SAndroid Build Coastguard Worker
224*6777b538SAndroid Build Coastguard Worker# This is included by reference in the //build/config/compiler:runtime_library
225*6777b538SAndroid Build Coastguard Worker# config that is applied to all targets. It is here to separate out the logic
226*6777b538SAndroid Build Coastguard Worker# that is Windows-only. Please see that target for advice on what should go in
227*6777b538SAndroid Build Coastguard Worker# :runtime_library vs. :compiler.
228*6777b538SAndroid Build Coastguard Workerconfig("runtime_library") {
229*6777b538SAndroid Build Coastguard Worker  cflags = []
230*6777b538SAndroid Build Coastguard Worker  cflags_cc = []
231*6777b538SAndroid Build Coastguard Worker
232*6777b538SAndroid Build Coastguard Worker  # Defines that set up the CRT.
233*6777b538SAndroid Build Coastguard Worker  defines = [
234*6777b538SAndroid Build Coastguard Worker    "__STD_C",
235*6777b538SAndroid Build Coastguard Worker    "_CRT_RAND_S",
236*6777b538SAndroid Build Coastguard Worker    "_CRT_SECURE_NO_DEPRECATE",
237*6777b538SAndroid Build Coastguard Worker    "_SCL_SECURE_NO_DEPRECATE",
238*6777b538SAndroid Build Coastguard Worker  ]
239*6777b538SAndroid Build Coastguard Worker
240*6777b538SAndroid Build Coastguard Worker  # Defines that set up the Windows SDK.
241*6777b538SAndroid Build Coastguard Worker  defines += [
242*6777b538SAndroid Build Coastguard Worker    "_ATL_NO_OPENGL",
243*6777b538SAndroid Build Coastguard Worker    "_WINDOWS",
244*6777b538SAndroid Build Coastguard Worker    "CERT_CHAIN_PARA_HAS_EXTRA_FIELDS",
245*6777b538SAndroid Build Coastguard Worker    "PSAPI_VERSION=2",
246*6777b538SAndroid Build Coastguard Worker    "WIN32",
247*6777b538SAndroid Build Coastguard Worker    "_SECURE_ATL",
248*6777b538SAndroid Build Coastguard Worker  ]
249*6777b538SAndroid Build Coastguard Worker
250*6777b538SAndroid Build Coastguard Worker  if (current_os == "winuwp") {
251*6777b538SAndroid Build Coastguard Worker    # When targeting Windows Runtime, certain compiler/linker flags are
252*6777b538SAndroid Build Coastguard Worker    # necessary.
253*6777b538SAndroid Build Coastguard Worker    defines += [
254*6777b538SAndroid Build Coastguard Worker      "WINUWP",
255*6777b538SAndroid Build Coastguard Worker      "__WRL_NO_DEFAULT_LIB__",
256*6777b538SAndroid Build Coastguard Worker    ]
257*6777b538SAndroid Build Coastguard Worker    if (target_winuwp_family == "app") {
258*6777b538SAndroid Build Coastguard Worker      defines += [ "WINAPI_FAMILY=WINAPI_FAMILY_PC_APP" ]
259*6777b538SAndroid Build Coastguard Worker    } else if (target_winuwp_family == "phone") {
260*6777b538SAndroid Build Coastguard Worker      defines += [ "WINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP" ]
261*6777b538SAndroid Build Coastguard Worker    } else if (target_winuwp_family == "system") {
262*6777b538SAndroid Build Coastguard Worker      defines += [ "WINAPI_FAMILY=WINAPI_FAMILY_SYSTEM" ]
263*6777b538SAndroid Build Coastguard Worker    } else if (target_winuwp_family == "server") {
264*6777b538SAndroid Build Coastguard Worker      defines += [ "WINAPI_FAMILY=WINAPI_FAMILY_SERVER" ]
265*6777b538SAndroid Build Coastguard Worker    } else {
266*6777b538SAndroid Build Coastguard Worker      defines += [ "WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP" ]
267*6777b538SAndroid Build Coastguard Worker    }
268*6777b538SAndroid Build Coastguard Worker    cflags_cc += [ "/EHsc" ]
269*6777b538SAndroid Build Coastguard Worker
270*6777b538SAndroid Build Coastguard Worker    # This warning is given because the linker cannot tell the difference
271*6777b538SAndroid Build Coastguard Worker    # between consuming WinRT APIs versus authoring WinRT within static
272*6777b538SAndroid Build Coastguard Worker    # libraries as such this warning is always given by the linker. Since
273*6777b538SAndroid Build Coastguard Worker    # consuming WinRT APIs within a library is legitimate but authoring
274*6777b538SAndroid Build Coastguard Worker    # WinRT APis is not allowed, this warning is disabled to ignore the
275*6777b538SAndroid Build Coastguard Worker    # legitimate consumption of WinRT APIs within static library builds.
276*6777b538SAndroid Build Coastguard Worker    arflags = [ "/IGNORE:4264" ]
277*6777b538SAndroid Build Coastguard Worker
278*6777b538SAndroid Build Coastguard Worker    if (target_winuwp_version == "10") {
279*6777b538SAndroid Build Coastguard Worker      defines += [ "WIN10=_WIN32_WINNT_WIN10" ]
280*6777b538SAndroid Build Coastguard Worker    } else if (target_winuwp_version == "8.1") {
281*6777b538SAndroid Build Coastguard Worker      defines += [ "WIN8_1=_WIN32_WINNT_WINBLUE" ]
282*6777b538SAndroid Build Coastguard Worker    } else if (target_winuwp_version == "8.0") {
283*6777b538SAndroid Build Coastguard Worker      defines += [ "WIN8=_WIN32_WINNT_WIN8" ]
284*6777b538SAndroid Build Coastguard Worker    }
285*6777b538SAndroid Build Coastguard Worker  } else {
286*6777b538SAndroid Build Coastguard Worker    # When not targeting Windows Runtime, make sure the WINAPI family is set
287*6777b538SAndroid Build Coastguard Worker    # to desktop.
288*6777b538SAndroid Build Coastguard Worker    defines += [ "WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP" ]
289*6777b538SAndroid Build Coastguard Worker  }
290*6777b538SAndroid Build Coastguard Worker}
291*6777b538SAndroid Build Coastguard Worker
292*6777b538SAndroid Build Coastguard Worker# Chromium only supports Windowes 10+.
293*6777b538SAndroid Build Coastguard Worker# Some third-party libraries assume that these defines set what version of
294*6777b538SAndroid Build Coastguard Worker# Windows is available at runtime. Targets using these libraries need to
295*6777b538SAndroid Build Coastguard Worker# manually override this config for their compiles.
296*6777b538SAndroid Build Coastguard Workerconfig("winver") {
297*6777b538SAndroid Build Coastguard Worker  defines = [
298*6777b538SAndroid Build Coastguard Worker    "NTDDI_VERSION=NTDDI_WIN10_NI",
299*6777b538SAndroid Build Coastguard Worker
300*6777b538SAndroid Build Coastguard Worker    # We can't say `=_WIN32_WINNT_WIN10` here because some files do
301*6777b538SAndroid Build Coastguard Worker    # `#if WINVER < 0x0600` without including windows.h before,
302*6777b538SAndroid Build Coastguard Worker    # and then _WIN32_WINNT_WIN10 isn't yet known to be 0x0A00.
303*6777b538SAndroid Build Coastguard Worker    "_WIN32_WINNT=0x0A00",
304*6777b538SAndroid Build Coastguard Worker    "WINVER=0x0A00",
305*6777b538SAndroid Build Coastguard Worker  ]
306*6777b538SAndroid Build Coastguard Worker}
307*6777b538SAndroid Build Coastguard Worker
308*6777b538SAndroid Build Coastguard Worker# Linker flags for Windows SDK setup, this is applied only to EXEs and DLLs.
309*6777b538SAndroid Build Coastguard Workerconfig("sdk_link") {
310*6777b538SAndroid Build Coastguard Worker  if (current_cpu == "x86") {
311*6777b538SAndroid Build Coastguard Worker    ldflags = [
312*6777b538SAndroid Build Coastguard Worker      "/SAFESEH",  # Not compatible with x64 so use only for x86.
313*6777b538SAndroid Build Coastguard Worker      "/largeaddressaware",
314*6777b538SAndroid Build Coastguard Worker    ]
315*6777b538SAndroid Build Coastguard Worker  }
316*6777b538SAndroid Build Coastguard Worker}
317*6777b538SAndroid Build Coastguard Worker
318*6777b538SAndroid Build Coastguard Worker# This default linker setup is provided separately from the SDK setup so
319*6777b538SAndroid Build Coastguard Worker# targets who want different library configurations can remove this and specify
320*6777b538SAndroid Build Coastguard Worker# their own.
321*6777b538SAndroid Build Coastguard Workerconfig("common_linker_setup") {
322*6777b538SAndroid Build Coastguard Worker  ldflags = [
323*6777b538SAndroid Build Coastguard Worker    "/FIXED:NO",
324*6777b538SAndroid Build Coastguard Worker    "/ignore:4199",
325*6777b538SAndroid Build Coastguard Worker    "/ignore:4221",
326*6777b538SAndroid Build Coastguard Worker    "/NXCOMPAT",
327*6777b538SAndroid Build Coastguard Worker    "/DYNAMICBASE",
328*6777b538SAndroid Build Coastguard Worker  ]
329*6777b538SAndroid Build Coastguard Worker
330*6777b538SAndroid Build Coastguard Worker  if (win_linker_timing) {
331*6777b538SAndroid Build Coastguard Worker    ldflags += [
332*6777b538SAndroid Build Coastguard Worker      "/time",
333*6777b538SAndroid Build Coastguard Worker      "/verbose:incr",
334*6777b538SAndroid Build Coastguard Worker    ]
335*6777b538SAndroid Build Coastguard Worker  }
336*6777b538SAndroid Build Coastguard Worker}
337*6777b538SAndroid Build Coastguard Worker
338*6777b538SAndroid Build Coastguard Workerconfig("default_cfg_compiler") {
339*6777b538SAndroid Build Coastguard Worker  # Emit table of address-taken functions for Control-Flow Guard (CFG).
340*6777b538SAndroid Build Coastguard Worker  # This is needed to allow functions to be called by code that is built
341*6777b538SAndroid Build Coastguard Worker  # with CFG enabled, such as system libraries.
342*6777b538SAndroid Build Coastguard Worker  # The CFG guards are only emitted if |win_enable_cfg_guards| is enabled.
343*6777b538SAndroid Build Coastguard Worker  if (win_enable_cfg_guards) {
344*6777b538SAndroid Build Coastguard Worker    if (is_clang) {
345*6777b538SAndroid Build Coastguard Worker      cflags = [ "/guard:cf" ]
346*6777b538SAndroid Build Coastguard Worker    }
347*6777b538SAndroid Build Coastguard Worker    rustflags = [ "-Ccontrol-flow-guard" ]
348*6777b538SAndroid Build Coastguard Worker  } else {
349*6777b538SAndroid Build Coastguard Worker    if (is_clang) {
350*6777b538SAndroid Build Coastguard Worker      cflags = [ "/guard:cf,nochecks" ]
351*6777b538SAndroid Build Coastguard Worker    }
352*6777b538SAndroid Build Coastguard Worker    rustflags = [ "-Ccontrol-flow-guard=nochecks" ]
353*6777b538SAndroid Build Coastguard Worker  }
354*6777b538SAndroid Build Coastguard Worker}
355*6777b538SAndroid Build Coastguard Worker
356*6777b538SAndroid Build Coastguard Worker# To disable CFG guards for a target, remove the "default_cfg_compiler"
357*6777b538SAndroid Build Coastguard Worker# config, and add "disable_guards_cfg_compiler" config.
358*6777b538SAndroid Build Coastguard Workerconfig("disable_guards_cfg_compiler") {
359*6777b538SAndroid Build Coastguard Worker  # Emit table of address-taken functions for Control-Flow Guard (CFG).
360*6777b538SAndroid Build Coastguard Worker  # This is needed to allow functions to be called by code that is built
361*6777b538SAndroid Build Coastguard Worker  # with CFG enabled, such as system libraries.
362*6777b538SAndroid Build Coastguard Worker  if (is_clang) {
363*6777b538SAndroid Build Coastguard Worker    cflags = [ "/guard:cf,nochecks" ]
364*6777b538SAndroid Build Coastguard Worker  }
365*6777b538SAndroid Build Coastguard Worker  rustflags = [ "-Ccontrol-flow-guard=nochecks" ]
366*6777b538SAndroid Build Coastguard Worker}
367*6777b538SAndroid Build Coastguard Worker
368*6777b538SAndroid Build Coastguard Workerconfig("cfi_linker") {
369*6777b538SAndroid Build Coastguard Worker  # Control Flow Guard (CFG)
370*6777b538SAndroid Build Coastguard Worker  # https://msdn.microsoft.com/en-us/library/windows/desktop/mt637065.aspx
371*6777b538SAndroid Build Coastguard Worker  # /DYNAMICBASE (ASLR) is turned off in debug builds, therefore CFG cannot be
372*6777b538SAndroid Build Coastguard Worker  # turned on either.
373*6777b538SAndroid Build Coastguard Worker  # ASan and CFG leads to slow process startup. Chromium's test runner uses
374*6777b538SAndroid Build Coastguard Worker  # lots of child processes, so this means things are really slow. Disable CFG
375*6777b538SAndroid Build Coastguard Worker  # for now. https://crbug.com/846966
376*6777b538SAndroid Build Coastguard Worker  if (!is_debug && !is_asan) {
377*6777b538SAndroid Build Coastguard Worker    # Turn on CFG bitmap generation and CFG load config.
378*6777b538SAndroid Build Coastguard Worker    ldflags = [ "/guard:cf" ]
379*6777b538SAndroid Build Coastguard Worker  }
380*6777b538SAndroid Build Coastguard Worker}
381*6777b538SAndroid Build Coastguard Worker
382*6777b538SAndroid Build Coastguard Worker# This is a superset of all the delayloads needed for chrome.exe, chrome.dll,
383*6777b538SAndroid Build Coastguard Worker# and chrome_elf.dll. The linker will automatically ignore anything which is not
384*6777b538SAndroid Build Coastguard Worker# linked to the binary at all (it is harmless to have an unmatched /delayload).
385*6777b538SAndroid Build Coastguard Worker#
386*6777b538SAndroid Build Coastguard Worker# We delayload most libraries as the dlls are simply not required at startup (or
387*6777b538SAndroid Build Coastguard Worker# at all, depending on the process type). In unsandboxed process they will load
388*6777b538SAndroid Build Coastguard Worker# when first needed.
389*6777b538SAndroid Build Coastguard Worker#
390*6777b538SAndroid Build Coastguard Worker# Some dlls open handles when they are loaded, and we may not want them to be
391*6777b538SAndroid Build Coastguard Worker# loaded in renderers or other sandboxed processes. Conversely, some dlls must
392*6777b538SAndroid Build Coastguard Worker# be loaded before sandbox lockdown.
393*6777b538SAndroid Build Coastguard Worker#
394*6777b538SAndroid Build Coastguard Worker# Some dlls themselves load others - in particular, to avoid unconditionally
395*6777b538SAndroid Build Coastguard Worker# loading user32.dll - we require that the following dlls are all delayloaded:
396*6777b538SAndroid Build Coastguard Worker# user32, gdi32, comctl32, comdlg32, cryptui, d3d9, dwmapi, imm32, msi, ole32,
397*6777b538SAndroid Build Coastguard Worker# oleacc, rstrtmgr, shell32, shlwapi, and uxtheme.
398*6777b538SAndroid Build Coastguard Worker#
399*6777b538SAndroid Build Coastguard Worker# Advapi32.dll is unconditionally loaded at process startup on Windows 10, but
400*6777b538SAndroid Build Coastguard Worker# on Windows 11 it is not, which makes it worthwhile to delay load it.
401*6777b538SAndroid Build Coastguard Worker# Additionally, advapi32.dll exports several functions that are forwarded to
402*6777b538SAndroid Build Coastguard Worker# other DLLs such as cryptbase.dll. If calls to those functions are present but
403*6777b538SAndroid Build Coastguard Worker# there are some processes where the functions are never called then delay
404*6777b538SAndroid Build Coastguard Worker# loading of advapi32.dll avoids pulling in those DLLs (such as cryptbase.dll)
405*6777b538SAndroid Build Coastguard Worker# unnecessarily, even if advapi32.dll itself is loaded.
406*6777b538SAndroid Build Coastguard Worker#
407*6777b538SAndroid Build Coastguard Worker# This config applies to chrome.exe, chrome.dll, chrome_elf.dll (& others).
408*6777b538SAndroid Build Coastguard Worker#
409*6777b538SAndroid Build Coastguard Worker# This config should also be used for any test binary whose goal is to run
410*6777b538SAndroid Build Coastguard Worker# tests with the full browser.
411*6777b538SAndroid Build Coastguard Workerconfig("delayloads") {
412*6777b538SAndroid Build Coastguard Worker  ldflags = [
413*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:api-ms-win-core-synch-l1-2-0.dll",
414*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:api-ms-win-core-winrt-error-l1-1-0.dll",
415*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:api-ms-win-core-winrt-l1-1-0.dll",
416*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:api-ms-win-core-winrt-string-l1-1-0.dll",
417*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:advapi32.dll",
418*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:comctl32.dll",
419*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:comdlg32.dll",
420*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:credui.dll",
421*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:cryptui.dll",
422*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:d3d11.dll",
423*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:d3d12.dll",
424*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:d3d9.dll",
425*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:dwmapi.dll",
426*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:dxgi.dll",
427*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:dxva2.dll",
428*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:esent.dll",
429*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:fontsub.dll",
430*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:gdi32.dll",
431*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:hid.dll",
432*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:imagehlp.dll",
433*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:imm32.dll",
434*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:msi.dll",
435*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:netapi32.dll",
436*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:ncrypt.dll",
437*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:ole32.dll",
438*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:oleacc.dll",
439*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:pdh.dll",
440*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:propsys.dll",
441*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:psapi.dll",
442*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:rpcrt4.dll",
443*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:rstrtmgr.dll",
444*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:setupapi.dll",
445*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:shell32.dll",
446*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:shlwapi.dll",
447*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:uiautomationcore.dll",
448*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:urlmon.dll",
449*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:user32.dll",
450*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:usp10.dll",
451*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:uxtheme.dll",
452*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:wer.dll",
453*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:wevtapi.dll",
454*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:wininet.dll",
455*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:winusb.dll",
456*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:wsock32.dll",
457*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:wtsapi32.dll",
458*6777b538SAndroid Build Coastguard Worker  ]
459*6777b538SAndroid Build Coastguard Worker}
460*6777b538SAndroid Build Coastguard Worker
461*6777b538SAndroid Build Coastguard Worker# This config (along with `:delayloads`) applies to chrome.exe & chrome_elf.dll.
462*6777b538SAndroid Build Coastguard Worker# Entries should not appear in both configs.
463*6777b538SAndroid Build Coastguard Workerconfig("delayloads_not_for_child_dll") {
464*6777b538SAndroid Build Coastguard Worker  ldflags = [
465*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:crypt32.dll",
466*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:dbghelp.dll",
467*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:dhcpcsvc.dll",
468*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:dwrite.dll",
469*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:iphlpapi.dll",
470*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:oleaut32.dll",
471*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:secur32.dll",
472*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:userenv.dll",
473*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:winhttp.dll",
474*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:winmm.dll",
475*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:winspool.drv",
476*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:wintrust.dll",
477*6777b538SAndroid Build Coastguard Worker    "/DELAYLOAD:ws2_32.dll",
478*6777b538SAndroid Build Coastguard Worker  ]
479*6777b538SAndroid Build Coastguard Worker}
480*6777b538SAndroid Build Coastguard Worker
481*6777b538SAndroid Build Coastguard Worker# CRT --------------------------------------------------------------------------
482*6777b538SAndroid Build Coastguard Worker
483*6777b538SAndroid Build Coastguard Worker# Configures how the runtime library (CRT) is going to be used.
484*6777b538SAndroid Build Coastguard Worker# See https://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx for a reference of
485*6777b538SAndroid Build Coastguard Worker# what each value does.
486*6777b538SAndroid Build Coastguard Workerconfig("default_crt") {
487*6777b538SAndroid Build Coastguard Worker  if (is_component_build) {
488*6777b538SAndroid Build Coastguard Worker    # Component mode: dynamic CRT. Since the library is shared, it requires
489*6777b538SAndroid Build Coastguard Worker    # exceptions or will give errors about things not matching, so keep
490*6777b538SAndroid Build Coastguard Worker    # exceptions on.
491*6777b538SAndroid Build Coastguard Worker    configs = [ ":dynamic_crt" ]
492*6777b538SAndroid Build Coastguard Worker  } else {
493*6777b538SAndroid Build Coastguard Worker    if (current_os == "winuwp") {
494*6777b538SAndroid Build Coastguard Worker      # https://blogs.msdn.microsoft.com/vcblog/2014/06/10/the-great-c-runtime-crt-refactoring/
495*6777b538SAndroid Build Coastguard Worker      # contains a details explanation of what is happening with the Windows
496*6777b538SAndroid Build Coastguard Worker      # CRT in Visual Studio releases related to Windows store applications.
497*6777b538SAndroid Build Coastguard Worker      configs = [ ":dynamic_crt" ]
498*6777b538SAndroid Build Coastguard Worker    } else {
499*6777b538SAndroid Build Coastguard Worker      # Desktop Windows: static CRT.
500*6777b538SAndroid Build Coastguard Worker      configs = [ ":static_crt" ]
501*6777b538SAndroid Build Coastguard Worker    }
502*6777b538SAndroid Build Coastguard Worker  }
503*6777b538SAndroid Build Coastguard Worker}
504*6777b538SAndroid Build Coastguard Worker
505*6777b538SAndroid Build Coastguard Worker# Use this to force use of the release CRT when building perf-critical build
506*6777b538SAndroid Build Coastguard Worker# tools that need to be fully optimized even in debug builds, for those times
507*6777b538SAndroid Build Coastguard Worker# when the debug CRT is part of the bottleneck. This also avoids *implicitly*
508*6777b538SAndroid Build Coastguard Worker# defining _DEBUG.
509*6777b538SAndroid Build Coastguard Workerconfig("release_crt") {
510*6777b538SAndroid Build Coastguard Worker  if (is_component_build) {
511*6777b538SAndroid Build Coastguard Worker    cflags = [ "/MD" ]
512*6777b538SAndroid Build Coastguard Worker
513*6777b538SAndroid Build Coastguard Worker    if (rust_prebuilt_stdlib) {
514*6777b538SAndroid Build Coastguard Worker      rustflags = [ "-Ctarget-feature=-crt-static" ]
515*6777b538SAndroid Build Coastguard Worker    } else {
516*6777b538SAndroid Build Coastguard Worker      # /MD specifies msvcrt.lib as the CRT library. Rust needs to agree, so
517*6777b538SAndroid Build Coastguard Worker      # we specify it explicitly. Once
518*6777b538SAndroid Build Coastguard Worker      # https://github.com/rust-lang/rust/issues/39016 is resolved we should
519*6777b538SAndroid Build Coastguard Worker      # instead tell rustc which CRT to use (static/dynamic + release/debug).
520*6777b538SAndroid Build Coastguard Worker      rustflags = [ "-Clink-arg=msvcrt.lib" ]
521*6777b538SAndroid Build Coastguard Worker    }
522*6777b538SAndroid Build Coastguard Worker
523*6777b538SAndroid Build Coastguard Worker    if (use_custom_libcxx) {
524*6777b538SAndroid Build Coastguard Worker      # On Windows, including libcpmt[d]/msvcprt[d] explicitly links the C++
525*6777b538SAndroid Build Coastguard Worker      # standard library, which libc++ needs for exception_ptr internals.
526*6777b538SAndroid Build Coastguard Worker      ldflags = [ "/DEFAULTLIB:msvcprt.lib" ]
527*6777b538SAndroid Build Coastguard Worker    }
528*6777b538SAndroid Build Coastguard Worker  } else {
529*6777b538SAndroid Build Coastguard Worker    cflags = [ "/MT" ]
530*6777b538SAndroid Build Coastguard Worker
531*6777b538SAndroid Build Coastguard Worker    if (rust_prebuilt_stdlib) {
532*6777b538SAndroid Build Coastguard Worker      rustflags = [ "-Ctarget-feature=+crt-static" ]
533*6777b538SAndroid Build Coastguard Worker    } else {
534*6777b538SAndroid Build Coastguard Worker      # /MT specifies libcmt.lib as the CRT library. Rust needs to agree, so
535*6777b538SAndroid Build Coastguard Worker      # we specify it explicitly. Once
536*6777b538SAndroid Build Coastguard Worker      # https://github.com/rust-lang/rust/issues/39016 is resolved we should
537*6777b538SAndroid Build Coastguard Worker      # instead tell rustc which CRT to use (static/dynamic + release/debug).
538*6777b538SAndroid Build Coastguard Worker      rustflags = [ "-Clink-arg=libcmt.lib" ]
539*6777b538SAndroid Build Coastguard Worker    }
540*6777b538SAndroid Build Coastguard Worker
541*6777b538SAndroid Build Coastguard Worker    if (use_custom_libcxx) {
542*6777b538SAndroid Build Coastguard Worker      ldflags = [ "/DEFAULTLIB:libcpmt.lib" ]
543*6777b538SAndroid Build Coastguard Worker    }
544*6777b538SAndroid Build Coastguard Worker  }
545*6777b538SAndroid Build Coastguard Worker}
546*6777b538SAndroid Build Coastguard Worker
547*6777b538SAndroid Build Coastguard Workerconfig("dynamic_crt") {
548*6777b538SAndroid Build Coastguard Worker  if (is_debug) {
549*6777b538SAndroid Build Coastguard Worker    # This pulls in the DLL debug CRT and defines _DEBUG
550*6777b538SAndroid Build Coastguard Worker    cflags = [ "/MDd" ]
551*6777b538SAndroid Build Coastguard Worker
552*6777b538SAndroid Build Coastguard Worker    # /MDd specifies msvcrtd.lib as the CRT library. Rust needs to agree, so
553*6777b538SAndroid Build Coastguard Worker    # we specify it explicitly.
554*6777b538SAndroid Build Coastguard Worker    # Once https://github.com/rust-lang/rust/issues/39016 is resolved we should
555*6777b538SAndroid Build Coastguard Worker    # instead tell rustc which CRT to use (static/dynamic + release/debug). We
556*6777b538SAndroid Build Coastguard Worker    # can't support prebuilt stdlib in this path until then.
557*6777b538SAndroid Build Coastguard Worker    rustflags = [ "-Clink-arg=msvcrtd.lib" ]
558*6777b538SAndroid Build Coastguard Worker
559*6777b538SAndroid Build Coastguard Worker    if (use_custom_libcxx) {
560*6777b538SAndroid Build Coastguard Worker      ldflags = [ "/DEFAULTLIB:msvcprtd.lib" ]
561*6777b538SAndroid Build Coastguard Worker    }
562*6777b538SAndroid Build Coastguard Worker  } else {
563*6777b538SAndroid Build Coastguard Worker    cflags = [ "/MD" ]
564*6777b538SAndroid Build Coastguard Worker
565*6777b538SAndroid Build Coastguard Worker    if (rust_prebuilt_stdlib) {
566*6777b538SAndroid Build Coastguard Worker      rustflags = [ "-Ctarget-feature=-crt-static" ]
567*6777b538SAndroid Build Coastguard Worker    } else {
568*6777b538SAndroid Build Coastguard Worker      # /MD specifies msvcrt.lib as the CRT library. Rust needs to agree, so
569*6777b538SAndroid Build Coastguard Worker      # we specify it explicitly.
570*6777b538SAndroid Build Coastguard Worker      # Once https://github.com/rust-lang/rust/issues/39016 is resolved we
571*6777b538SAndroid Build Coastguard Worker      # should instead tell rustc which CRT to use (static/dynamic +
572*6777b538SAndroid Build Coastguard Worker      # release/debug).
573*6777b538SAndroid Build Coastguard Worker      rustflags = [ "-Clink-arg=msvcrt.lib" ]
574*6777b538SAndroid Build Coastguard Worker    }
575*6777b538SAndroid Build Coastguard Worker
576*6777b538SAndroid Build Coastguard Worker    if (use_custom_libcxx) {
577*6777b538SAndroid Build Coastguard Worker      ldflags = [ "/DEFAULTLIB:msvcprt.lib" ]
578*6777b538SAndroid Build Coastguard Worker    }
579*6777b538SAndroid Build Coastguard Worker  }
580*6777b538SAndroid Build Coastguard Worker}
581*6777b538SAndroid Build Coastguard Worker
582*6777b538SAndroid Build Coastguard Workerconfig("static_crt") {
583*6777b538SAndroid Build Coastguard Worker  if (is_debug) {
584*6777b538SAndroid Build Coastguard Worker    # This pulls in the static debug CRT and defines _DEBUG
585*6777b538SAndroid Build Coastguard Worker    cflags = [ "/MTd" ]
586*6777b538SAndroid Build Coastguard Worker
587*6777b538SAndroid Build Coastguard Worker    # /MTd specifies libcmtd.lib as the CRT library. Rust needs to agree, so
588*6777b538SAndroid Build Coastguard Worker    # we specify it explicitly.
589*6777b538SAndroid Build Coastguard Worker    # Once https://github.com/rust-lang/rust/issues/39016 is resolved we should
590*6777b538SAndroid Build Coastguard Worker    # instead tell rustc which CRT to use (static/dynamic + release/debug). We
591*6777b538SAndroid Build Coastguard Worker    # can't support prebuilt stdlib in this path until then.
592*6777b538SAndroid Build Coastguard Worker    rustflags = [ "-Clink-arg=libcmtd.lib" ]
593*6777b538SAndroid Build Coastguard Worker
594*6777b538SAndroid Build Coastguard Worker    if (use_custom_libcxx) {
595*6777b538SAndroid Build Coastguard Worker      ldflags = [ "/DEFAULTLIB:libcpmtd.lib" ]
596*6777b538SAndroid Build Coastguard Worker    }
597*6777b538SAndroid Build Coastguard Worker  } else {
598*6777b538SAndroid Build Coastguard Worker    cflags = [ "/MT" ]
599*6777b538SAndroid Build Coastguard Worker
600*6777b538SAndroid Build Coastguard Worker    if (rust_prebuilt_stdlib) {
601*6777b538SAndroid Build Coastguard Worker      rustflags = [ "-Ctarget-feature=+crt-static" ]
602*6777b538SAndroid Build Coastguard Worker    } else {
603*6777b538SAndroid Build Coastguard Worker      # /MT specifies libcmt.lib as the CRT library. Rust needs to agree, so
604*6777b538SAndroid Build Coastguard Worker      # we specify it explicitly.
605*6777b538SAndroid Build Coastguard Worker      # Once https://github.com/rust-lang/rust/issues/39016 is resolved we
606*6777b538SAndroid Build Coastguard Worker      # should instead tell rustc which CRT to use (static/dynamic +
607*6777b538SAndroid Build Coastguard Worker      # release/debug).
608*6777b538SAndroid Build Coastguard Worker      rustflags = [ "-Clink-arg=libcmt.lib" ]
609*6777b538SAndroid Build Coastguard Worker    }
610*6777b538SAndroid Build Coastguard Worker
611*6777b538SAndroid Build Coastguard Worker    if (use_custom_libcxx) {
612*6777b538SAndroid Build Coastguard Worker      ldflags = [ "/DEFAULTLIB:libcpmt.lib" ]
613*6777b538SAndroid Build Coastguard Worker    }
614*6777b538SAndroid Build Coastguard Worker  }
615*6777b538SAndroid Build Coastguard Worker}
616*6777b538SAndroid Build Coastguard Worker
617*6777b538SAndroid Build Coastguard Worker# Subsystem --------------------------------------------------------------------
618*6777b538SAndroid Build Coastguard Worker
619*6777b538SAndroid Build Coastguard Worker# This is appended to the subsystem to specify a minimum version.
620*6777b538SAndroid Build Coastguard Worker# The number after the comma is the minimum required OS version.
621*6777b538SAndroid Build Coastguard Worker# Set to 10.0 since we only support >= Win10 since M110.
622*6777b538SAndroid Build Coastguard Workersubsystem_version_suffix = ",10.0"
623*6777b538SAndroid Build Coastguard Worker
624*6777b538SAndroid Build Coastguard Workerconfig("console") {
625*6777b538SAndroid Build Coastguard Worker  ldflags = [ "/SUBSYSTEM:CONSOLE$subsystem_version_suffix" ]
626*6777b538SAndroid Build Coastguard Worker}
627*6777b538SAndroid Build Coastguard Workerconfig("windowed") {
628*6777b538SAndroid Build Coastguard Worker  ldflags = [ "/SUBSYSTEM:WINDOWS$subsystem_version_suffix" ]
629*6777b538SAndroid Build Coastguard Worker}
630*6777b538SAndroid Build Coastguard Worker
631*6777b538SAndroid Build Coastguard Worker# Incremental linking ----------------------------------------------------------
632*6777b538SAndroid Build Coastguard Worker
633*6777b538SAndroid Build Coastguard Worker# Applies incremental linking or not depending on the current configuration.
634*6777b538SAndroid Build Coastguard Workerconfig("default_incremental_linking") {
635*6777b538SAndroid Build Coastguard Worker  # Enable incremental linking for debug builds and all component builds - any
636*6777b538SAndroid Build Coastguard Worker  # builds where performance is not job one.
637*6777b538SAndroid Build Coastguard Worker  # TODO(thakis): Always turn this on with lld, no reason not to.
638*6777b538SAndroid Build Coastguard Worker  if (is_debug || is_component_build) {
639*6777b538SAndroid Build Coastguard Worker    ldflags = [ "/INCREMENTAL" ]
640*6777b538SAndroid Build Coastguard Worker    if (use_lld) {
641*6777b538SAndroid Build Coastguard Worker      # lld doesn't use ilk files and doesn't really have an incremental link
642*6777b538SAndroid Build Coastguard Worker      # mode; the only effect of the flag is that the .lib file timestamp isn't
643*6777b538SAndroid Build Coastguard Worker      # updated if the .lib doesn't change.
644*6777b538SAndroid Build Coastguard Worker      # TODO(thakis): Why pass /OPT:NOREF for lld, but not otherwise?
645*6777b538SAndroid Build Coastguard Worker      # TODO(thakis): /INCREMENTAL is on by default in link.exe, but not in
646*6777b538SAndroid Build Coastguard Worker      # lld.
647*6777b538SAndroid Build Coastguard Worker      ldflags += [ "/OPT:NOREF" ]
648*6777b538SAndroid Build Coastguard Worker
649*6777b538SAndroid Build Coastguard Worker      # TODO(crbug.com/1444129): Mixing incrememntal and icf produces an error
650*6777b538SAndroid Build Coastguard Worker      # in lld-link.
651*6777b538SAndroid Build Coastguard Worker      ldflags += [ "/OPT:NOICF" ]
652*6777b538SAndroid Build Coastguard Worker    }
653*6777b538SAndroid Build Coastguard Worker  } else {
654*6777b538SAndroid Build Coastguard Worker    ldflags = [ "/INCREMENTAL:NO" ]
655*6777b538SAndroid Build Coastguard Worker  }
656*6777b538SAndroid Build Coastguard Worker}
657*6777b538SAndroid Build Coastguard Worker
658*6777b538SAndroid Build Coastguard Worker# Character set ----------------------------------------------------------------
659*6777b538SAndroid Build Coastguard Worker
660*6777b538SAndroid Build Coastguard Worker# Not including this config means "ansi" (8-bit system codepage).
661*6777b538SAndroid Build Coastguard Workerconfig("unicode") {
662*6777b538SAndroid Build Coastguard Worker  defines = [
663*6777b538SAndroid Build Coastguard Worker    "_UNICODE",
664*6777b538SAndroid Build Coastguard Worker    "UNICODE",
665*6777b538SAndroid Build Coastguard Worker  ]
666*6777b538SAndroid Build Coastguard Worker}
667*6777b538SAndroid Build Coastguard Worker
668*6777b538SAndroid Build Coastguard Worker# Lean and mean ----------------------------------------------------------------
669*6777b538SAndroid Build Coastguard Worker
670*6777b538SAndroid Build Coastguard Worker# Some third party code might not compile with WIN32_LEAN_AND_MEAN so we have
671*6777b538SAndroid Build Coastguard Worker# to have a separate config for it. Remove this config from your target to
672*6777b538SAndroid Build Coastguard Worker# get the "bloaty and accommodating" version of windows.h.
673*6777b538SAndroid Build Coastguard Workerconfig("lean_and_mean") {
674*6777b538SAndroid Build Coastguard Worker  defines = [ "WIN32_LEAN_AND_MEAN" ]
675*6777b538SAndroid Build Coastguard Worker}
676*6777b538SAndroid Build Coastguard Worker
677*6777b538SAndroid Build Coastguard Worker# Nominmax --------------------------------------------------------------------
678*6777b538SAndroid Build Coastguard Worker
679*6777b538SAndroid Build Coastguard Worker# Some third party code defines NOMINMAX before including windows.h, which
680*6777b538SAndroid Build Coastguard Worker# then causes warnings when it's been previously defined on the command line.
681*6777b538SAndroid Build Coastguard Worker# For such targets, this config can be removed.
682*6777b538SAndroid Build Coastguard Worker
683*6777b538SAndroid Build Coastguard Workerconfig("nominmax") {
684*6777b538SAndroid Build Coastguard Worker  defines = [ "NOMINMAX" ]
685*6777b538SAndroid Build Coastguard Worker}
686