diff options
| author | Bitflash <btf01@proton.me> | 2026-07-29 16:33:02 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-07-29 16:33:02 -0300 |
| commit | c404e1c7f5d3f04d07e7e5b35a7a8ffcc998d855 (patch) | |
| tree | 314935e341d2e6fe0d6cd927e01efbb87b74df36 /Makefile | |
| parent | ab24958f1470cb62a4637126345fdf14c2ec0bd4 (diff) | |
build: headless Linux node that does not need libGL (#37)
The GUI build requires libGL at load time even when started with -nogui. The
dynamic loader resolves every dependency before main() runs, so the flag arrives
far too late -- on a clean server the binary dies with
error while loading shared libraries: libGL.so.1: cannot open shared object file
and nothing suggests it would otherwise have worked. A server is where a node
most naturally lives, so this is the deployment that mattered most and the one
that failed. The AppImage additionally needs FUSE, which minimal servers lack.
Bundling libGL into the AppImage would be the wrong fix: GL has to come from the
host's driver stack, and shipping our own breaks machines that have a real GPU.
So: a second binary, built from the same node objects without ImGui, GLFW or
OpenGL. `make linux-node` produces bitflash-node-<version>-x86_64, 2.5 MB
stripped, with no graphics or FUSE dependency at all. `make linux` now builds it
alongside the AppImage. Anyone wanting a window keeps using the AppImage.
Two small moves were needed. MainFrameRepaint is called from main.cpp and
net.cpp but defined in gui.cpp, so headless.cpp provides an empty one rather
than putting ifdefs at six call sites. DateTimeStr also lived in gui.cpp while
main.cpp logs block times with it -- nothing about formatting a date is GUI
work, so it moved to util.cpp and both builds share one definition.
Verified on Debian 13:
ldd bitflash-node | grep -iE 'libGL|glfw|X11' -> nothing
ldd bitflash | grep -iE 'libGL|glfw' -> libglfw.so.3, libGL.so.1, libGLdispatch.so.0
and at runtime, from an empty datadir:
btfseed: reached ygffz37...btf via 90.156.222.107:8434
rendezvous: registered at 90.156.222.107:8434, waiting for a dial
self-resolve OK (meeting_node=90.156.222.107:8434)
btfpeers: kept 15 of 15 descriptor(s)
first block at ~30s, 3182 blocks accepted, synced to the tip
The GUI builds on Linux and Windows were rebuilt and are unaffected.
Diffstat (limited to 'Makefile')
| -rw-r--r-- | Makefile | 12 |
1 files changed, 12 insertions, 0 deletions
| @@ -15,6 +15,18 @@ linux: deps-linux | |||
| 15 | $(MAKE) -C src -f Makefile -j$(NPROC) | 15 | $(MAKE) -C src -f Makefile -j$(NPROC) |
| 16 | strip src/bitflash | 16 | strip src/bitflash |
| 17 | $(MAKE) -f Makefile appimage | 17 | $(MAKE) -f Makefile appimage |
| 18 | $(MAKE) -f Makefile linux-node | ||
| 19 | |||
| 20 | # Headless node, no ImGui/GLFW/OpenGL. The GUI build needs libGL present at load | ||
| 21 | # time even when started with -nogui -- the dynamic loader resolves everything | ||
| 22 | # before main() runs, so the flag comes far too late. On a clean server, which is | ||
| 23 | # where a node most naturally lives, that is a hard failure. This binary has no | ||
| 24 | # such dependency and needs no FUSE either, so it drops onto a VPS and runs. | ||
| 25 | linux-node: deps-linux | ||
| 26 | $(MAKE) -C src -f Makefile bitflash-node -j$(NPROC) | ||
| 27 | strip src/bitflash-node | ||
| 28 | cp src/bitflash-node bitflash-node-$(VERSION)-x86_64 | ||
| 29 | @echo "Built: bitflash-node-$(VERSION)-x86_64" | ||
| 18 | 30 | ||
| 19 | deps-linux: deps-apt deps-secp256k1 deps-randomx | 31 | deps-linux: deps-apt deps-secp256k1 deps-randomx |
| 20 | 32 | ||