1
1
use std:: env;
2
- // use std::ffi::OsString;
3
- // use std::process::Command;
2
+ use std:: ffi:: OsString ;
3
+ use std:: process:: Command ;
4
4
5
5
fn main ( ) {
6
- // We don't currently need to check the Version anymore...
7
- // But leaving this in place in case we need to in the future.
8
- /*
6
+ // We check rustc version to enable features beyond MSRV, such as:
7
+ // - 1.59 => neon_intrinsics
9
8
let rustc = env:: var_os ( "RUSTC" ) . unwrap_or ( OsString :: from ( "rustc" ) ) ;
10
9
let output = Command :: new ( & rustc)
11
10
. arg ( "--version" )
12
11
. output ( )
13
12
. expect ( "failed to check 'rustc --version'" )
14
13
. stdout ;
15
14
16
- let version = String::from_utf8(output)
15
+ let raw_version = String :: from_utf8 ( output)
17
16
. expect ( "rustc version output should be utf-8" ) ;
18
- */
19
-
20
- enable_new_features ( /*&version*/ ) ;
21
- }
22
-
23
- fn enable_new_features ( /*raw_version: &str*/ ) {
24
- /*
25
- let version = match Version::parse(raw_version) {
17
+
18
+ let version = match Version :: parse ( & raw_version) {
26
19
Ok ( version) => version,
27
20
Err ( err) => {
28
21
println ! ( "cargo:warning=failed to parse `rustc --version`: {}" , err) ;
29
22
return ;
30
23
}
31
24
} ;
32
- */
33
25
34
- enable_simd ( /* version*/ ) ;
26
+ enable_new_features ( version) ;
35
27
}
36
28
37
- fn enable_simd ( /*version: Version*/ ) {
29
+ fn enable_new_features ( version : Version ) {
30
+ enable_simd ( version) ;
31
+ }
32
+
33
+ fn enable_simd ( version : Version ) {
38
34
if env:: var_os ( "CARGO_FEATURE_STD" ) . is_none ( ) {
39
35
println ! ( "cargo:warning=building for no_std disables httparse SIMD" ) ;
40
36
return ;
@@ -50,6 +46,11 @@ fn enable_simd(/*version: Version*/) {
50
46
return ;
51
47
}
52
48
49
+ // 1.59.0 is the first version to support neon_intrinsics
50
+ if version >= Version ( 1 , 59 , 0 ) {
51
+ println ! ( "cargo:rustc-cfg=httparse_simd_neon_intrinsics" ) ;
52
+ }
53
+
53
54
println ! ( "cargo:rustc-cfg=httparse_simd" ) ;
54
55
55
56
// cfg(target_feature) isn't stable yet, but CARGO_CFG_TARGET_FEATURE has
@@ -83,79 +84,46 @@ fn enable_simd(/*version: Version*/) {
83
84
return
84
85
} ,
85
86
} ;
86
-
87
- let mut saw_sse42 = false ;
88
- let mut saw_avx2 = false ;
89
-
90
- for feature in feature_list. split ( ',' ) {
91
- let feature = feature. trim ( ) ;
92
- if !saw_sse42 && feature == "sse4.2" {
93
- saw_sse42 = true ;
94
- println ! ( "cargo:rustc-cfg=httparse_simd_target_feature_sse42" ) ;
95
- }
96
-
97
- if !saw_avx2 && feature == "avx2" {
98
- saw_avx2 = true ;
99
- println ! ( "cargo:rustc-cfg=httparse_simd_target_feature_avx2" ) ;
100
- }
87
+
88
+ let features = feature_list. split ( ',' ) . map ( |s| s. trim ( ) ) ;
89
+ if features. clone ( ) . any ( |f| f == "sse4.2" ) {
90
+ println ! ( "cargo:rustc-cfg=httparse_simd_target_feature_sse42" ) ;
91
+ }
92
+ if features. clone ( ) . any ( |f| f == "avx2" ) {
93
+ println ! ( "cargo:rustc-cfg=httparse_simd_target_feature_avx2" ) ;
101
94
}
102
95
}
103
96
104
- /*
105
97
#[ derive( Debug , Clone , Copy , PartialEq , PartialOrd ) ]
106
- struct Version {
107
- major: u32,
108
- minor: u32,
109
- patch: u32,
110
- }
98
+ struct Version ( u32 , u32 , u32 ) ;
111
99
112
100
impl Version {
113
- fn parse(mut s: &str) -> Result<Version, String> {
101
+ fn parse ( s : & str ) -> Result < Version , String > {
114
102
if !s. starts_with ( "rustc " ) {
115
103
return Err ( format ! ( "unrecognized version string: {}" , s) ) ;
116
104
}
117
- s = &s["rustc ".len()..];
118
-
119
- let parts: Vec<&str> = s.split(".").collect();
120
- if parts.len() < 3 {
121
- return Err(format!("not enough version parts: {:?}", parts));
122
- }
123
-
124
- let mut num = String::new();
125
- for c in parts[0].chars() {
126
- if !c.is_digit(10) {
127
- break;
128
- }
129
- num.push(c);
130
- }
131
- let major = num.parse::<u32>().map_err(|e| e.to_string())?;
132
-
133
- num.clear();
134
- for c in parts[1].chars() {
135
- if !c.is_digit(10) {
136
- break;
137
- }
138
- num.push(c);
139
- }
140
- let minor = num.parse::<u32>().map_err(|e| e.to_string())?;
141
-
142
- num.clear();
143
- for c in parts[2].chars() {
144
- if !c.is_digit(10) {
145
- break;
146
- }
147
- num.push(c);
105
+ let s = s. trim_start_matches ( "rustc " ) ;
106
+
107
+ let mut iter = s
108
+ . split ( "." )
109
+ . take ( 3 )
110
+ . map ( |s| match s. find ( |c : char | !c. is_ascii_digit ( ) ) {
111
+ Some ( end) => & s[ ..end] ,
112
+ None => s,
113
+ } )
114
+ . map ( |s| s. parse :: < u32 > ( ) . map_err ( |e| e. to_string ( ) ) ) ;
115
+
116
+ if iter. clone ( ) . count ( ) != 3 {
117
+ return Err ( format ! ( "not enough version parts: {:?}" , s) ) ;
148
118
}
149
- let patch = num.parse::<u32>().map_err(|e| e.to_string())?;
119
+
120
+ let major = iter. next ( ) . unwrap ( ) ?;
121
+ let minor = iter. next ( ) . unwrap ( ) ?;
122
+ let patch = iter. next ( ) . unwrap ( ) ?;
150
123
151
- Ok(Version {
152
- major: major,
153
- minor: minor,
154
- patch: patch,
155
- })
124
+ Ok ( Version ( major, minor, patch) )
156
125
}
157
126
}
158
- */
159
127
160
128
fn var_is ( key : & str , val : & str ) -> bool {
161
129
match env:: var ( key) {
0 commit comments