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',