Add a script that builds a static Linux executable
scripts/build-static.sh builds the daemon for x86_64 Linux against musl, as one executable without dependencies to copy to a router. It finds a musl C compiler for jemalloc (musl-cross on macOS, musl-gcc on Linux), and uses its ar and ranlib too: with the host's, a build from macOS gets an empty libjemalloc.a and fails to link. It prints the revision and the SHA-256 of the result. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
361c48f656
commit
e1d819d629
2 files changed
+78
No files matched your search
@@ -57,6 +57,35 @@ To build and install the daemon:
|
|||||||
|
|
||||||
The command displays the installed version, for example `bgp 0.1.0`.
|
The command displays the installed version, for example `bgp 0.1.0`.
|
||||||
|
|
||||||
|
## Building a Static Executable
|
||||||
|
|
||||||
|
The script `scripts/build-static.sh` builds the daemon as a single static
|
||||||
|
executable for x86_64 Linux, linked against musl. The executable runs on any
|
||||||
|
x86_64 Linux distribution without other dependencies.
|
||||||
|
|
||||||
|
The script requires the Rust target and a musl C compiler for jemalloc:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rustup target add x86_64-unknown-linux-musl
|
||||||
|
```
|
||||||
|
|
||||||
|
On macOS, install the cross compiler with
|
||||||
|
`brew install FiloSottile/musl-cross/musl-cross`. On x86_64 Linux, install
|
||||||
|
`musl-tools` (Debian, Ubuntu) or `musl` (Arch Linux).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
scripts/build-static.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
The script displays the path of the executable, the source revision, and
|
||||||
|
the SHA-256 checksum of the executable:
|
||||||
|
|
||||||
|
```
|
||||||
|
target/x86_64-unknown-linux-musl/release/bgp: ELF 64-bit LSB pie executable, x86-64, static-pie linked
|
||||||
|
revision 9ce81a8
|
||||||
|
2faa32d3... target/x86_64-unknown-linux-musl/release/bgp
|
||||||
|
```
|
||||||
|
|
||||||
## Building a Container Image
|
## Building a Container Image
|
||||||
|
|
||||||
The `Dockerfile` in the repository builds the daemon in a Rust build stage
|
The `Dockerfile` in the repository builds the daemon in a Rust build stage
|
||||||
|
|||||||
Executable
+49
@@ -0,0 +1,49 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Builds the daemon as one static executable for x86_64 Linux, which runs
|
||||||
|
# on any x86_64 Linux distribution with nothing else installed.
|
||||||
|
#
|
||||||
|
# scripts/build-static.sh
|
||||||
|
#
|
||||||
|
# The executable is linked against musl, with jemalloc as the memory
|
||||||
|
# allocator (see bin/bgp/src/main.rs). jemalloc is C, so a C compiler for
|
||||||
|
# the target is needed as well as the Rust target:
|
||||||
|
#
|
||||||
|
# rustup target add x86_64-unknown-linux-musl
|
||||||
|
# macOS: brew install FiloSottile/musl-cross/musl-cross
|
||||||
|
# Debian, Ubuntu (on x86_64): apt-get install musl-tools
|
||||||
|
# Arch (on x86_64): pacman -S musl
|
||||||
|
set -eu
|
||||||
|
target=x86_64-unknown-linux-musl
|
||||||
|
repository="$(cd "$(dirname "$0")/.." && pwd)"
|
||||||
|
|
||||||
|
# The cross compiler from musl-cross, or musl's own wrapper on Linux.
|
||||||
|
if command -v x86_64-linux-musl-gcc >/dev/null; then
|
||||||
|
cc=x86_64-linux-musl-gcc
|
||||||
|
ar=x86_64-linux-musl-ar
|
||||||
|
ranlib=x86_64-linux-musl-ranlib
|
||||||
|
elif command -v musl-gcc >/dev/null; then
|
||||||
|
cc=musl-gcc
|
||||||
|
ar=ar
|
||||||
|
ranlib=ranlib
|
||||||
|
else
|
||||||
|
echo "No C compiler for $target: see the comment at the top of $0" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd "$repository"
|
||||||
|
# jemalloc is built by its own configure script, which looks for an
|
||||||
|
# archiver named after the target (x86_64-unknown-linux-musl-ar) and, not
|
||||||
|
# finding one, would take the host's: on macOS that one cannot index Linux
|
||||||
|
# objects, and the library comes out empty. So AR and RANLIB are named.
|
||||||
|
CC_x86_64_unknown_linux_musl=$cc \
|
||||||
|
AR_x86_64_unknown_linux_musl=$ar \
|
||||||
|
AR=$ar \
|
||||||
|
RANLIB=$ranlib \
|
||||||
|
CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=$cc \
|
||||||
|
cargo build --release --locked -p bgp --target "$target"
|
||||||
|
|
||||||
|
binary="target/$target/release/bgp"
|
||||||
|
echo
|
||||||
|
file "$binary"
|
||||||
|
echo "revision $(git rev-parse --short HEAD)$(git diff --quiet HEAD || echo ', with uncommitted changes')"
|
||||||
|
if command -v sha256sum >/dev/null; then sha256sum "$binary"; else shasum -a 256 "$binary"; fi
|
||||||
Reference in new issue
Block a user