win: Only use ICF and LTO if explicitly opted in. The bots pass --use-icf and --use-lto, so it doesn't affect them. Makes the Windows build more like the non-Windows build, and makes incremental build times (== local dev) in the default build config 20x faster. (It also makes it possible to set CC/CXX to clang-cl without getting warnings about /GL, but that's not my motivation here. But I might want to use goma to build gn in the future, at least on my laptop, and then that'll come in handy.) Also add /Zc:inline to cflags in release builds on Windows. Also change non-Win to use LTO only in release builds -- LTO in debug builds doesn't make much sense. Release build times (always `ninja -C out`, i.e. linking both gn.exe and gn_unittests.exe): With this patch: Full: 4m25s Touch just src\gn\command_analyze.cc: 3.8s Size of out\: 844 MB Peak memory use during build: 250 MB With this patch but no /Zc:inline: Full: 4m25s Touch just src\gn\command_analyze.cc: 4.8s Size of out\: 1.05 GB Peak memory use during build: 345 MB Without this patch (== this patch with --use-icf --use-lto; /Zc:inline seems to have no effect when used with /GL): Full: 4m33s Touch just src\gn\command_analyze.cc: 1m55s (!) Size of out\: 1.52 GB Peak memory use during build: 678 MB Change-Id: Idd87389c7537828fe6523a64de6031f9cbbc0fc6 Reviewed-on: https://gn-review.googlesource.com/c/gn/+/6442 Reviewed-by: Scott Graham <scottmg@chromium.org> Commit-Queue: Nico Weber <thakis@chromium.org>
diff --git a/build/gen.py b/build/gen.py index 1ece5a1..26bce26 100755 --- a/build/gen.py +++ b/build/gen.py
@@ -323,6 +323,10 @@ if options.use_icf and not platform.is_darwin(): ldflags.append('-Wl,--icf=all') + if options.use_lto: + cflags.extend(['-flto', '-fwhole-program-vtables']) + ldflags.extend(['-flto', '-fwhole-program-vtables']) + cflags.extend([ '-D_FILE_OFFSET_BITS=64', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS', @@ -356,15 +360,17 @@ if platform.is_posix() and not platform.is_haiku(): ldflags.append('-pthread') - if options.use_lto: - cflags.extend(['-flto', '-fwhole-program-vtables']) - ldflags.extend(['-flto', '-fwhole-program-vtables']) - elif platform.is_msvc(): if not options.debug: - cflags.extend(['/O2', '/DNDEBUG', '/GL']) - libflags.extend(['/LTCG']) - ldflags.extend(['/LTCG', '/OPT:REF', '/OPT:ICF']) + cflags.extend(['/O2', '/DNDEBUG', '/Zc:inline']) + ldflags.extend(['/OPT:REF']) + + if options.use_icf: + libflags.extend(['/OPT:ICF']) + if options.use_lto: + cflags.extend(['/GL']) + libflags.extend(['/LTCG']) + ldflags.extend(['/LTCG']) cflags.extend([ '/DNOMINMAX',