Add cached gplan.so build: 30min first time, 3sec after

- Dockerfile.gplan: pre-built armv7 image with cbang + camotics objects
- build-gplan.sh: relinks against Python 3.5m in ~3sec
- Pi Python 3.5 headers cached in .pi/pi-python35.tar.gz (gitignored)
This commit is contained in:
2026-04-30 14:43:05 +02:00
parent 7306464440
commit e3c059eb9b
3 changed files with 99 additions and 0 deletions

58
.pi/build-gplan.sh Executable file
View File

@@ -0,0 +1,58 @@
#!/usr/bin/env bash
set -euo pipefail
# Build gplan.so for the Onefinity Pi (armv7l, Python 3.5)
#
# First run: ~30min (builds the Docker image with pre-compiled cbang/camotics)
# After that: ~2sec (just relinks against Python 3.5m)
#
# Prerequisites:
# - Docker with QEMU binfmt support (default on Docker Desktop)
# - Python 3.5 headers from the Pi in .pi/pi-python35.tar.gz
# Grab once: ssh bbmc@10.1.10.55 'tar czf - /usr/include/python3.5m \
# /usr/lib/arm-linux-gnueabihf/libpython3.5m.so*' > .pi/pi-python35.tar.gz
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
IMAGE="onefin-gplan"
HEADERS="$SCRIPT_DIR/pi-python35.tar.gz"
OUTPUT="$PROJECT_DIR/src/py/camotics/gplan.so"
# Check for Python 3.5 headers
if [[ ! -f "$HEADERS" ]]; then
echo "Python 3.5 headers not found at $HEADERS"
echo "Fetching from Pi..."
ssh bbmc@10.1.10.55 'tar czf - /usr/include/python3.5m \
/usr/lib/arm-linux-gnueabihf/libpython3.5m.so*' > "$HEADERS"
fi
# Build image if needed (one-time, ~30min)
if ! docker image inspect "$IMAGE" >/dev/null 2>&1; then
echo "Building $IMAGE Docker image (one-time, ~30min under QEMU)..."
docker build --platform linux/arm/v7 -t "$IMAGE" -f "$SCRIPT_DIR/Dockerfile.gplan" "$SCRIPT_DIR"
fi
# Relink gplan.so against Python 3.5m (~2sec)
echo "Linking gplan.so against Python 3.5m..."
docker run --rm --platform linux/arm/v7 \
-v "$HEADERS:/tmp/pi-python35.tar.gz:ro" \
-v "$PROJECT_DIR:/workspace" \
"$IMAGE" bash -c '
tar xzf /tmp/pi-python35.tar.gz -C /
ln -sf /usr/lib/arm-linux-gnueabihf/libpython3.5m.so.1.0 \
/usr/lib/arm-linux-gnueabihf/libpython3.5m.so
g++ -o /workspace/src/py/camotics/gplan.so \
-Wl,--as-needed -Wl,-s -Wl,-x -Wl,--gc-sections -pthread -shared \
build/gplan.os -L/opt/cbang/lib \
build/libCAMoticsPy.a build/libCAMotics.a build/libDXF.a \
build/libSTL.a build/libGCode.a \
-lstdc++ -lutil -lm -ldl -lz -lcbang -lcbang-boost \
-lssl -lcrypto -llz4 -lexpat -lbz2 -lcrypt -lpthread \
-lpython3.5m build/dxflib/libdxflib.a
file /workspace/src/py/camotics/gplan.so
readelf -d /workspace/src/py/camotics/gplan.so | grep python
'
echo "✓ Built: $OUTPUT"