mirror of
https://github.com/XTXMarkets/ternfs.git
synced 2026-01-03 01:19:51 -06:00
...most notably we now produce fully static binaries in an alpine
image.
A few assorted thoughts:
* I really like static binaries, ideally I'd like to run EggsFS
deployments with just systemd scripts and a few binaries.
* Go already does this, which is great.
* C++ does not, which is less great.
* Linking statically against `glibc` works, but is unsupported.
Not only stuff like NSS (which `gethostbyname` requires)
straight up does not work, unless you build `glibc` with
unsupported and currently apparently broken flags
(`--enable-static-nss`), but also other stuff is subtly
broken (I couldn't remember exactly what was broken,
but see comments such as
<https://github.com/haskell/haskell-language-server/issues/2431#issuecomment-985880838>).
* So we're left with alternative libcs -- the most popular being
musl.
* The simplest way to build a C++ application using musl is to just
build on a system where musl is already the default libc -- such
as alpine linux.
The backtrace support is in a bit of a bad state. Exception stacktraces
work on musl, but DWARF seems to be broken on the normal release build.
Moreover, libunwind doesn't play well with musl's signal handler:
<https://maskray.me/blog/2022-04-10-unwinding-through-signal-handler>.
Keeping it working seems to be a bit of a chore, and I'm going to revisit
it later.
In the meantime, gdb stack traces do work fine.
29 lines
882 B
Python
Executable File
29 lines
882 B
Python
Executable File
#!/usr/bin/env python3
|
|
import sys
|
|
import os
|
|
from pathlib import Path
|
|
import subprocess
|
|
|
|
if len(sys.argv) < 2:
|
|
print(f'Usage: {sys.argv[0]} release|alpine|sanitized|debug|valgrind [NINJA_ARG ...]', file=sys.stderr)
|
|
sys.exit(2)
|
|
|
|
if len(sys.argv) == 1:
|
|
build_type = 'alpine'
|
|
else:
|
|
build_type = sys.argv[1]
|
|
|
|
cpp_dir = Path(__file__).parent
|
|
build_dir = cpp_dir / 'build' / build_type
|
|
build_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
if build_type == 'alpine' and 'IN_EGGS_BUILD_CONTAINER' not in os.environ:
|
|
subprocess.run(
|
|
['docker', 'run', '-i', '--mount', f'type=bind,src={cpp_dir},dst=/eggsfs', 'REDACTED', '/eggsfs/build.py', 'alpine'],
|
|
check=True,
|
|
)
|
|
else:
|
|
os.chdir(str(build_dir))
|
|
subprocess.run(['cmake', '-G', 'Ninja', f'-DCMAKE_BUILD_TYPE={build_type}', '../..'], check=True)
|
|
subprocess.run(['ninja'] + sys.argv[2:], check=True)
|