From 2f8983e2f66c54429db686072642e9a3b085a791 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 12 Jul 2019 15:10:32 -0400 Subject: [PATCH] update zig build system for mingw static lib conventions --- std/build.zig | 95 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 56 insertions(+), 39 deletions(-) diff --git a/std/build.zig b/std/build.zig index 1e2816c775..c740903244 100644 --- a/std/build.zig +++ b/std/build.zig @@ -1064,11 +1064,7 @@ pub const Target = union(enum) { } pub fn oFileExt(self: Target) []const u8 { - const abi = switch (self) { - .Native => builtin.abi, - .Cross => |t| t.abi, - }; - return switch (abi) { + return switch (self.getAbi()) { builtin.Abi.msvc => ".obj", else => ".o", }; @@ -1081,11 +1077,31 @@ pub const Target = union(enum) { }; } - pub fn libFileExt(self: Target) []const u8 { - return switch (self.getOs()) { - .windows => ".lib", - else => ".a", - }; + pub fn staticLibSuffix(self: Target) []const u8 { + if (self.isWasm()) { + return ".wasm"; + } + switch (self.getAbi()) { + .msvc => return ".lib", + else => return ".a", + } + } + + pub fn dynamicLibSuffix(self: Target) []const u8 { + if (self.isDarwin()) { + return ".dylib"; + } + switch (self.getOs()) { + .windows => return ".dll", + else => return ".so", + } + } + + pub fn libPrefix(self: Target) []const u8 { + switch (self.getAbi()) { + .msvc => return "", + else => return "lib", + } } pub fn getOs(self: Target) builtin.Os { @@ -1109,6 +1125,17 @@ pub const Target = union(enum) { } } + pub fn isMinGW(self: Target) bool { + return self.isWindows() and self.isGnu(); + } + + pub fn isGnu(self: Target) bool { + return switch (self.getAbi()) { + .gnu, .gnuabin32, .gnuabi64, .gnueabi, .gnueabihf, .gnux32 => true, + else => false, + }; + } + pub fn isDarwin(self: Target) bool { return switch (self.getOs()) { .ios, .macosx, .watchos, .tvos => true, @@ -1324,37 +1351,27 @@ pub const LibExeObjStep = struct { }, .Lib => { if (!self.is_dynamic) { - switch (self.target.getOs()) { - .windows => { - self.out_filename = self.builder.fmt("{}.lib", self.name); - }, - else => { - if (self.target.isWasm()) { - self.out_filename = self.builder.fmt("{}.wasm", self.name); - } else { - self.out_filename = self.builder.fmt("lib{}.a", self.name); - } - }, - } + self.out_filename = self.builder.fmt( + "{}{}{}", + self.target.libPrefix(), + self.name, + self.target.staticLibSuffix(), + ); self.out_lib_filename = self.out_filename; } else { - switch (self.target.getOs()) { - .ios, .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; - }, - .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; - }, + if (self.target.isDarwin()) { + 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; + } else if (self.target.isWindows()) { + 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; } } },