@@ -23,7 +23,7 @@ use crate::builder::{Builder, RunConfig, ShouldRun, Step};
23
23
use crate :: compile;
24
24
use crate :: tool:: { self , Tool } ;
25
25
use crate :: cache:: { INTERNER , Interned } ;
26
- use time;
26
+ use time:: { self , Timespec } ;
27
27
28
28
pub fn pkgname ( builder : & Builder , component : & str ) -> String {
29
29
if component == "cargo" {
@@ -528,7 +528,19 @@ impl Step for Rustc {
528
528
t ! ( fs:: create_dir_all( image. join( "share/man/man1" ) ) ) ;
529
529
let man_src = builder. src . join ( "src/doc/man" ) ;
530
530
let man_dst = image. join ( "share/man/man1" ) ;
531
- let month_year = t ! ( time:: strftime( "%B %Y" , & time:: now( ) ) ) ;
531
+
532
+ // Reproducible builds: If SOURCE_DATE_EPOCH is set, use that as the time.
533
+ let time = env:: var ( "SOURCE_DATE_EPOCH" )
534
+ . map ( |timestamp| {
535
+ let epoch = timestamp. parse ( ) . map_err ( |err| {
536
+ format ! ( "could not parse SOURCE_DATE_EPOCH: {}" , err)
537
+ } ) . unwrap ( ) ;
538
+
539
+ time:: at ( Timespec :: new ( epoch, 0 ) )
540
+ } )
541
+ . unwrap_or_else ( |_| time:: now ( ) ) ;
542
+
543
+ let month_year = t ! ( time:: strftime( "%B %Y" , & time) ) ;
532
544
// don't use our `bootstrap::util::{copy, cp_r}`, because those try
533
545
// to hardlink, and we don't want to edit the source templates
534
546
for file_entry in builder. read_dir ( & man_src) {
0 commit comments