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.
This commit is contained in:
Carl Åstholm
2024-04-22 22:13:49 +02:00
committed by Andrew Kelley
parent c947e79d73
commit e8f28cda9e
2 changed files with 9 additions and 8 deletions

View File

@@ -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,
},