@@ -27,4 +27,36 @@ fn main() {
27
27
}
28
28
let target = env:: var ( "TARGET" ) . unwrap ( ) ;
29
29
println ! ( "cargo:rustc-env=TARGET={target}" ) ;
30
+
31
+ let target_os = env:: var ( "CARGO_CFG_TARGET_OS" ) ;
32
+ let target_env = env:: var ( "CARGO_CFG_TARGET_ENV" ) ;
33
+ if Ok ( "windows" ) == target_os. as_deref ( ) && Ok ( "msvc" ) == target_env. as_deref ( ) {
34
+ // # Only search system32 for DLLs
35
+ //
36
+ // This applies to DLLs loaded at load time. However, this setting is ignored
37
+ // before Windows 10 RS1.
38
+ println ! ( "cargo:cargo:rustc-link-arg-bin=rustup-init=/DEPENDENTLOADFLAG:0x800" ) ;
39
+
40
+ // # Delay load
41
+ //
42
+ // Delay load dlls that are not "known DLLs".
43
+ // Known DLLs are always loaded from the system directory whereas other DLLs
44
+ // are loaded from the application directory. By delay loading the latter
45
+ // we can ensure they are instead loaded from the system directory.
46
+ //
47
+ // This will work on all supported Windows versions but it relies on
48
+ // using `SetDefaultDllDirectories` before any libraries are loaded.
49
+ let delay_load_dlls = [ "bcrypt" , "powrprof" , "secur32" ] ;
50
+ for dll in delay_load_dlls {
51
+ println ! ( "cargo:rustc-link-arg-bin=rustup-init=/delayload:{dll}.dll" ) ;
52
+ }
53
+ println ! ( "cargo:rustc-link-arg-bin=rustup-init=delayimp.lib" ) ;
54
+
55
+ // # Turn linker warnings into errors
56
+ //
57
+ // Rust hides linker warnings meaning mistakes may go unnoticed.
58
+ // Turning them into errors forces them to be displayed (and the build to fail).
59
+ // If we do want to ignore specific warnings then `/IGNORE:` should be used.
60
+ println ! ( "cargo:cargo:rustc-link-arg-bin=rustup-init=/WX" ) ;
61
+ }
30
62
}
0 commit comments