Bug 252308
| Summary: | REGRESSION(256816@main): [CMake] Build not reproducible due to __TIMESTAMP__ macro in generated file | ||
|---|---|---|---|
| Product: | WebKit | Reporter: | Alberto Garcia <berto> |
| Component: | JavaScriptCore | Assignee: | Nobody <webkit-unassigned> |
| Status: | RESOLVED DUPLICATE | ||
| Severity: | Normal | CC: | alex.kanavin, bugs-noreply, emw, mcatanzaro |
| Priority: | P2 | ||
| Version: | WebKit Nightly Build | ||
| Hardware: | Unspecified | ||
| OS: | Unspecified | ||
| See Also: | https://bugs.webkit.org/show_bug.cgi?id=247622 | ||
Alberto Garcia
The JSCBytecodeCacheVersion.cpp file contains the __TIMESTAMP__ macro
which is replaced by the timestamp of the source file. This macro was
already being used in 2.38.x and earlier versions, but at least
building always from the same source tarball would produce the same
timestamp so it would not affect the reproducibility of the build.
However this is now generated by Source/JavaScriptCore/CMakeLists.txt
so the timestamp varies every time WebKit is compiled from the same
sources, making the build non-reproducible.
| Attachments | ||
|---|---|---|
| Add attachment proposed patch, testcase, etc. |
Michael Catanzaro
Indeed, __TIMESTAMP__ is only deterministic when the source file is not generated, because it's based on last modification of the source file. The new comment in JSCBytecodeCacheVersion.h is also wrong except on Apple ports.
The solution here should be to do the same thing Apple does: cat JSCBuiltins.o with CachedTypes.o and then hash that. They also use build version, but I'm not sure why and that can probably be ignored. This would likely be a good newcomers bug as it can be done entirely from CMake with no need to touch the source code files.
Elliott Williams
(In reply to Michael Catanzaro from comment #1)
> Indeed, __TIMESTAMP__ is only deterministic when the source file is not
> generated, because it's based on last modification of the source file. The
> new comment in JSCBytecodeCacheVersion.h is also wrong except on Apple ports.
>
> The solution here should be to do the same thing Apple does: cat
> JSCBuiltins.o with CachedTypes.o and then hash that.
> They also use build version, but I'm not sure why and that can probably be ignored.
We did this for extra safety, in case our production build environment was using a cached JSCBuiltins.o and CachedTypes.o *and* there was some binary incompatibility elsewhere in JSC.
> This would
> likely be a good newcomers bug as it can be done entirely from CMake with no
> need to touch the source code files.
FWIW, I tried to do the same change in CMake, and got stuck because the generated ninja build doesn't support inter-dependencies between object files in the same target. But I think we could make CMake hash the modification time relatively easy and restore the old semantics.
Michael Catanzaro
*** Bug 258517 has been marked as a duplicate of this bug. ***
Alexander Kanavin
To at least restore the binary reproducibility I made a PR where mtime of the generated file is set to the one it is generated from using 'touch -r':
https://github.com/WebKit/WebKit/pull/15293
Michael Catanzaro
*** This bug has been marked as a duplicate of bug 258517 ***