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