#1145394 hyprland regressed in reproducibility

#1145394#5
Date:
2026-08-24 14:24:49 UTC
From:
To:
Hi,

src:hyprland in unstable can't migrate to testing because the QA
infrastructure couldn't reproduce some binary packages in
unstable while it could reproduce the version in testing [1, 2].

From the diff it looks like some randomness is compiled in, maybe due to
some auto generated source code? Based on the diff to -1 it could also
be in one of the build dependencies.

Feel free to reach out if you need help debugging the problem but I
assume it will not be easy. Alternatively you can ask the release team
for an exception [3].

Cheers Jochen


[1] https://qa.debian.org/excuses.php?package=hyprland
[2] https://lists.debian.org/debian-devel-announce/2026/05/msg00001.html
[3] https://lists.debian.org/debian-devel/2026/05/msg00383.html

#1145394#10
Date:
2026-08-25 02:40:55 UTC
From:
To:
Heya,

Yeah it's been happening a while. I've inspected the diffoscope but
can't tell what's going on because the diff is so huge.

From my testing it looks like there are just two variants of hyprland
binaries that gets produced, rather than randomness that does not
resolve -- clicking rebuild once or twice makes it succeed.

We could really use help debugging this issue, because a bunch of us in
the team have tried to take a look at it and not figured out what's
going on.

#1145394#15
Date:
2026-08-25 02:40:55 UTC
From:
To:
Heya,

Yeah it's been happening a while. I've inspected the diffoscope but
can't tell what's going on because the diff is so huge.

From my testing it looks like there are just two variants of hyprland
binaries that gets produced, rather than randomness that does not
resolve -- clicking rebuild once or twice makes it succeed.

We could really use help debugging this issue, because a bunch of us in
the team have tried to take a look at it and not figured out what's
going on.

#1145394#20
Date:
2026-08-29 15:48:46 UTC
From:
To:
Hi,

* Chow Loong Jin <hyperair@debian.org> [2026-08-25 10:40]:

I did two test builds locally and got different results in:

build/CMakeFiles/hyprland_lib.dir/src/managers/fullscreen/FullscreenController.cpp.o
build/CMakeFiles/hyprland_lib.dir/src/plugins/PluginAPI.cpp.o
build/CMakeFiles/hyprland_lib.dir/src/protocols/XDGShell.cpp.o

For all of them the start of section headers, as reported by readelf -a
was different, as well as all addresses based on that. I tried rerunning
the gcc commands for those but all produced the same result and building
the package again also produced the same result. I also did not find
anything relevant that could explain the different offset so currently I
am stuck here.

Do you have any idea how to trigger different results or why the offset
would be different?

Cheers Jochen

#1145394#25
Date:
2026-09-02 10:40:18 UTC
From:
To:
Thanks for the help! I hadn't gotten as far as examining the individual
object files, but I did do some testing locally, here are my findings:
 - sbuild multiple times from the git packaging seems to generate the same
   binaries (including dbgsym)
 - debrebuild seems to generate a different NT_GNU_BUILD_ID value every
   time, but no other changes in the Hyprland binary itself.
 - diffing the output of `readelf --all usr/bin/Hyprland` and `objdump
   --disassemble usr/bin/Hyprland` of each variant shows that only the
   build ID changes, nothing else
 - diffing the output of `readelf --all --debug-dump` on the debug shows
   a lot of different offsets, but the diff output is 3.2GB and I
   haven't managed to figure out what's different apart from offsets.

Since you've managed to get to different variants of the build
directory, are you able to checksum all the files there and see what
other files are different? There should be some autogenerated sources in

 - src/protocols (generated by protocolnew calls in CMakeLists.txt)
 - src/config/lua/DefaultConfigBytes.hpp (generated by xxd from
   hyprland.lua)
 - src/render/shaders/Shaders.hpp (generated by
   scripts/generateShaderIncludes.sh, also see
   Fix-shader-inclusion-order.patch)

How were you able to grab the build directory out, btw? I haven't found
a way to do so with `debrebuild`.

#1145394#30
Date:
2026-09-02 11:31:23 UTC
From:
To:
* Chow Loong Jin <hyperair@debian.org> [2026-09-02 18:40]:

That sounds strange as debrebuild is only calling sbuild. Do you call
debrebuild with the buildinfo from your sbuild run?
How exactly do you call sbuild and debrebuild?

