blob: c7da51461de004093ed3be2c5e406c7740211228 [file] [log] [blame] [view]
nodir06cbaa02015-08-25 17:15:241# Windows precompiled headers
andybons3322f762015-08-24 21:37:092
3Using precompiled headers on Windows can speed builds up by around 25%.
4
nodir06cbaa02015-08-25 17:15:245Precompiled headers are used by default when GYP generates project files for
6Visual Studio 2010.
andybons3322f762015-08-24 21:37:097
nodir06cbaa02015-08-25 17:15:248When using Visual Studio 2008, use of precompiled headers is off by default (see
9discussion below). To turn on precompiled headers in your client when using
10MSVS 2008, make sure your `~\.gyp\include.gypi` file looks something like this,
11then run `gclient runhooks` to update the solution files generated by GYP:
andybons3322f762015-08-24 21:37:0912
nodir06cbaa02015-08-25 17:15:2413 {
14 'variables': {
15 'chromium_win_pch': 1,
16 }
17 }
andybons3322f762015-08-24 21:37:0918
nodir06cbaa02015-08-25 17:15:2419Since [r174228](http://src.chromium.org/viewvc/chrome?view=rev&revision=174228),
20default is using precompiled header for non `Official` build.
andybons3322f762015-08-24 21:37:0921
nodir06cbaa02015-08-25 17:15:2422## Discussion
andybons3322f762015-08-24 21:37:0923
nodir06cbaa02015-08-25 17:15:2424MSVS 2008 has some limitations in how well it handles precompiled headers.
25We've run into two issues:
andybons3322f762015-08-24 21:37:0926
nodir06cbaa02015-08-25 17:15:24271. Using precompiled headers can push our official builders over the edge of
28 the world, into the dangerous Kingdom of Oom (out of memory).
291. When compilation flags are changed, instead of doing the right thing and
30 rebuilding the precompiled headers and their dependents, MSVS prints a
31 warning instead, saying the precompiled header file was built with
32 different flags than the current file.
andybons3322f762015-08-24 21:37:0933
nodir06cbaa02015-08-25 17:15:2434Because of the above, we disabled use of precompiled headers by default, and
35required the `chromium_win_pch` flag discussed above to be set.
andybons3322f762015-08-24 21:37:0936
nodir06cbaa02015-08-25 17:15:2437We may be able to turn use of precompiled headers back on for Debug builds by
38default, by adding a workaround to MSVS's limitations to GYP, i.e. if it detects
39a change in compile flags it could blow away MSVS's output directory.
40
41## Troubleshooting
andybons3322f762015-08-24 21:37:0942
43Both of these apply to Visual Studio 2008 only.
44
nodir06cbaa02015-08-25 17:15:2445### Precompiled header is missing
andybons3322f762015-08-24 21:37:0946
nodir06cbaa02015-08-25 17:15:2447**Problem**: You didn't rebuild recently, and you want to build an individual
48source file (Ctrl+F7). MSVS complains that the precompiled header is missing.
andybons3322f762015-08-24 21:37:0949
nodir06cbaa02015-08-25 17:15:2450**Solution**: You could do a full build of the target your source file is in. If
51you'd like to avoid that, find the precompiled header generator file, located
52within a filter somewhere like `../../build/precompile.cc` in your project,
53individually build that file, then individually build the source file you
54intended to build. The `precompile.cc` file is the generator for the precompiled
55header file.
andybons3322f762015-08-24 21:37:0956
nodir06cbaa02015-08-25 17:15:2457### specified for precompiled header but not for current compile
andybons3322f762015-08-24 21:37:0958
nodir06cbaa02015-08-25 17:15:2459**Problem**: MSVS prints out a warning like this (that we treat as an error):
60`warning C4651: '/D_FOOBAR' specified for precompiled header but not for current
61compile`
andybons3322f762015-08-24 21:37:0962
nodir06cbaa02015-08-25 17:15:2463**Solution**: This means compilation flags have changed from when the
64precompiled header file was generated. The issue is that MSVS does not handle
65this correctly. As compilation flags may affect the precompiled header file, it
66should be rebuilt along with its dependents. The workaround for now is to do a
67full rebuild, or (if you want to try to be minimal) a rebuild of all projects
68previously built that use precompiled headers.