Skip to main content

max / alloy

4.2 KB · 94 lines History Blame Raw
1 %global debug_package %{nil}
2
3 # Timestamps here are a constant, not the clock.
4 #
5 # Fedora sets %%source_date_epoch_from_changelog by default and this spec had no
6 # %%changelog, so SOURCE_DATE_EPOCH went unset and every build stamped BUILDTIME
7 # and every file mtime with the second rpmbuild happened to run. MEASURED
8 # 2026-08-26: two builds of the same binary, seconds apart, produced RPMs that
9 # differ. rpmbuild said so on every build too, in a warning nobody read.
10 #
11 # It defeats what build/rpm is for downstream. A rebuild lockfile that pins the
12 # config exactly (GoingsOn 6e1f433a) would still hand back a different RPM every
13 # run, and a mirrored layered set (7ee5a694) could not tell a re-cut package from
14 # a changed one.
15 #
16 # So the %%changelog at the bottom carries a date, not a history. The date is
17 # fixed on purpose and nothing reads the entry as a log: what changed between two
18 # builds is the version, and the version is in the file name. The clamp that
19 # applies it to file mtimes is already Fedora's default; using it for BUILDTIME
20 # as well is not, hence the line below.
21 %global use_source_date_epoch_as_buildtime 1
22
23 Name: shop
24 Version: %{shop_version}
25 Release: 1%{?dist}
26 Summary: Alloy's terminal
27 License: MIT
28 URL: https://makenot.work/git/max/shop
29
30 # Handed in through the buildroot rather than compiled here, same as the
31 # console's spec and for the same reason: the Containerfile's rust-build stage
32 # is the single definition of how shop is built, holding the revision pin, the
33 # `--locked` graph and the -devel packages it links against. A %%build here
34 # would be a second definition, and the two would drift toward whichever one
35 # ran last. See build/rpm/alloy.spec for the longer version.
36 Source0: shop
37
38 # Explicit, because the automatic scan is wrong in both directions here.
39 #
40 # Too strict on what it sees: left on, rpm requires the exact soname set of
41 # whatever host built the binary, which is a package that refuses to install
42 # across a Fedora minor bump.
43 #
44 # And blind to most of what shop actually needs. Only fontconfig and
45 # libxkbcommon are linked; the Wayland and GPU libraries are opened at runtime
46 # through dlopen, so they appear in no ELF header and a scan cannot see them at
47 # all. Measured on the built binary rather than read off the manifest: `ldd`
48 # names libfontconfig.so.1 and libxkbcommon.so.0, and the dlopen strings name
49 # libwayland-client.so.0, libwayland-egl.so.1, libvulkan.so.1 and libEGL.so.1.
50 #
51 # By package name rather than by soname, because a soname dependency is
52 # arch-qualified — `libwayland-client.so.0()(64bit)` — and this spec is built
53 # on both x86_64 and aarch64 hosts. The package names are the same on both.
54 #
55 # Both GPU backends are required, not just Vulkan. wgpu is configured with
56 # `vulkan` and `gles` together on purpose (Containerfile, SHOP_REV region): GLES
57 # through libEGL is what keeps a machine with no Vulkan driver in a working
58 # terminal, and a terminal is the one component whose absence has no recovery
59 # path from inside the session. libwayland-egl is that path's other half.
60 AutoReqProv: no
61 Requires: glibc
62 Requires: libgcc
63 Requires: fontconfig
64 Requires: libxkbcommon
65 Requires: libwayland-client
66 Requires: libwayland-egl
67 Requires: vulkan-loader
68 Requires: libglvnd-egl
69
70 %description
71 shop, Alloy's terminal: Wayland-only, GPU-accelerated, and the binary sway
72 binds $mod+Return to.
73
74 Packaged so a fix can reach an installed machine without rebuilding an ISO and
75 writing a drive (GoingsOn task d866e125).
76
77 This package must never be part of a base image. A component the base carries
78 cannot be replaced client-side, and a file copied into /usr/bin owned by no
79 package is the worst shape of all: layering over it does not fail to depsolve,
80 it dies in checkout with "File exists". shop is layered at install time and it
81 stays layered. Measured in build/layertest.
82
83 %install
84 mkdir -p %{buildroot}%{_bindir}
85 install -m 0755 %{SOURCE0} %{buildroot}%{_bindir}/shop
86
87 %files
88 %{_bindir}/shop
89
90 %changelog
91 * Wed Aug 26 2026 Make Creative <info@makenot.work> - 0-0
92 - The date above is the package epoch, fixed so two builds of one binary
93 produce one RPM. See the header; this is not a change log.
94