That seems consistent with my findings. The question is why the offsets
are different. My next step would be to safe all input files to the gcc
call and check if we can reproduce the different offsets by calling gcc
alone. Could you try this?

Files hyprland-0.56.2+ds.1/build/CMakeFiles/4.3.4/CMakeDetermineCompilerABI_C.bin and hyprland-0.56.2+ds/build/CMakeFiles/4.3.4/CMakeDetermineCompilerABI_C.bin differ
Files hyprland-0.56.2+ds.1/build/CMakeFiles/4.3.4/CMakeDetermineCompilerABI_CXX.bin and hyprland-0.56.2+ds/build/CMakeFiles/4.3.4/CMakeDetermineCompilerABI_CXX.bin differ
Files hyprland-0.56.2+ds.1/build/CMakeFiles/CMakeConfigureLog.yaml and hyprland-0.56.2+ds/build/CMakeFiles/CMakeConfigureLog.yaml differ
Files hyprland-0.56.2+ds.1/build/CMakeFiles/hyprland_lib.dir/cmake_pch.hxx.gch and hyprland-0.56.2+ds/build/CMakeFiles/hyprland_lib.dir/cmake_pch.hxx.gch differ
Files hyprland-0.56.2+ds.1/build/CMakeFiles/hyprland_lib.dir/src/managers/fullscreen/FullscreenController.cpp.o and hyprland-0.56.2+ds/build/CMakeFiles/hyprland_lib.dir/src/managers/fullscreen/FullscreenController.cpp.o differ
Files hyprland-0.56.2+ds.1/build/CMakeFiles/hyprland_lib.dir/src/plugins/PluginAPI.cpp.o and hyprland-0.56.2+ds/build/CMakeFiles/hyprland_lib.dir/src/plugins/PluginAPI.cpp.o differ
Files hyprland-0.56.2+ds.1/build/CMakeFiles/hyprland_lib.dir/src/protocols/XDGShell.cpp.o and hyprland-0.56.2+ds/build/CMakeFiles/hyprland_lib.dir/src/protocols/XDGShell.cpp.o differ
Files hyprland-0.56.2+ds.1/build/dumpabiver and hyprland-0.56.2+ds/build/dumpabiver differ
Files hyprland-0.56.2+ds.1/build/Hyprland and hyprland-0.56.2+ds/build/Hyprland differ
Files hyprland-0.56.2+ds.1/build/libhyprland_lib.a and hyprland-0.56.2+ds/build/libhyprland_lib.a differ
Files hyprland-0.56.2+ds.1/debian/.debhelper/hyprland/dbgsym-build-ids and hyprland-0.56.2+ds/debian/.debhelper/hyprland/dbgsym-build-ids differ
Files hyprland-0.56.2+ds.1/debian/.debhelper/hyprland/dbgsym-root/DEBIAN/control and hyprland-0.56.2+ds/debian/.debhelper/hyprland/dbgsym-root/DEBIAN/control differ
Files hyprland-0.56.2+ds.1/debian/.debhelper/hyprland/dbgsym-root/DEBIAN/md5sums and hyprland-0.56.2+ds/debian/.debhelper/hyprland/dbgsym-root/DEBIAN/md5sums differ
Only in hyprland-0.56.2+ds/debian/.debhelper/hyprland/dbgsym-root/usr/lib/debug/.build-id: 39
Only in hyprland-0.56.2+ds.1/debian/.debhelper/hyprland/dbgsym-root/usr/lib/debug/.build-id: f8
Files hyprland-0.56.2+ds.1/debian/hyprland/DEBIAN/md5sums and hyprland-0.56.2+ds/debian/hyprland/DEBIAN/md5sums differ
Files hyprland-0.56.2+ds.1/debian/hyprland/usr/bin/hyprland and hyprland-0.56.2+ds/debian/hyprland/usr/bin/hyprland differ
Files hyprland-0.56.2+ds.1/debian/hyprland/usr/bin/Hyprland and hyprland-0.56.2+ds/debian/hyprland/usr/bin/Hyprland differ
Files hyprland-0.56.2+ds.1/debian/tmp/usr/bin/Hyprland and hyprland-0.56.2+ds/debian/tmp/usr/bin/Hyprland differ

I actually just compile on my normal system but you can do it in sbuild
and debrebuild with this in your sbuild.conf:

$external_commands = {"post-build-commands" => [ [ '%e tar c %p > snapshot.tar' ] ]};

Cheers Jochen