at 18.03-beta 1.6 kB view raw
1https://gcc.gnu.org/ml/gcc-patches/2015-06/msg02210.html 2 3diff --git a/libcpp/macro.c b/libcpp/macro.c 4index 1e0a0b5..a52e3cb 100644 5--- a/libcpp/macro.c 6+++ b/libcpp/macro.c 7@@ -349,14 +349,38 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node) 8 slow on some systems. */ 9 time_t tt; 10 struct tm *tb = NULL; 11+ char *source_date_epoch; 12 13- /* (time_t) -1 is a legitimate value for "number of seconds 14- since the Epoch", so we have to do a little dance to 15- distinguish that from a genuine error. */ 16- errno = 0; 17- tt = time(NULL); 18- if (tt != (time_t)-1 || errno == 0) 19- tb = localtime (&tt); 20+ /* Allow the date and time to be set externally by an exported 21+ environment variable to enable reproducible builds. */ 22+ source_date_epoch = getenv ("SOURCE_DATE_EPOCH"); 23+ if (source_date_epoch) 24+ { 25+ errno = 0; 26+ tt = (time_t) strtol (source_date_epoch, NULL, 10); 27+ if (errno == 0) 28+ { 29+ tb = gmtime (&tt); 30+ if (tb == NULL) 31+ cpp_error (pfile, CPP_DL_ERROR, 32+ "SOURCE_DATE_EPOCH=\"%s\" is not a valid date", 33+ source_date_epoch); 34+ } 35+ else 36+ cpp_error (pfile, CPP_DL_ERROR, 37+ "SOURCE_DATE_EPOCH=\"%s\" is not a valid number", 38+ source_date_epoch); 39+ } 40+ else 41+ { 42+ /* (time_t) -1 is a legitimate value for "number of seconds 43+ since the Epoch", so we have to do a little dance to 44+ distinguish that from a genuine error. */ 45+ errno = 0; 46+ tt = time(NULL); 47+ if (tt != (time_t)-1 || errno == 0) 48+ tb = localtime (&tt); 49+ } 50 51 if (tb) 52 {