On Fri, 7 Apr 2023 06:22:05 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 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

Reply via email to