Add static binary release build script

- scripts/build-release.sh creates an opam switch with musl static linking - Builds, strips, and outputs binary to dist/ogit - Documents prerequisites (musl-gcc, opam) - Add dist/ to .gitignore

Commit
83945541473889dc07d3bdb00dd8dcc05ed62117
Author
Marius Peter <dev@marius-peter.com>
Author date
Committer
Marius Peter <dev@marius-peter.com>
Committer date
Changed files
.gitignore
index f566815f..f6c382ee 100644..100644
@@ -2,3 +2,4 @@
2 2
3 3 _build/
4 4 _opam/
5 Added: dist/
scripts/build-release.sh
index 00000000..01311377 000000..100755
@@ -0,0 +1,68 @@
1 Added: #!/bin/sh
2 Added: # Build a statically-linked ogit binary using musl.
3 Added: #
4 Added: # Prerequisites:
5 Added: # - opam (>= 2.1)
6 Added: # - musl-gcc (install musl-tools on Debian/Ubuntu, sys-libs/musl on Gentoo)
7 Added: # - A C compiler (gcc or clang)
8 Added: #
9 Added: # This script creates a dedicated opam switch with static musl compilation,
10 Added: # installs dependencies, builds, strips, and copies the binary to dist/.
11 Added: #
12 Added: # Usage:
13 Added: # ./scripts/build-release.sh
14 Added:
15 Added: set -eu
16 Added:
17 Added: SWITCH_NAME="ogit-static"
18 Added: OCAML_VERSION="5.2.1"
19 Added: PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
20 Added: DIST_DIR="${PROJECT_ROOT}/dist"
21 Added:
22 Added: # Verify musl-gcc is available
23 Added: if ! command -v musl-gcc >/dev/null 2>&1; then
24 Added: echo "ERROR: musl-gcc not found."
25 Added: echo " Debian/Ubuntu: apt install musl-tools"
26 Added: echo " Gentoo: emerge sys-libs/musl"
27 Added: echo " Fedora: dnf install musl-gcc"
28 Added: exit 1
29 Added: fi
30 Added:
31 Added: # Verify opam is available
32 Added: if ! command -v opam >/dev/null 2>&1; then
33 Added: echo "ERROR: opam not found. Install from https://opam.ocaml.org/doc/Install.html"
34 Added: exit 1
35 Added: fi
36 Added:
37 Added: echo "==> Creating opam switch '${SWITCH_NAME}' (if not exists)..."
38 Added: if ! opam switch list 2>/dev/null | grep -q "${SWITCH_NAME}"; then
39 Added: opam switch create "${SWITCH_NAME}" \
40 Added: --packages="ocaml-variants.${OCAML_VERSION}+options,ocaml-option-static,ocaml-option-musl" \
41 Added: --no-install
42 Added: fi
43 Added:
44 Added: echo "==> Installing dependencies..."
45 Added: opam install --switch="${SWITCH_NAME}" --deps-only --yes "${PROJECT_ROOT}"
46 Added:
47 Added: echo "==> Building..."
48 Added: opam exec --switch="${SWITCH_NAME}" -- dune build --root="${PROJECT_ROOT}" --force
49 Added:
50 Added: BINARY="${PROJECT_ROOT}/_build/default/bin/main.exe"
51 Added:
52 Added: if [ ! -f "${BINARY}" ]; then
53 Added: echo "ERROR: Build produced no binary at ${BINARY}"
54 Added: exit 1
55 Added: fi
56 Added:
57 Added: echo "==> Stripping binary..."
58 Added: strip "${BINARY}"
59 Added:
60 Added: echo "==> Copying to dist/..."
61 Added: mkdir -p "${DIST_DIR}"
62 Added: cp "${BINARY}" "${DIST_DIR}/ogit"
63 Added:
64 Added: echo ""
65 Added: echo "Done. Binary at: ${DIST_DIR}/ogit"
66 Added: echo ""
67 Added: file "${DIST_DIR}/ogit"
68 Added: ls -lh "${DIST_DIR}/ogit"