Commit 2f8983e2f6

Andrew Kelley <andrew@ziglang.org>
2019-07-12 21:10:32
update zig build system for mingw static lib conventions
1 parent 7b8ba87
Changed files (1)
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;
                     }
                 }
             },