aboutsummaryrefslogtreecommitdiffstats
path: root/packaging/build/build-packages.sh
blob: ccacb811243c0a699619f5c76cd6906f0ae5bfcd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/usr/bin/env bash
# Build all MeshBay packages for the current platform.
#
# Usage:
#   ./build-packages.sh              # auto-detect format (deb on Ubuntu, rpm on Fedora)
#   ./build-packages.sh deb          # force .deb
#   ./build-packages.sh rpm          # force .rpm
#   ./build-packages.sh deb --arm64  # arm64 .deb (Pi)
#
# Expects to run on the target machine:
#   - Ubuntu 26.04 (cbesson@meshbay.org) for .deb amd64
#   - Fedora 44 (local) for .rpm x86_64
#   - Raspberry Pi for .deb arm64 (deferred)
#
# Output: packages in $STAGING/out/
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO="$(cd "$SCRIPT_DIR/../.." && pwd)"
STAGING="${MESHBAY_BUILD_DIR:-/tmp/meshbay-build}"
OUT="$STAGING/out"

# --- Detect format --------------------------------------------------------
FORMAT="${1:-auto}"
shift 2>/dev/null || true
ARM64_FLAG=""
for arg in "$@"; do
    [ "$arg" = "--arm64" ] && ARM64_FLAG="--arm64"
done

if [ "$FORMAT" = "auto" ]; then
    if [ -f /etc/debian_version ]; then
        FORMAT="deb"
    elif [ -f /etc/fedora-release ] || [ -f /etc/redhat-release ]; then
        FORMAT="rpm"
    else
        echo "!! Cannot detect OS — pass 'deb' or 'rpm' as argument" >&2
        exit 1
    fi
fi

ARCH=$(dpkg --print-architecture 2>/dev/null || rpm --eval '%{_arch}' 2>/dev/null || uname -m)
if [ -n "$ARM64_FLAG" ]; then
    ARCH="arm64"
fi

VERSION=$(python3 -c "
import tomllib, pathlib
p = pathlib.Path('$REPO/packages/meshbay-common/pyproject.toml')
print(tomllib.loads(p.read_text())['project']['version'])
")

echo "========================================"
echo "  MeshBay $VERSION — $FORMAT $ARCH"
echo "========================================"
echo "  Repo:    $REPO"
echo "  Staging: $STAGING"
echo "  Output:  $OUT"
echo ""

rm -rf "$OUT"
mkdir -p "$OUT"

# --- Step 1: Build staging trees ------------------------------------------

echo "--- [1/4] meshbay-common (shared venv + all deps) ---"
bash "$SCRIPT_DIR/build-common.sh" "$STAGING"

echo ""
echo "--- [2/4] meshbay-hub ---"
bash "$SCRIPT_DIR/build-hub.sh" "$STAGING"

echo ""
echo "--- [3/4] meshbay-node ---"
bash "$SCRIPT_DIR/build-node.sh" "$STAGING"

echo ""
echo "--- [4/4] meshbay-client ---"
bash "$SCRIPT_DIR/build-client.sh" "$STAGING" $ARM64_FLAG

# --- Step 2: Package ------------------------------------------------------

echo ""
echo "--- Packaging ($FORMAT) ---"

if [ "$FORMAT" = "deb" ]; then
    build_deb() {
        local pkg="$1"
        local root="$STAGING/${pkg}-root"
        local deb_src="$REPO/packaging/deb/$pkg/DEBIAN"
        local deb_dir="$root/DEBIAN"

        mkdir -p "$deb_dir"
        for f in "$deb_src"/*; do
            [ -f "$f" ] || continue
            sed -e "s/__VERSION__/$VERSION/g" \
                -e "s/__ARCH__/$ARCH/g" \
                "$f" > "$deb_dir/$(basename "$f")"
            chmod 755 "$deb_dir/$(basename "$f")" 2>/dev/null || true
        done
        # control files should be 644, scripts 755
        [ -f "$deb_dir/control" ] && chmod 644 "$deb_dir/control"
        [ -f "$deb_dir/conffiles" ] && chmod 644 "$deb_dir/conffiles"

        dpkg-deb --build --root-owner-group "$root" "$OUT/${pkg}_${VERSION}_${ARCH}.deb"
        echo "    -> $OUT/${pkg}_${VERSION}_${ARCH}.deb"
    }

    build_deb meshbay-common
    build_deb meshbay-hub
    build_deb meshbay-node
    build_deb meshbay-client

elif [ "$FORMAT" = "rpm" ]; then
    RPMBUILD_DIR="$STAGING/rpmbuild"
    rm -rf "$RPMBUILD_DIR"
    mkdir -p "$RPMBUILD_DIR"/{SPECS,SOURCES,BUILD,RPMS,SRPMS}

    build_rpm() {
        local pkg="$1"
        local spec="$REPO/packaging/rpm/${pkg}.spec"
        local root="$STAGING/${pkg}-root"

        # Substitute version and pass the staging root as a macro
        sed "s/__VERSION__/$VERSION/g" "$spec" > "$RPMBUILD_DIR/SPECS/${pkg}.spec"

        rpmbuild \
            --define "_topdir $RPMBUILD_DIR" \
            --define "_staging_root $root" \
            -bb "$RPMBUILD_DIR/SPECS/${pkg}.spec" 2>&1 | tail -5

        local rpm_file
        rpm_file=$(find "$RPMBUILD_DIR/RPMS" -name "${pkg}-${VERSION}*.rpm" -print -quit)
        if [ -n "$rpm_file" ]; then
            cp "$rpm_file" "$OUT/"
            echo "    -> $OUT/$(basename "$rpm_file")"
        fi
    }

    build_rpm meshbay-common
    build_rpm meshbay-hub
    build_rpm meshbay-node
    build_rpm meshbay-client
fi

# --- Summary --------------------------------------------------------------
echo ""
echo "========================================"
echo "  Build complete"
echo "========================================"
ls -lh "$OUT"/
echo ""
echo "Install order:"
echo "  1. meshbay-common"
echo "  2. meshbay-hub and/or meshbay-node"
echo "  3. meshbay-client"