@@ -4,15 +4,25 @@ use std::path::PathBuf;
4
4
fn main ( ) {
5
5
let mut cc = cc:: Build :: new ( ) ;
6
6
let comp = cc. get_compiler ( ) ;
7
- let msvc_bugs = comp. is_like_msvc ( ) ;
7
+ let is_msvc = comp. is_like_msvc ( ) ;
8
8
cc. warnings ( false ) ;
9
9
cc. pic ( true ) ;
10
10
11
- let target_pointer_width = env:: var ( "CARGO_CFG_TARGET_POINTER_WIDTH" ) . expect ( "CARGO_CFG_TARGET_POINTER_WIDTH var" ) ;
12
- let target_arch = env:: var ( "CARGO_CFG_TARGET_ARCH" ) . expect ( "CARGO_CFG_TARGET_ARCH var" ) ;
11
+ let target_pointer_width = env:: var ( "CARGO_CFG_TARGET_POINTER_WIDTH" ) . expect ( "CARGO_CFG_TARGET_POINTER_WIDTH" ) ;
12
+ let target_endian = env:: var ( "CARGO_CFG_TARGET_ENDIAN" ) . expect ( "CARGO_CFG_TARGET_ENDIAN" ) ;
13
+ let target_arch = env:: var ( "CARGO_CFG_TARGET_ARCH" ) . expect ( "CARGO_CFG_TARGET_ARCH" ) ;
14
+ let target_feature = env:: var ( "CARGO_CFG_TARGET_FEATURE" ) . unwrap_or_default ( ) ;
15
+ let has_feature = |f| target_feature. split ( ',' ) . any ( |t| t == f) ;
16
+
17
+ if target_endian != "little" {
18
+ println ! ( "cargo::error=cloudflare-zlib does not support big endian" ) ;
19
+ // don't exit(1): https://github.com/rust-lang/cargo/issues/15038
20
+ }
13
21
14
22
if target_pointer_width != "64" {
15
23
println ! ( "cargo:warning=cloudflare-zlib does not support 32-bit architectures" ) ;
24
+ println ! ( "cargo::error=cloudflare-zlib does not support 32-bit architectures" ) ;
25
+ // don't exit(1): https://github.com/rust-lang/cargo/issues/15038
16
26
}
17
27
18
28
if let Ok ( target_cpu) = env:: var ( "TARGET_CPU" ) {
@@ -26,19 +36,61 @@ fn main() {
26
36
if target_arch == "aarch64" {
27
37
cc. define ( "INFLATE_CHUNK_SIMD_NEON" , Some ( "1" ) ) ;
28
38
cc. define ( "ADLER32_SIMD_NEON" , Some ( "1" ) ) ;
39
+ cc. flag_if_supported ( if is_msvc { "/arch:armv8.3" } else { "-march=armv8-a+crc" } ) ;
29
40
} else if target_arch == "x86_64" {
30
- cc. define ( "INFLATE_CHUNK_SIMD_SSE2" , Some ( "1" ) ) ;
31
- if msvc_bugs {
32
- cc. define ( "__x86_64__" , Some ( "1" ) ) ;
41
+ let sse42_flag = if is_msvc { "/arch:SSE4.2" } else { "-msse4.2" } ;
42
+
43
+ let has_avx = has_feature ( "avx" ) ; // AVX changes ABI, so it can't be enabled just in C
44
+ let has_sse42 = has_avx || has_feature ( "sse4.2" ) ||
45
+ cc. is_flag_supported ( sse42_flag) . unwrap_or ( false ) ||
46
+ // MSDN says /arch:SSE4.2 exists, but MSVC disagrees.
47
+ ( is_msvc && cc. is_flag_supported ( "/arch:AVX" ) . unwrap_or ( false ) ) ;
48
+ let has_ssse3 = has_avx || has_feature ( "ssse3" ) || cc. is_flag_supported ( "-mssse3" ) . unwrap_or ( false ) ;
49
+ let has_pcmul = has_feature ( "pclmulqdq" ) || cc. is_flag_supported ( "-mpclmul" ) . unwrap_or ( false ) ;
50
+
51
+ if has_avx {
52
+ cc. define ( "HAS_AVX" , Some ( "1" ) ) ;
53
+ cc. flag ( if is_msvc { "/arch:AVX" } else { "-mavx" } ) ;
54
+ } else if has_sse42 {
55
+ cc. flag ( sse42_flag) ;
56
+ }
57
+
58
+ if has_sse42 {
59
+ cc. define ( "INFLATE_CHUNK_SIMD_SSE2" , Some ( "1" ) ) ;
60
+ if is_msvc {
61
+ cc. define ( "__x86_64__" , Some ( "1" ) ) ;
62
+ }
63
+ cc. define ( "HAS_SSE2" , Some ( "1" ) ) ;
64
+ cc. define ( "HAS_SSE42" , Some ( "1" ) ) ;
65
+
66
+ if has_ssse3 {
67
+ cc. flag_if_supported ( "-mssse3" ) ;
68
+ cc. define ( "HAS_SSSE3" , Some ( "1" ) ) ;
69
+ cc. define ( "ADLER32_SIMD_SSSE3" , Some ( "1" ) ) ;
70
+ }
71
+
72
+ if has_pcmul {
73
+ cc. flag_if_supported ( "-mpclmul" ) ;
74
+ cc. define ( "HAS_PCLMUL" , Some ( "1" ) ) ;
75
+ cc. file ( vendor. join ( "crc32_simd.c" ) ) ;
76
+
77
+ if has_feature ( "pclmulqdq" ) {
78
+ cc. define ( "SKIP_CPUID_CHECK" , Some ( "1" ) ) ;
79
+ }
80
+ }
81
+
82
+ } else {
83
+ println ! ( "cargo::error=This build has disabled SSE4.2 support, but cloudflare-zlib-sys requires it" ) ;
84
+ println ! ( "cargo:warning=Build with RUSTFLAGS='-Ctarget-feature=+sse4.2. Currently enabled: {target_feature}" ) ;
85
+ cc. define ( "INFLATE_CHUNK_GENERIC" , Some ( "1" ) ) ;
33
86
}
34
87
}
35
88
36
89
cc. define ( "INFLATE_CHUNK_READ_64LE" , Some ( "1" ) ) ;
37
90
38
- if msvc_bugs {
91
+ if is_msvc {
39
92
cc. define ( "_CRT_SECURE_NO_DEPRECATE" , Some ( "1" ) ) ;
40
93
cc. define ( "_CRT_NONSTDC_NO_DEPRECATE" , Some ( "1" ) ) ;
41
- cc. flag_if_supported ( "/arch:AVX" ) ;
42
94
} else {
43
95
cc. define ( "HAVE_UNISTD_H" , Some ( "1" ) ) ;
44
96
cc. define ( "HAVE_HIDDEN" , Some ( "1" ) ) ;
@@ -47,20 +99,6 @@ fn main() {
47
99
cc. define ( "HAVE_OFF64_T" , Some ( "1" ) ) ;
48
100
cc. define ( "_LARGEFILE64_SOURCE" , Some ( "1" ) ) ;
49
101
}
50
- if target_arch == "aarch64" {
51
- cc. flag_if_supported ( "-march=armv8-a+crc" ) ;
52
- } else {
53
- if cc. is_flag_supported ( "-mssse3" ) . is_ok ( ) {
54
- cc. flag ( "-mssse3" ) ;
55
- cc. define ( "ADLER32_SIMD_SSSE3" , Some ( "1" ) ) ;
56
- }
57
- if cc. is_flag_supported ( "-mpclmul" ) . is_ok ( ) {
58
- cc. flag ( "-mpclmul" ) ;
59
- cc. define ( "HAS_PCLMUL" , None ) ;
60
- cc. file ( vendor. join ( "crc32_simd.c" ) ) ;
61
- cc. flag_if_supported ( "-msse4.2" ) ;
62
- }
63
- }
64
102
}
65
103
66
104
cc. file ( vendor. join ( "adler32.c" ) ) ;
0 commit comments