@@ -264,19 +264,37 @@ fn main() {
264
264
std:: env:: var_os ( "CARGO_MANIFEST_DIR" ) . expect ( "CARGO_MANIFEST_DIR should always be set" ) ,
265
265
) ;
266
266
267
+ let read_env_var_string = |name| read_env_var ( name) . unwrap ( ) . into_string ( ) . unwrap ( ) ;
268
+
269
+ // Keep in sync with `core_name_and_version!` in prefixed.rs.
270
+ let core_name_and_version = [
271
+ & read_env_var_string ( "CARGO_PKG_NAME" ) ,
272
+ "core" ,
273
+ & read_env_var_string ( "CARGO_PKG_VERSION_MAJOR" ) ,
274
+ & read_env_var_string ( "CARGO_PKG_VERSION_MINOR" ) ,
275
+ & read_env_var_string ( "CARGO_PKG_VERSION_PATCH" ) ,
276
+ & read_env_var_string ( "CARGO_PKG_VERSION_PRE" ) , // Often empty
277
+ ]
278
+ . join ( "_" ) ;
279
+ // Ensure `links` in Cargo.toml is consistent with the version.
280
+ assert_eq ! (
281
+ & read_env_var_string( "CARGO_MANIFEST_LINKS" ) ,
282
+ & core_name_and_version
283
+ ) ;
284
+
267
285
const RING_PREGENERATE_ASM : & str = "RING_PREGENERATE_ASM" ;
268
286
match read_env_var ( RING_PREGENERATE_ASM ) . as_deref ( ) {
269
287
Some ( s) if s == "1" => {
270
- pregenerate_asm_main ( & c_root_dir) ;
288
+ pregenerate_asm_main ( & c_root_dir, & core_name_and_version ) ;
271
289
}
272
- None => ring_build_rs_main ( & c_root_dir) ,
290
+ None => ring_build_rs_main ( & c_root_dir, & core_name_and_version ) ,
273
291
_ => {
274
292
panic ! ( "${} has an invalid value" , RING_PREGENERATE_ASM ) ;
275
293
}
276
294
}
277
295
}
278
296
279
- fn ring_build_rs_main ( c_root_dir : & Path ) {
297
+ fn ring_build_rs_main ( c_root_dir : & Path , core_name_and_version : & str ) {
280
298
use std:: env;
281
299
282
300
let out_dir = env:: var_os ( "OUT_DIR" ) . unwrap ( ) ;
@@ -320,7 +338,12 @@ fn ring_build_rs_main(c_root_dir: &Path) {
320
338
let generated_dir = if !is_git {
321
339
PathBuf :: from ( env:: var_os ( "CARGO_MANIFEST_DIR" ) . unwrap ( ) ) . join ( PREGENERATED )
322
340
} else {
323
- generate_sources_and_preassemble ( & out_dir, asm_target. into_iter ( ) , c_root_dir) ;
341
+ generate_sources_and_preassemble (
342
+ & out_dir,
343
+ asm_target. into_iter ( ) ,
344
+ c_root_dir,
345
+ core_name_and_version,
346
+ ) ;
324
347
out_dir. clone ( )
325
348
} ;
326
349
@@ -330,25 +353,31 @@ fn ring_build_rs_main(c_root_dir: &Path) {
330
353
& generated_dir,
331
354
c_root_dir,
332
355
& out_dir,
333
- & ring_core_prefix ( ) ,
356
+ core_name_and_version ,
334
357
) ;
335
358
emit_rerun_if_changed ( )
336
359
}
337
360
338
- fn pregenerate_asm_main ( c_root_dir : & Path ) {
361
+ fn pregenerate_asm_main ( c_root_dir : & Path , core_name_and_version : & str ) {
339
362
println ! ( "cargo:rustc-cfg=pregenerate_asm_only" ) ;
340
363
341
364
let pregenerated = c_root_dir. join ( PREGENERATED ) ;
342
365
std:: fs:: create_dir ( & pregenerated) . unwrap ( ) ;
343
- generate_sources_and_preassemble ( & pregenerated, ASM_TARGETS . iter ( ) , c_root_dir) ;
366
+ generate_sources_and_preassemble (
367
+ & pregenerated,
368
+ ASM_TARGETS . iter ( ) ,
369
+ c_root_dir,
370
+ core_name_and_version,
371
+ ) ;
344
372
}
345
373
346
374
fn generate_sources_and_preassemble < ' a > (
347
375
out_dir : & Path ,
348
376
asm_targets : impl Iterator < Item = & ' a AsmTarget > ,
349
377
c_root_dir : & Path ,
378
+ core_name_and_version : & str ,
350
379
) {
351
- generate_prefix_symbols_headers ( out_dir, & ring_core_prefix ( ) ) . unwrap ( ) ;
380
+ generate_prefix_symbols_headers ( out_dir, core_name_and_version ) . unwrap ( ) ;
352
381
353
382
let perl_exe = get_perl_exe ( ) ;
354
383
@@ -388,10 +417,8 @@ fn build_c_code(
388
417
generated_dir : & Path ,
389
418
c_root_dir : & Path ,
390
419
out_dir : & Path ,
391
- ring_core_prefix : & str ,
420
+ core_name_and_version : & str ,
392
421
) {
393
- println ! ( "cargo:rustc-env=RING_CORE_PREFIX={}" , ring_core_prefix) ;
394
-
395
422
let ( asm_srcs, obj_srcs) = if let Some ( asm_target) = asm_target {
396
423
let perlasm_src_dsts = perlasm_src_dsts ( generated_dir, asm_target) ;
397
424
@@ -433,21 +460,30 @@ fn build_c_code(
433
460
let test_srcs = RING_TEST_SRCS . iter ( ) . map ( PathBuf :: from) . collect :: < Vec < _ > > ( ) ;
434
461
435
462
let libs = [
436
- ( "" , & core_srcs[ ..] , & asm_srcs[ ..] , & obj_srcs[ ..] ) ,
437
- ( "test" , & test_srcs[ ..] , & [ ] , & [ ] ) ,
463
+ (
464
+ core_name_and_version,
465
+ & core_srcs[ ..] ,
466
+ & asm_srcs[ ..] ,
467
+ & obj_srcs[ ..] ,
468
+ ) ,
469
+ (
470
+ & ( String :: from ( core_name_and_version) + "_test" ) ,
471
+ & test_srcs[ ..] ,
472
+ & [ ] ,
473
+ & [ ] ,
474
+ ) ,
438
475
] ;
439
476
440
477
// XXX: Ideally, ring-test would only be built for `cargo test`, but Cargo
441
478
// can't do that yet.
442
479
libs. iter ( )
443
- . for_each ( |& ( lib_name_suffix, srcs, asm_srcs, obj_srcs) | {
444
- let lib_name = String :: from ( ring_core_prefix) + lib_name_suffix;
480
+ . for_each ( |& ( lib_name, srcs, asm_srcs, obj_srcs) | {
445
481
let srcs = srcs. iter ( ) . chain ( asm_srcs) ;
446
482
build_library (
447
483
target,
448
484
c_root_dir,
449
485
out_dir,
450
- & lib_name,
486
+ lib_name,
451
487
srcs,
452
488
generated_dir,
453
489
obj_srcs,
@@ -737,25 +773,16 @@ fn walk_dir(dir: &Path, cb: &impl Fn(&DirEntry)) {
737
773
}
738
774
}
739
775
740
- fn ring_core_prefix ( ) -> String {
741
- let links = std:: env:: var ( "CARGO_MANIFEST_LINKS" ) . unwrap ( ) ;
742
-
743
- let computed = {
744
- let name = std:: env:: var ( "CARGO_PKG_NAME" ) . unwrap ( ) ;
745
- let version = std:: env:: var ( "CARGO_PKG_VERSION" ) . unwrap ( ) ;
746
- name + "_core_" + & version. replace ( & [ '-' , '.' ] [ ..] , "_" )
747
- } ;
748
-
749
- assert_eq ! ( links, computed) ;
750
-
751
- links + "_"
752
- }
753
-
754
776
/// Creates the necessary header files for symbol renaming.
755
777
///
756
778
/// For simplicity, both non-Nasm- and Nasm- style headers are always
757
779
/// generated, even though local non-packaged builds need only one of them.
758
- fn generate_prefix_symbols_headers ( out_dir : & Path , prefix : & str ) -> Result < ( ) , std:: io:: Error > {
780
+ fn generate_prefix_symbols_headers (
781
+ out_dir : & Path ,
782
+ core_name_and_version : & str ,
783
+ ) -> Result < ( ) , std:: io:: Error > {
784
+ let prefix = & ( String :: from ( core_name_and_version) + "_" ) ;
785
+
759
786
generate_prefix_symbols_header ( out_dir, "prefix_symbols.h" , '#' , None , prefix) ?;
760
787
761
788
generate_prefix_symbols_header (
0 commit comments