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

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

Commit messages:
 - Enable reproducible builds with SOURCE_DATE_EPOCH
 - 8238650: Allow to override buildDate with SOURCE_DATE_EPOCH

Changes: https://git.openjdk.java.net/jfx/pull/446/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jfx&pr=446&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8264449
  Stats: 36 lines in 3 files changed: 22 ins; 10 del; 4 mod
  Patch: https://git.openjdk.java.net/jfx/pull/446.diff
  Fetch: git fetch https://git.openjdk.java.net/jfx pull/446/head:pull/446

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

Reply via email to