RFR: JDK-8244592 Start supporting SOURCE_DATE_EPOCH

Magnus Ihse Bursie magnus.ihse.bursie at oracle.com
Thu May 7 15:45:50 UTC 2020


On 2020-05-07 17:34, Erik Joelsson wrote:
> Looks good.
>
> What tools do we know are picking up this variable today?
gcc will use it when replacing the __DATE__ and __TIME__ macros. [1] I 
know of no other tools that use it, but that might just be my limited 
knowledge. That's the reason I used "updated" as the default method, to 
set it to the time of building, which would minimize any differences 
produced by tools.

/Magnus

[1] https://gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html
>
> /Erik
>
> On 2020-05-07 07:29, Magnus Ihse Bursie wrote:
>> As a part of the effort of creating a reproducible build, the build 
>> system should know about SOURCE_DATE_EPOCH and allow it to be set 
>> using different methods.
>>
>> This fix is needed to unblock JDK-8241616. With this patch, the 
>> SOURCE_DATE_EPOCH variable will be available in the environment 
>> during the build.
>>
>> I have added two options, --with-source-date and 
>> --enable-reproducible-build. The former controls what value 
>> SOURCE_DATE_EPOCH will get. The latter is a currently just a 
>> placeholder, but my intention is to continue adding functionality for 
>> making reproducible builds. (The reason that you might not always 
>> want to have reproducible builds enabled is that, for instance, one 
>> thing reproducible builds will do is set the timestamp for all 
>> created files, and this is not generally a good idea.) The idea is 
>> still that build changes that result in reproducible builds should be 
>> enabled always, if there is no downside to them.
>>
>> If --with-source-date is specified on the command line, 
>> --enable-reproducible-build will be turned on by default, otherwise 
>> it will be turned off.
>>
>> The --with-source-date option takes either a keyword option, an 
>> integer option, or a date/time string.
>> * If "updated" is specified (this is also the default), 
>> SOURCE_DATE_EPOCH will be set to the time when make is run.
>> * If "current" is specified, the value is "hard-coded" to the time 
>> when configure was run.
>> * If "version" is specified, the value is from DEFAULT_VERSION_DATE 
>> in make/autoconf/version-numbers is used. (This is probably not as 
>> good an idea as it might sound, but it can be used as a simple way to 
>> get the same value between different runs/points in time of the 
>> source code, but for the same version.)
>> * If an integer is used, that very number is used as the epoch-based 
>> timestamp.
>> * And finally, if an ISO-8059 date string (like "2020-05-07") is 
>> used, it will be converted to a timestamp. (On systems with GNU date, 
>> the parsing of the string is rather forgiving, on other systems 
>> (read: macOS) it will be more strict.)
>>
>> Finally, this patch carries two unrelated changes.
>> * In make/autoconf/jdk-version.m4, I noticed an error with the bash 
>> regexp (which I used as starting point for parsing the timestamp 
>> number). It would have accepted e.g. "123banana" as a number, but not 
>> 000 (even though 001 was accepted).
>> * In UTIL_ARG_ENABLE, I added a new argument IF_NOT_GIVEN. In the 
>> end, I did not need this, but I still think the functionality is 
>> worth keeping.
>>
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8244592
>> WebRev: 
>> http://cr.openjdk.java.net/~ihse/JDK-8244592-add-SOURCE_DATE_EPOCH/webrev.01
>>
>> /Magnus




More information about the build-dev mailing list