@@ -190,6 +190,83 @@ impl ConfigInfo {
190
190
command
191
191
}
192
192
193
+ fn download_gccjit (
194
+ & self ,
195
+ output_dir : & Path ,
196
+ libgccjit_so_name : & str ,
197
+ commit : & str ,
198
+ ) -> Result < ( ) , String > {
199
+ // Download time!
200
+ let tempfile_name = format ! ( "{}.download" , libgccjit_so_name) ;
201
+ let tempfile = output_dir. join ( & tempfile_name) ;
202
+ let is_in_ci = std:: env:: var ( "GITHUB_ACTIONS" ) . is_ok ( ) ;
203
+
204
+ let url = format ! (
205
+ "https://github.com/antoyo/gcc/releases/download/master-{}/libgccjit.so" ,
206
+ commit,
207
+ ) ;
208
+
209
+ println ! ( "Downloading `{}`..." , url) ;
210
+ // Try curl. If that fails and we are on windows, fallback to PowerShell.
211
+ let mut ret = run_command_with_output (
212
+ & [
213
+ & "curl" ,
214
+ & "--speed-time" ,
215
+ & "30" ,
216
+ & "--speed-limit" ,
217
+ & "10" , // timeout if speed is < 10 bytes/sec for > 30 seconds
218
+ & "--connect-timeout" ,
219
+ & "30" , // timeout if cannot connect within 30 seconds
220
+ & "-o" ,
221
+ & tempfile_name,
222
+ & "--retry" ,
223
+ & "3" ,
224
+ & "-SRfL" ,
225
+ if is_in_ci { & "-s" } else { & "--progress-bar" } ,
226
+ & url. as_str ( ) ,
227
+ ] ,
228
+ Some ( & output_dir) ,
229
+ ) ;
230
+ if ret. is_err ( ) && cfg ! ( windows) {
231
+ eprintln ! ( "Fallback to PowerShell" ) ;
232
+ ret = run_command_with_output (
233
+ & [
234
+ & "PowerShell.exe" ,
235
+ & "/nologo" ,
236
+ & "-Command" ,
237
+ & "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;" ,
238
+ & format ! (
239
+ "(New-Object System.Net.WebClient).DownloadFile('{}', '{}')" ,
240
+ url,
241
+ tempfile_name,
242
+ ) . as_str ( ) ,
243
+ ] ,
244
+ Some ( & output_dir) ,
245
+ ) ;
246
+ }
247
+ ret?;
248
+
249
+ let libgccjit_so = output_dir. join ( libgccjit_so_name) ;
250
+ // If we reach this point, it means the file was correctly downloaded, so let's
251
+ // rename it!
252
+ std:: fs:: rename ( & tempfile, & libgccjit_so) . map_err ( |err| {
253
+ format ! (
254
+ "Failed to rename `{}` into `{}`: {:?}" ,
255
+ tempfile. display( ) ,
256
+ libgccjit_so. display( ) ,
257
+ err,
258
+ )
259
+ } ) ?;
260
+
261
+ println ! ( "Downloaded libgccjit.so version {} successfully!" , commit) ;
262
+ // We need to create a link named `libgccjit.so.0` because that's what the linker is
263
+ // looking for.
264
+ create_symlink (
265
+ & libgccjit_so,
266
+ output_dir. join ( & format ! ( "{}.0" , libgccjit_so_name) ) ,
267
+ )
268
+ }
269
+
193
270
fn download_gccjit_if_needed ( & mut self ) -> Result < ( ) , String > {
194
271
let output_dir = Path :: new (
195
272
std:: env:: var ( "CARGO_TARGET_DIR" )
@@ -206,6 +283,8 @@ impl ConfigInfo {
206
283
)
207
284
} ) ?;
208
285
let commit = content. trim ( ) ;
286
+ // This is a very simple check to ensure this is not a path. For the rest, it'll just fail
287
+ // when trying to download the file so we should be fine.
209
288
if commit. contains ( '/' ) || commit. contains ( '\\' ) {
210
289
return Err ( format ! (
211
290
"{}: invalid commit hash `{}`" ,
@@ -234,72 +313,7 @@ impl ConfigInfo {
234
313
let libgccjit_so_name = "libgccjit.so" ;
235
314
let libgccjit_so = output_dir. join ( libgccjit_so_name) ;
236
315
if !libgccjit_so. is_file ( ) && !self . no_download {
237
- // Download time!
238
- let tempfile_name = "libgccjit.so.download" ;
239
- let tempfile = output_dir. join ( tempfile_name) ;
240
- let is_in_ci = std:: env:: var ( "GITHUB_ACTIONS" ) . is_ok ( ) ;
241
-
242
- let url = format ! (
243
- "https://github.com/antoyo/gcc/releases/download/master-{}/libgccjit.so" ,
244
- commit,
245
- ) ;
246
-
247
- println ! ( "Downloading `{}`..." , url) ;
248
- // Try curl. If that fails and we are on windows, fallback to PowerShell.
249
- let mut ret = run_command_with_output (
250
- & [
251
- & "curl" ,
252
- & "--speed-time" ,
253
- & "30" ,
254
- & "--speed-limit" ,
255
- & "10" , // timeout if speed is < 10 bytes/sec for > 30 seconds
256
- & "--connect-timeout" ,
257
- & "30" , // timeout if cannot connect within 30 seconds
258
- & "-o" ,
259
- & tempfile_name,
260
- & "--retry" ,
261
- & "3" ,
262
- & "-SRfL" ,
263
- if is_in_ci { & "-s" } else { & "--progress-bar" } ,
264
- & url. as_str ( ) ,
265
- ] ,
266
- Some ( & output_dir) ,
267
- ) ;
268
- if ret. is_err ( ) && cfg ! ( windows) {
269
- eprintln ! ( "Fallback to PowerShell" ) ;
270
- ret = run_command_with_output (
271
- & [
272
- & "PowerShell.exe" ,
273
- & "/nologo" ,
274
- & "-Command" ,
275
- & "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;" ,
276
- & format ! (
277
- "(New-Object System.Net.WebClient).DownloadFile('{}', '{}')" ,
278
- url,
279
- tempfile_name,
280
- ) . as_str ( ) ,
281
- ] ,
282
- Some ( & output_dir) ,
283
- ) ;
284
- }
285
- ret?;
286
-
287
- // If we reach this point, it means the file was correctly downloaded, so let's
288
- // rename it!
289
- std:: fs:: rename ( & tempfile, & libgccjit_so) . map_err ( |err| {
290
- format ! (
291
- "Failed to rename `{}` into `{}`: {:?}" ,
292
- tempfile. display( ) ,
293
- libgccjit_so. display( ) ,
294
- err,
295
- )
296
- } ) ?;
297
-
298
- println ! ( "Downloaded libgccjit.so version {} successfully!" , commit) ;
299
- create_symlink (
300
- & libgccjit_so,
301
- output_dir. join ( & format ! ( "{}.0" , libgccjit_so_name) ) ,
302
- ) ?;
316
+ self . download_gccjit ( & output_dir, libgccjit_so_name, commit) ?;
303
317
}
304
318
305
319
self . gcc_path = output_dir. display ( ) . to_string ( ) ;
0 commit comments