From eebb00193d9e4531438b0f8c5dbcbea9a90e6a7e Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 8 Jul 2019 18:48:03 -0400 Subject: [PATCH] zig build: install .pdb files along with binaries closes #2848 --- std/build.zig | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/std/build.zig b/std/build.zig index 87f589bc5b..ee8f58cbcd 100644 --- a/std/build.zig +++ b/std/build.zig @@ -1040,6 +1040,7 @@ pub const LibExeObjStep = struct { root_src: ?[]const u8, out_h_filename: []const u8, out_lib_filename: []const u8, + out_pdb_filename: []const u8, packages: ArrayList(Pkg), build_options_contents: std.Buffer, system_linker_hack: bool, @@ -1125,6 +1126,7 @@ pub const LibExeObjStep = struct { .out_filename = undefined, .out_h_filename = builder.fmt("{}.h", name), .out_lib_filename = undefined, + .out_pdb_filename = builder.fmt("{}.pdb", name), .major_only_filename = undefined, .name_only_filename = undefined, .packages = ArrayList(Pkg).init(builder.allocator), @@ -1367,6 +1369,16 @@ pub const LibExeObjStep = struct { ) catch unreachable; } + /// Unless setOutputDir was called, this function must be called only in + /// the make step, from a step that has declared a dependency on this one. + pub fn getOutputPdbPath(self: *LibExeObjStep) []const u8 { + assert(self.target.isWindows()); + return fs.path.join( + self.builder.allocator, + [_][]const u8{ self.output_dir.?, self.out_pdb_filename }, + ) catch unreachable; + } + pub fn addAssemblyFile(self: *LibExeObjStep, path: []const u8) void { self.link_objects.append(LinkObject{ .AssemblyFile = self.builder.dupe(path) }) catch unreachable; } @@ -1831,6 +1843,7 @@ const InstallArtifactStep = struct { builder: *Builder, artifact: *LibExeObjStep, dest_dir: InstallDir, + pdb_dir: ?InstallDir, const Self = @This(); @@ -1848,6 +1861,13 @@ const InstallArtifactStep = struct { .Exe => InstallDir.Bin, .Lib => InstallDir.Lib, }, + .pdb_dir = if (artifact.target.isWindows() and !artifact.strip) blk: { + if (artifact.kind == .Exe) { + break :blk InstallDir.Bin; + } else { + break :blk InstallDir.Lib; + } + } else null, }; self.step.dependOn(&artifact.step); artifact.install_step = self; @@ -1857,6 +1877,9 @@ const InstallArtifactStep = struct { builder.pushInstalledFile(.Lib, artifact.major_only_filename); builder.pushInstalledFile(.Lib, artifact.name_only_filename); } + if (self.pdb_dir) |pdb_dir| { + builder.pushInstalledFile(pdb_dir, artifact.out_pdb_filename); + } return self; } @@ -1878,6 +1901,10 @@ const InstallArtifactStep = struct { if (self.artifact.isDynamicLibrary()) { try doAtomicSymLinks(builder.allocator, full_dest_path, self.artifact.major_only_filename, self.artifact.name_only_filename); } + if (self.pdb_dir) |pdb_dir| { + const full_pdb_path = builder.getInstallPath(pdb_dir, self.artifact.out_pdb_filename); + try builder.copyFile(self.artifact.getOutputPdbPath(), full_pdb_path); + } self.artifact.installed_path = full_dest_path; } };