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