aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools
diff options
context:
space:
mode:
authorGravatar Yun Peng <pcloudy@google.com>2017-04-18 13:33:28 +0200
committerGravatar Klaus Aehlig <aehlig@google.com>2017-04-18 15:26:12 +0200
commit997992d728a6ae5f5b9ee9a4a117d554041e6f45 (patch)
tree0c5e4538967a1f533e443266859e0567ad89c9f0 /tools
parent1ade2c47f075d981e5c9d23276530778abb3d8ab (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.tpl78
-rw-r--r--tools/cpp/wrapper/bin/pydir/msvc_tools.py.tpl2
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