53 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
		
		
			
		
	
	
			53 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| 
								 | 
							
								https://gcc.gnu.org/ml/gcc-patches/2015-06/msg02210.html
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								diff --git a/libcpp/macro.c b/libcpp/macro.c
							 | 
						||
| 
								 | 
							
								index 1e0a0b5..a52e3cb 100644
							 | 
						||
| 
								 | 
							
								--- a/libcpp/macro.c
							 | 
						||
| 
								 | 
							
								+++ b/libcpp/macro.c
							 | 
						||
| 
								 | 
							
								@@ -349,14 +349,38 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node)
							 | 
						||
| 
								 | 
							
								 	     slow on some systems.  */
							 | 
						||
| 
								 | 
							
								 	  time_t tt;
							 | 
						||
| 
								 | 
							
								 	  struct tm *tb = NULL;
							 | 
						||
| 
								 | 
							
								+	  char *source_date_epoch;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								-	  /* (time_t) -1 is a legitimate value for "number of seconds
							 | 
						||
| 
								 | 
							
								-	     since the Epoch", so we have to do a little dance to
							 | 
						||
| 
								 | 
							
								-	     distinguish that from a genuine error.  */
							 | 
						||
| 
								 | 
							
								-	  errno = 0;
							 | 
						||
| 
								 | 
							
								-	  tt = time(NULL);
							 | 
						||
| 
								 | 
							
								-	  if (tt != (time_t)-1 || errno == 0)
							 | 
						||
| 
								 | 
							
								-	    tb = localtime (&tt);
							 | 
						||
| 
								 | 
							
								+	  /* Allow the date and time to be set externally by an exported
							 | 
						||
| 
								 | 
							
								+	     environment variable to enable reproducible builds. */
							 | 
						||
| 
								 | 
							
								+	  source_date_epoch = getenv ("SOURCE_DATE_EPOCH");
							 | 
						||
| 
								 | 
							
								+	  if (source_date_epoch)
							 | 
						||
| 
								 | 
							
								+	    {
							 | 
						||
| 
								 | 
							
								+	      errno = 0;
							 | 
						||
| 
								 | 
							
								+	      tt = (time_t) strtol (source_date_epoch, NULL, 10);
							 | 
						||
| 
								 | 
							
								+	      if (errno == 0)
							 | 
						||
| 
								 | 
							
								+	        {
							 | 
						||
| 
								 | 
							
								+		  tb = gmtime (&tt);
							 | 
						||
| 
								 | 
							
								+		  if (tb == NULL)
							 | 
						||
| 
								 | 
							
								+		    cpp_error (pfile, CPP_DL_ERROR,
							 | 
						||
| 
								 | 
							
								+			       "SOURCE_DATE_EPOCH=\"%s\" is not a valid date",
							 | 
						||
| 
								 | 
							
								+			       source_date_epoch);
							 | 
						||
| 
								 | 
							
								+	        }
							 | 
						||
| 
								 | 
							
								+	      else
							 | 
						||
| 
								 | 
							
								+		cpp_error (pfile, CPP_DL_ERROR,
							 | 
						||
| 
								 | 
							
								+			   "SOURCE_DATE_EPOCH=\"%s\" is not a valid number",
							 | 
						||
| 
								 | 
							
								+			   source_date_epoch);
							 | 
						||
| 
								 | 
							
								+	    }
							 | 
						||
| 
								 | 
							
								+	  else
							 | 
						||
| 
								 | 
							
								+	    {
							 | 
						||
| 
								 | 
							
								+	    /* (time_t) -1 is a legitimate value for "number of seconds
							 | 
						||
| 
								 | 
							
								+	       since the Epoch", so we have to do a little dance to
							 | 
						||
| 
								 | 
							
								+	       distinguish that from a genuine error.  */
							 | 
						||
| 
								 | 
							
								+	    errno = 0;
							 | 
						||
| 
								 | 
							
								+	    tt = time(NULL);
							 | 
						||
| 
								 | 
							
								+	    if (tt != (time_t)-1 || errno == 0)
							 | 
						||
| 
								 | 
							
								+	      tb = localtime (&tt);
							 | 
						||
| 
								 | 
							
								+	  }
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 	  if (tb)
							 | 
						||
| 
								 | 
							
								 	    {
							 |