aboutsummaryrefslogtreecommitdiff
path: root/std
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-02-25 13:34:25 -0500
committerAndrew Kelley <andrew@ziglang.org>2019-02-25 13:34:25 -0500
commit525c2eaf5d49f537d4ccd48ab0c5bc1f52cc3204 (patch)
treecf66d3fd2b48f894048dbdfae93e8f5ad1e6e22a /std
parente76ce2c1d0d3988359267fd3030a81a52ec99f3f (diff)
downloadzig-525c2eaf5d49f537d4ccd48ab0c5bc1f52cc3204.tar.gz
zig-525c2eaf5d49f537d4ccd48ab0c5bc1f52cc3204.zip
building DLLs on Windows works better
Diffstat (limited to 'std')
-rw-r--r--std/build.zig45
1 files changed, 43 insertions, 2 deletions
diff --git a/std/build.zig b/std/build.zig
index 4386b730cd..0d03b0325f 100644
--- a/std/build.zig
+++ b/std/build.zig
@@ -815,6 +815,7 @@ pub const LibExeObjStep = struct {
linker_script: ?[]const u8,
out_filename: []const u8,
output_path: ?[]const u8,
+ output_lib_path: ?[]const u8,
static: bool,
version: Version,
object_files: ArrayList([]const u8),
@@ -839,6 +840,7 @@ pub const LibExeObjStep = struct {
root_src: ?[]const u8,
output_h_path: ?[]const u8,
out_h_filename: []const u8,
+ out_lib_filename: []const u8,
assembly_files: ArrayList([]const u8),
packages: ArrayList(Pkg),
build_options_contents: std.Buffer,
@@ -901,10 +903,12 @@ pub const LibExeObjStep = struct {
.frameworks = BufSet.init(builder.allocator),
.step = Step.init(name, builder.allocator, make),
.output_path = null,
+ .output_lib_path = null,
.output_h_path = null,
.version = ver,
.out_filename = undefined,
.out_h_filename = builder.fmt("{}.h", name),
+ .out_lib_filename = undefined,
.major_only_filename = undefined,
.name_only_filename = undefined,
.object_files = ArrayList([]const u8).init(builder.allocator),
@@ -941,21 +945,32 @@ pub const LibExeObjStep = struct {
},
Kind.Lib => {
if (self.static) {
- self.out_filename = self.builder.fmt("lib{}.a", self.name);
+ switch (self.target.getOs()) {
+ builtin.Os.windows => {
+ self.out_filename = self.builder.fmt("{}.lib", self.name);
+ },
+ else => {
+ self.out_filename = self.builder.fmt("lib{}.a", self.name);
+ },
+ }
+ self.out_lib_filename = self.out_filename;
} else {
switch (self.target.getOs()) {
builtin.Os.ios, builtin.Os.macosx => {
self.out_filename = self.builder.fmt("lib{}.{d}.{d}.{d}.dylib", self.name, self.version.major, self.version.minor, self.version.patch);
self.major_only_filename = self.builder.fmt("lib{}.{d}.dylib", self.name, self.version.major);
self.name_only_filename = self.builder.fmt("lib{}.dylib", self.name);
+ self.out_lib_filename = self.out_filename;
},
builtin.Os.windows => {
self.out_filename = self.builder.fmt("{}.dll", self.name);
+ self.out_lib_filename = self.builder.fmt("{}.lib", self.name);
},
else => {
self.out_filename = self.builder.fmt("lib{}.so.{d}.{d}.{d}", self.name, self.version.major, self.version.minor, self.version.patch);
self.major_only_filename = self.builder.fmt("lib{}.so.{d}", self.name, self.version.major);
self.name_only_filename = self.builder.fmt("lib{}.so", self.name);
+ self.out_lib_filename = self.out_filename;
},
}
}
@@ -990,7 +1005,11 @@ pub const LibExeObjStep = struct {
self.step.dependOn(&lib.step);
- self.full_path_libs.append(lib.getOutputPath()) catch unreachable;
+ if (lib.static or self.target.isWindows()) {
+ self.object_files.append(lib.getOutputLibPath()) catch unreachable;
+ } else {
+ self.full_path_libs.append(lib.getOutputPath()) catch unreachable;
+ }
// TODO should be some kind of isolated directory that only has this header in it
self.include_dirs.append(self.builder.cache_root) catch unreachable;
@@ -1060,6 +1079,22 @@ pub const LibExeObjStep = struct {
) catch unreachable;
}
+ pub fn setOutputLibPath(self: *LibExeObjStep, file_path: []const u8) void {
+ assert(self.kind == Kind.Lib);
+ if (self.static)
+ return self.setOutputPath(file_path);
+
+ self.output_lib_path = file_path;
+ }
+
+ pub fn getOutputLibPath(self: *LibExeObjStep) []const u8 {
+ assert(self.kind == Kind.Lib);
+ return if (self.output_lib_path) |output_lib_path| output_lib_path else os.path.join(
+ self.builder.allocator,
+ [][]const u8{ self.builder.cache_root, self.out_lib_filename },
+ ) catch unreachable;
+ }
+
pub fn setOutputHPath(self: *LibExeObjStep, file_path: []const u8) void {
self.output_h_path = file_path;
@@ -1225,6 +1260,12 @@ pub const LibExeObjStep = struct {
zig_args.append("--output") catch unreachable;
zig_args.append(output_path) catch unreachable;
+ if (self.kind == Kind.Lib and !self.static) {
+ const output_lib_path = builder.pathFromRoot(self.getOutputLibPath());
+ zig_args.append("--output-lib") catch unreachable;
+ zig_args.append(output_lib_path) catch unreachable;
+ }
+
if (self.kind != Kind.Exe) {
const output_h_path = self.getOutputHPath();
zig_args.append("--output-h") catch unreachable;