1
1
use std:: env;
2
2
3
- fn static_link_windows ( feat_window : bool , feat_audio : bool , feat_graphics : bool ) {
4
- let env = match env:: var ( "CARGO_CFG_TARGET_ENV" ) . as_deref ( ) {
5
- Ok ( "gnu" ) => "mingw" ,
6
- Ok ( "msvc" ) => "msvc" ,
7
- _ => {
8
- panic ! ( "Failed to determine windows environment (CARGO_CFG_TARGET_ENV))" )
9
- }
10
- } ;
3
+ fn static_link_windows ( feat_window : bool , feat_audio : bool , feat_graphics : bool , env : WinEnv ) {
11
4
let arch = match env:: var ( "CARGO_CFG_TARGET_ARCH" ) . as_deref ( ) {
12
5
Ok ( "x86" ) => "x86" ,
13
6
Ok ( "x86_64" ) => "x64" ,
14
7
_ => panic ! ( "Failed to determine cpu arch (CARGO_CFG_TARGET_ARCH))" ) ,
15
8
} ;
16
- println ! ( "cargo:rustc-link-search=native=SFML/extlibs/libs-{env}/{arch}" ) ;
9
+ println ! (
10
+ "cargo:rustc-link-search=native=SFML/extlibs/libs-{seg}/{arch}" ,
11
+ seg = env. sfml_extlib_name( )
12
+ ) ;
17
13
println ! ( "cargo:rustc-link-lib=dylib=winmm" ) ;
18
14
println ! ( "cargo:rustc-link-lib=dylib=user32" ) ;
19
15
if feat_window {
@@ -54,6 +50,27 @@ fn static_link_linux(feat_window: bool, feat_audio: bool, feat_graphics: bool) {
54
50
}
55
51
}
56
52
53
+ enum WinEnv {
54
+ Gnu ,
55
+ Msvc ,
56
+ }
57
+
58
+ impl WinEnv {
59
+ fn get ( ) -> Option < Self > {
60
+ match env:: var ( "CARGO_CFG_TARGET_ENV" ) . as_deref ( ) {
61
+ Ok ( "gnu" ) => Some ( Self :: Gnu ) ,
62
+ Ok ( "msvc" ) => Some ( Self :: Msvc ) ,
63
+ _ => None ,
64
+ }
65
+ }
66
+ fn sfml_extlib_name ( self ) -> & ' static str {
67
+ match self {
68
+ WinEnv :: Gnu => "mingw" ,
69
+ WinEnv :: Msvc => "msvc" ,
70
+ }
71
+ }
72
+ }
73
+
57
74
fn main ( ) {
58
75
println ! ( "cargo:rerun-if-changed=CSFML" ) ;
59
76
let feat_audio = env:: var ( "CARGO_FEATURE_AUDIO" ) . is_ok ( ) ;
@@ -168,7 +185,8 @@ fn main() {
168
185
. map ( |os| os == "linux" )
169
186
. unwrap_or ( false ) ;
170
187
// I have no idea why this is different on Windows and Linux
171
- let link_search = if is_windows {
188
+ let win_env = WinEnv :: get ( ) ;
189
+ let link_search = if matches ! ( win_env, Some ( WinEnv :: Msvc ) ) {
172
190
if cmake_debug {
173
191
"build/lib/Debug"
174
192
} else {
@@ -186,7 +204,14 @@ fn main() {
186
204
if is_unix && is_linux {
187
205
static_link_linux ( feat_window, feat_audio, feat_graphics) ;
188
206
} else if is_windows {
189
- static_link_windows ( feat_window, feat_audio, feat_graphics) ;
207
+ match win_env {
208
+ Some ( env) => {
209
+ static_link_windows ( feat_window, feat_audio, feat_graphics, env) ;
210
+ }
211
+ None => {
212
+ panic ! ( "Failed to determine windows environment (MSVC/Mingw)" ) ;
213
+ }
214
+ }
190
215
}
191
216
if feat_audio {
192
217
link_sfml_subsystem ( "audio" , cmake_debug) ;
0 commit comments