Commit e8f28cda9e

Carl Åstholm <carl@astholm.se>
2024-04-22 22:13:49
std.Build: Install Windows DLLs to `<prefix>/bin/` by default
Windows does not support RPATH and only searches for DLLs in a small number of predetermined paths by default, with one of them being the directory from which the application loaded. Installing both executables and DLLs to `bin/` by default helps ensure that the executable can find any DLL artifacts it has linked to. DLL import libraries are still installed to `lib/`. These defaults match CMake's behavior.
1 parent c947e79
Changed files (2)
lib/std/Build/Step/Compile.zig
@@ -614,6 +614,10 @@ pub fn isStaticLibrary(self: *const Compile) bool {
     return self.kind == .lib and self.linkage != .dynamic;
 }
 
+pub fn isDll(self: *Compile) bool {
+    return self.isDynamicLibrary() and self.rootModuleTarget().os.tag == .windows;
+}
+
 pub fn producesPdbFile(self: *Compile) bool {
     const target = self.rootModuleTarget();
     // TODO: Is this right? Isn't PDB for *any* PE/COFF file?
@@ -632,7 +636,7 @@ pub fn producesPdbFile(self: *Compile) bool {
 }
 
 pub fn producesImplib(self: *Compile) bool {
-    return self.isDynamicLibrary() and self.rootModuleTarget().os.tag == .windows;
+    return self.isDll();
 }
 
 pub fn linkLibC(self: *Compile) void {
lib/std/Build/Step/InstallArtifact.zig
@@ -57,8 +57,8 @@ pub fn create(owner: *std.Build, artifact: *Step.Compile, options: Options) *Ins
         .disabled => null,
         .default => switch (artifact.kind) {
             .obj => @panic("object files have no standard installation procedure"),
-            .exe, .@"test" => InstallDir{ .bin = {} },
-            .lib => InstallDir{ .lib = {} },
+            .exe, .@"test" => .bin,
+            .lib => if (artifact.isDll()) .bin else .lib,
         },
         .override => |o| o,
     };
@@ -77,15 +77,12 @@ pub fn create(owner: *std.Build, artifact: *Step.Compile, options: Options) *Ins
         },
         .h_dir = switch (options.h_dir) {
             .disabled => null,
-            .default => switch (artifact.kind) {
-                .lib => .header,
-                else => null,
-            },
+            .default => if (artifact.kind == .lib) .header else null,
             .override => |o| o,
         },
         .implib_dir = switch (options.implib_dir) {
             .disabled => null,
-            .default => if (artifact.producesImplib()) dest_dir else null,
+            .default => if (artifact.producesImplib()) .lib else null,
             .override => |o| o,
         },