On Mon, 22 Nov 2021 06:43:30 GMT, John Neffenger <jgn...@openjdk.org> wrote:

>> This pull request allows for reproducible builds of JavaFX on Linux, macOS, 
>> and Windows by defining the `SOURCE_DATE_EPOCH` environment variable. For 
>> example, the following commands create a reproducible build:
>> 
>> 
>> $ export SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)
>> $ bash gradlew sdk jmods javadoc
>> $ strip-nondeterminism -v -T $SOURCE_DATE_EPOCH build/jmods/*.jmod
>> 
>> 
>> The three commands:
>> 
>> 1. set the build timestamp to the date of the latest source code change,
>> 2. build the JavaFX SDK libraries, JMOD archives, and API documentation, and
>> 3. recreate the JMOD files with stable file modification times and ordering.
>> 
>> The third command won't be necessary once Gradle can build the JMOD archives 
>> or the `jmod` tool itself has the required support. For more information on 
>> the environment variable, see the [`SOURCE_DATE_EPOCH`][1] page. For more 
>> information on the command to recreate the JMOD files, see the 
>> [`strip-nondeterminism`][2] repository. I'd like to propose that we allow 
>> for reproducible builds in JavaFX 17 and consider making them the default in 
>> JavaFX 18.
>> 
>> #### Fixes
>> 
>> There are at least four sources of non-determinism in the JavaFX builds:
>> 
>> 1. Build timestamp
>> 
>>     The class `com.sun.javafx.runtime.VersionInfo` in the JavaFX Base module 
>> stores the time of the build. Furthermore, for builds that don't run on the 
>> Hudson continuous integration tool, the class adds the build time to the 
>> system property `javafx.runtime.version`.
>> 
>> 2. Modification times
>> 
>>     The JAR, JMOD, and ZIP archives store the modification time of each file.
>> 
>> 3. File ordering
>> 
>>     The JAR, JMOD, and ZIP archives store their files in the order returned 
>> by the file system. The native shared libraries also store their object 
>> files in the order returned by the file system. Most file systems, though, 
>> do not guarantee the order of a directory's file listing.
>> 
>> 4. Build path
>> 
>>     The class `com.sun.javafx.css.parser.Css2Bin` in the JavaFX Graphics 
>> module stores the absolute path of its `.css` input file in the 
>> corresponding `.bss` output file, which is then included in the JavaFX 
>> Controls module.
>> 
>> This pull request modifies the Gradle and Groovy build files to fix the 
>> first three sources of non-determinism. A later pull request can modify the 
>> Java files to fix the fourth.
>> 
>> [1]: https://reproducible-builds.org/docs/source-date-epoch/
>> [2]: https://salsa.debian.org/reproducible-builds/strip-nondeterminism
>
> John Neffenger has updated the pull request with a new target base due to a 
> merge or a rebase. The pull request now contains ten commits:
> 
>  - Get build timestamp in UTC and set ZIP timestamps
>    
>    Create the build timestamp as a zoned date and time in UTC instead
>    of a local date and time. If SOURCE_DATE_EPOCH is defined, set the
>    last modification time of ZIP and JAR entries to the local date and
>    time in UTC of the instant defined by SOURCE_DATE_EPOCH.
>    
>    Add a comment as a reminder to make JMOD files deterministic when
>    the following enhancements are complete:
>    
>    * Enable deterministic file content ordering for Jar and Jmod
>      https://bugs.openjdk.java.net/browse/JDK-8276764
>      https://github.com/openjdk/jdk/pull/6395
>    
>    * Enable jar and jmod to produce deterministic timestamped content
>      https://bugs.openjdk.java.net/browse/JDK-8276766
>      https://github.com/openjdk/jdk/pull/6481
>  - Merge branch 'master' into allow-reproducible-builds
>  - Make build of SDK ZIP bundle reproducible
>  - Merge branch 'master' into allow-reproducible-builds
>  - Merge branch 'master' into allow-reproducible-builds
>  - Include WebKit shared library for Windows
>    
>    Enable reproducible builds of the native WebKit shared library for
>    Windows (jfxwebkit.dll) when SOURCE_DATE_EPOCH is defined.
>  - Include media shared libraries for Windows
>    
>    Enable reproducible builds of the native media shared libraries for
>    Windows when SOURCE_DATE_EPOCH is defined. The libraries are:
>    
>      fxplugins.dll
>      glib-lite.dll
>      gstreamer-lite.dll
>      jfxmedia.dll
>  - Enable reproducible builds with SOURCE_DATE_EPOCH
>  - 8238650: Allow to override buildDate with SOURCE_DATE_EPOCH

Good news: starting today, the JDK can create reproducible builds of the JDK!

Specifically, JDK 19+21 includes [pull request 8478][1], which was the last 
reproducibility bug remaining in my JDK builds on Linux. JDK 19 also includes 
[pull request 6481][2], which is the change we need in JavaFX for reproducible 
JMOD archives.

Because the JMOD fix is in JDK 19 and JDK 17.0.3 but not JDK 18, we can either 
integrate this pull request now and add the one-line JMOD fix after we're 
building on JDK 19, or wait to integrate all of the changes after switching to 
JDK 19.

Most of the changes in this pull request are behind a big feature flag called 
`SOURCE_DATE_EPOCH`, so I think it's safe either way. In either case, we will 
still need to fix the build path problem (item number 4 in the first comment), 
and the problem with the JavaFX WebKit library `libjfxwebkit`, but I prefer to 
address those issues separately.

By the way, I'm hoping the WebKit problem might be [Bug 237506][3], "[GTK] 
generate-automation-atom.py breaks reproducible builds," but I really have no 
idea yet.

I'll push the commits that include the JMOD fix (commented out for now) and the 
merged updates from the *master* branch. I'm also doing another round of 
testing and will post the results shortly.

[1]: https://github.com/openjdk/jdk/pull/8478
[2]: https://github.com/openjdk/jdk/pull/6481
[3]: https://bugs.webkit.org/show_bug.cgi?id=237506

-------------

PR: https://git.openjdk.java.net/jfx/pull/446

Reply via email to