On Tue, 3 Jan 2023 00:21:53 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 17 commits:
> 
>  - Add '--date' argument for deterministic JMOD files
>  - Merge branch 'master' into allow-reproducible-builds
>  - Merge branch 'master' into allow-reproducible-builds
>  - Comment out 'jmod --date' until building on JDK 19
>    
>    Support for the 'jmod --date' option was added to JDK 19 starting
>    with the 19+2 early-access build, and it was backported to JDK 17
>    starting with release 17.0.3. It is not available in JDK 18.
>  - Merge 'master' into allow-reproducible-builds
>  - Make minimal changes for new '--date' option
>  - Add new '--date' option to JMOD task
>  - Add '--source-date' option to JMOD task
>  - 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
>  - ... and 7 more: https://git.openjdk.org/jfx/compare/a35c3bf7...1e4c083b

The results of my latest tests are shown below for each type of build:

| System  | Develop | Actions | Release | Notes                        |
|:-------:|:-------:|:-------:|:-------:| ---------------------------- |
| Linux   |    ✔    |    ✔    |    ❌    | Release build failed         |
| macOS   |    ✔    |    ❓    |    ❓    | Some shared libraries differ |
| Windows |    ✔    |    ✔    |    ❌    | Release build failed         |

where:

✔ means that the unit tests ran successfully and that the files in the `build` 
directory were identical between two builds in the same project directory on 
the same system,

❓ means there were random differences in the native shared libraries between 
the two builds, such as `libjavafx_iio.dylib`, `libglib-lite.dylib`, and 
`libjfxwebkit.dylib`, and

❌ means the build failed due to an error unrelated to this pull request.

The build types are defined by the Shell scripts in the repository 
[jgneff/jfxbuild][1]. The Release build failed on Linux because [libav.org is 
not resolving][2]. The Release build failed on Windows due to [compiler error 
C2327][3].

[1]: https://github.com/jgneff/jfxbuild
[2]: https://mail.openjdk.org/pipermail/openjfx-dev/2023-January/037808.html
[3]: https://mail.openjdk.org/pipermail/openjfx-dev/2023-January/037823.html

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

PR: https://git.openjdk.org/jfx/pull/446

Reply via email to