diff options
author | Yun Peng <pcloudy@google.com> | 2017-04-18 13:33:28 +0200 |
---|---|---|
committer | Klaus Aehlig <aehlig@google.com> | 2017-04-18 15:26:12 +0200 |
commit | 997992d728a6ae5f5b9ee9a4a117d554041e6f45 (patch) | |
tree | 0c5e4538967a1f533e443266859e0567ad89c9f0 /tools | |
parent | 1ade2c47f075d981e5c9d23276530778abb3d8ab (diff) |
Generating PDB files on Windows
1. Add /Z7 as compiler flag in CROSSTOOL, this causes full debugging
infomation built into object files, no PDB file is generated.
2. Add /DEBUG as linker flag so that a PDB file will be generated for
executable or dll.
* /DEBUG:FULL for dbg mode. the full PDB can be used to debug the
executable when no other build products are available, such as
when the executable is deployed.
* /DEBUG:FASTLINK for fastbuild mode. object files are still needed
when debugging the executable, but linking speed can be two to four
times faster that full PDB generation.
* No option is added for opt mode.
More detailed info: https://msdn.microsoft.com/en-us/library/xe4t6fc1.aspx
3. Add an empty feature in MSVC CROSSTOOL to tell Bazel we need PDB file
4. Add PDB file artifact in an output named pdb_file of cc_binary,
then you can build the pdb file by bazel build //foo/bar:bin --output_groups=pdb_file
5. Add test for PDB file generation
Change-Id: Ia5096470187ebca72f2c804f32d5b723f40c0b85
PiperOrigin-RevId: 153449059
Diffstat (limited to 'tools')
-rw-r--r-- | tools/cpp/CROSSTOOL.tpl | 78 | ||||
-rw-r--r-- | tools/cpp/wrapper/bin/pydir/msvc_tools.py.tpl | 2 |
2 files changed, 67 insertions, 13 deletions
diff --git a/tools/cpp/CROSSTOOL.tpl b/tools/cpp/CROSSTOOL.tpl index 60fb955e95..8bf57e5808 100644 --- a/tools/cpp/CROSSTOOL.tpl +++ b/tools/cpp/CROSSTOOL.tpl @@ -463,6 +463,16 @@ toolchain { } feature { + name: 'generate_pdb_file' + requires: { + feature: 'dbg' + } + requires: { + feature: 'fastbuild' + } + } + + feature { name: 'has_configured_linker_path' } @@ -641,7 +651,6 @@ toolchain { } } - feature { name: 'linker_param_file' flag_set { @@ -664,31 +673,78 @@ toolchain { } } + feature { + name: 'dbg' + flag_set { + action: 'c-compile' + action: 'c++-compile' + flag_group { + flag: "/Od" + flag: '/MTd' + flag: "/Z7" + } + } + flag_set { + action: 'c++-link-executable' + action: 'c++-link-dynamic-library' + flag_group { + flag: "/DEBUG:FULL" + flag: "/INCREMENTAL:NO" + } + } + implies: 'generate_pdb_file' + } + + feature { + name: 'fastbuild' + flag_set { + action: 'c-compile' + action: 'c++-compile' + flag_group { + flag: "/Od" + flag: '/MT' + flag: "/Z7" + } + } + flag_set { + action: 'c++-link-executable' + action: 'c++-link-dynamic-library' + flag_group { + flag: "/DEBUG:FASTLINK" + flag: "/INCREMENTAL:NO" + } + } + implies: 'generate_pdb_file' + } + + feature { + name: 'opt' + flag_set { + action: 'c-compile' + action: 'c++-compile' + flag_group { + flag: "/O2" + flag: '/MT' + } + } + } + compilation_mode_flags { mode: DBG - compiler_flag: "/DDEBUG=1" - # This will signal the wrapper that we are doing a debug build, which sets - # some internal state of the toolchain wrapper. It is intentionally a "-" - # flag to make this very obvious. - compiler_flag: "-g" - compiler_flag: "/Od" compiler_flag: "-Xcompilation-mode=dbg" linker_flag: "-Xcompilation-mode=dbg" } compilation_mode_flags { mode: FASTBUILD - compiler_flag: "/DNDEBUG" - compiler_flag: "/Od" compiler_flag: "-Xcompilation-mode=fastbuild" linker_flag: "-Xcompilation-mode=fastbuild" } compilation_mode_flags { mode: OPT - compiler_flag: "/DNDEBUG" - compiler_flag: "/O2" compiler_flag: "-Xcompilation-mode=opt" linker_flag: "-Xcompilation-mode=opt" } + } diff --git a/tools/cpp/wrapper/bin/pydir/msvc_tools.py.tpl b/tools/cpp/wrapper/bin/pydir/msvc_tools.py.tpl index 0695593d5f..127aa87c06 100644 --- a/tools/cpp/wrapper/bin/pydir/msvc_tools.py.tpl +++ b/tools/cpp/wrapper/bin/pydir/msvc_tools.py.tpl @@ -263,8 +263,6 @@ class ArgParser(object): if arg.startswith('/Fo') or arg.startswith('/Fa') or arg.startswith( '/Fi'): self.output_file = arg[3:] - self.options.append( - '/Fd%s.pdb' % self.NormPath(os.path.splitext(self.output_file)[0])) if num_matched == 0: # Strip out any .a's that have 0 size, they are header or intermediate # dependency libraries and don't contain any code. 0-length files are |