RFR: 8264449: Enable reproducible builds with SOURCE_DATE_EPOCH [v13]
John Neffenger
jgneff at openjdk.org
Wed Apr 26 04:18:23 UTC 2023
On Fri, 7 Apr 2023 06:22:05 GMT, John Neffenger <jgneff at 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 incrementally with one additional commit since the last revision:
>
> Revert format of timestamp in version OPT field
I solved the build failure occurring on Windows by downgrading to Visual Studio 2022 [Build Tools version 17.1.0][1], dated February 15, 2022, from the prior version 17.5.4 that I was using. I opened a bug report, linked below, as a *heads-up* for when we upgrade Visual Studio.
I'm now using the following versions of the tools:
#### Toolchains
* **Linux:** gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
* **macOS:** Command Line Tools for Xcode 14.2 version 14.2.0.0.1.1668646533
* **Windows:** Visual Studio Build Tools 2022 version 17.1.0, build number 17.1.32210.238
#### Build Tools
* **JDK:** OpenJDK Runtime Environment (build 19.0.2+7-44)
* **Ant:** Apache Ant(TM) version 1.10.13 compiled on January 4 2023
* **CMake:** cmake version 3.26.3
My latest test results are:
| System | Develop | Actions | Release | Notes |
|:-------:|:-------:|:-------:|:-------:| ------------------------- |
| Linux | ✔ | ✔ | ❌ | `libjfxwebkit.so` differs |
| macOS | ✔ | ✔ | ✔ | Just luck, I suspect. |
| Windows | ✔ | ✔ | ❌ | `jfxwebkit.dll` differs |
where:
* ✔ means that all of the files in the `build` directory were identical between the two consecutive builds, and the unit tests ran successfully, while
* ❌ means that there were differences in the native libraries between the two builds.
I created bug reports to track each of the remaining potential problems:
* [JDK-8306884][2]: Building WebKit on Linux is not deterministic
* [JDK-8306885][3]: Building WebKit on Windows is not deterministic
* [JDK-8306886][4]: Building macOS libraries can be non-deterministic
* [JDK-8306887][5]: Error C2327 while compiling WebKit on Windows
[1]: https://learn.microsoft.com/en-us/visualstudio/releases/2022/release-history#fixed-version-bootstrappers
[2]: https://bugs.openjdk.org/browse/JDK-8306884
[3]: https://bugs.openjdk.org/browse/JDK-8306885
[4]: https://bugs.openjdk.org/browse/JDK-8306886
[5]: https://bugs.openjdk.org/browse/JDK-8306887
-------------
PR Comment: https://git.openjdk.org/jfx/pull/446#issuecomment-1522741112
More information about the openjfx-dev
mailing list