Packages

macula

5.1.0
7.1.0 7.0.0 6.0.0 5.2.2 5.2.1 5.2.0 5.1.0 5.0.0 4.8.0 4.7.1 4.7.0 4.6.0 4.5.0 4.4.10 4.4.9 4.4.8 4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.1 4.3.0 4.2.9 4.2.8 4.2.7 4.2.6 4.2.5 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.1 4.1.0 4.0.0 3.16.0 3.15.3 3.15.2 3.15.1 3.14.0 3.13.0 3.12.1 3.12.0 3.11.1 3.11.0 3.10.3 3.10.2 3.10.1 3.9.0 3.8.0 3.7.0 3.5.0 3.4.0 3.3.0 3.2.0 3.1.0 3.0.0 2.1.1 2.1.0 2.0.0 1.5.2 1.5.1 1.4.30 1.4.29 1.4.28 1.4.27 1.4.26 1.4.25 1.4.24 1.4.23 1.4.22 1.4.21 1.4.20 1.4.19 1.4.18 1.4.17 1.4.16 1.4.15 1.4.14 1.4.13 1.4.11 1.4.10 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.1 1.3.0 1.2.0 1.1.0 1.0.10 1.0.9 1.0.8 1.0.7 1.0.6 1.0.5 1.0.4 1.0.3 1.0.2 1.0.1 1.0.0 0.48.6 0.48.5 0.48.4 0.48.3 0.48.2 0.48.1 0.48.0 0.47.1 0.47.0 0.46.3 0.46.1 0.46.0 0.45.3 0.45.2 0.45.1 0.45.0 0.44.2 0.44.1 0.44.0 0.43.3 0.43.2 0.43.1 0.43.0 0.42.9 0.42.8 0.42.7 0.42.6 0.42.5 0.42.4 0.42.3 0.42.2 0.42.1 0.42.0 0.41.1 0.41.0 0.40.1 0.40.0 0.39.9 0.39.8 0.39.7 0.39.6 0.39.5 0.39.4 0.39.3 0.39.2 0.39.1 0.39.0 0.38.8 0.38.7 0.38.6 0.38.5 0.38.4 0.38.3 0.38.2 0.38.1 0.38.0 0.37.7 0.37.6 0.37.5 0.37.4 0.37.3 0.37.2 0.37.1 0.37.0 0.36.6 0.36.5 0.36.4 0.36.3 0.36.2 0.36.1 0.36.0 0.35.4 0.35.3 0.35.2 0.35.1 0.35.0 0.34.1 0.34.0 0.33.1 0.33.0 0.32.5 0.32.4 0.32.3 0.32.2 0.32.1 0.32.0 0.31.9 0.31.8 0.31.7 0.31.6 0.31.5 0.31.4 0.31.3 0.31.2 0.31.1 0.31.0 0.30.10 0.30.9 0.30.8 0.30.7 0.30.6 0.30.5 0.30.4 0.30.3 0.30.2 0.30.1 0.30.0 0.29.0 0.28.3 0.28.2 0.28.1 0.28.0 0.27.1 0.27.0 0.26.1 0.26.0 0.25.6 0.25.5 0.25.4 0.25.3 0.25.2 0.25.1 0.25.0 0.24.6 0.24.5 0.24.4 0.24.3 0.24.2 0.24.1 0.24.0 0.23.3 0.23.2 0.23.1 0.23.0 0.22.12 0.22.11 0.22.10 0.22.9 0.22.8 0.22.7 0.22.6 0.22.5 0.22.4 0.22.3 0.22.2 0.22.1 0.22.0 0.21.7 0.21.6 0.21.5 0.21.4 0.21.2 0.21.1 0.21.0 0.20.25 0.20.24 0.20.23 0.20.22 0.20.21 0.20.20 0.20.19 0.20.18 0.20.17 0.20.16 0.20.15 0.20.14 0.20.13 0.20.12 0.20.11 0.20.10 0.20.9 0.20.8 0.20.7 0.20.6 0.20.5 0.20.3 0.20.2 0.20.1 0.20.0 0.19.2 0.19.1 0.19.0 0.18.1 0.18.0 0.17.4 0.17.3 0.17.2 0.17.1 0.17.0 0.16.6 0.16.5 0.16.4 0.16.3 0.16.2 0.16.1 0.16.0 0.15.1 0.15.0 0.14.3 0.14.2 0.14.1 0.14.0 0.12.6 0.12.5 0.12.3 0.11.3 0.10.2 0.10.1 0.10.0 0.9.2 0.9.1 0.9.0 0.8.25 0.8.24 0.8.23 0.8.22 0.8.21 0.8.20 0.8.19 0.8.18 0.8.17 0.8.16 0.8.15 0.8.14 0.8.13 0.8.12 0.8.11 0.8.10 0.8.9 0.8.8 0.8.7 0.8.6 0.8.5 0.8.4 0.8.3 0.8.2 0.8.1 0.8.0 0.7.30 0.7.29 0.7.28 0.7.27 0.7.26 0.7.25 0.7.24 0.7.23 0.7.22 0.7.21 0.7.20 0.7.19 0.7.18 0.7.17 0.7.16 0.7.15 0.7.14 0.7.13 0.7.12 0.7.11 0.7.10 0.7.9 0.7.8 0.7.7 0.7.6 0.7.5 0.7.4 0.7.3 0.7.2 0.7.1 0.7.0 0.6.7 0.6.6 0.6.5 0.6.4 0.6.3 0.6.2 0.6.1 0.6.0 0.5.0 0.4.4 0.4.3 0.4.2 0.4.1 0.4.0 0.3.4 0.3.3 0.3.2 0.3.1

Macula HTTP/3 Mesh SDK — connect, subscribe, publish, call, advertise

Current section

Files

Jump to
macula priv fetch-nif.sh
Raw

priv/fetch-nif.sh

#!/bin/bash
# Fetch precompiled Quinn NIF from GitHub releases.
# Falls back to building from source if download fails.
#
# Usage: scripts/fetch-nif.sh [BASEDIR]
# Called by rebar.config pre_hooks during compilation.
set -eu
BASEDIR="${1:-.}"
PRIV_DIR="${BASEDIR}/priv"
NIF_FILE="${PRIV_DIR}/libmacula_quic.so"
NATIVE_DIR="${BASEDIR}/native/macula_quic"
# When compiling inside _build/, native/ isn't symlinked but src/ is.
# Follow the src symlink to find the source root and its native/ dir.
if [ ! -d "${NATIVE_DIR}" ] && [ -L "${BASEDIR}/src" ]; then
SRC_TARGET=$(readlink -f "${BASEDIR}/src")
SOURCE_ROOT=$(dirname "${SRC_TARGET}")
if [ -d "${SOURCE_ROOT}/native/macula_quic" ]; then
NATIVE_DIR="${SOURCE_ROOT}/native/macula_quic"
fi
fi
# Skip if NIF already exists
if [ -f "${NIF_FILE}" ]; then
exit 0
fi
mkdir -p "${PRIV_DIR}"
# MACULA_FORCE_SOURCE_BUILD=1 → skip GitHub-release download, build
# from source. Use this on hosts whose glibc is older than the CI
# runner's (e.g., beam02 on Ubuntu 20.04 = glibc 2.31, while CI
# release artifacts may require glibc ≥ 2.34).
if [ "${MACULA_FORCE_SOURCE_BUILD:-0}" = "1" ]; then
echo "[macula_quic] MACULA_FORCE_SOURCE_BUILD=1 — skipping download"
build_from_source() {
cargo build --release --manifest-path "${NATIVE_DIR}/Cargo.toml"
cp "${NATIVE_DIR}/target/release/libmacula_quic.so" "${NIF_FILE}"
}
build_from_source
exit 0
fi
build_from_source() {
if [ ! -d "${NATIVE_DIR}" ]; then
echo "[macula_quic] ERROR: No Rust source and download failed."
echo "[macula_quic] Either install from a tagged release or install Rust:"
echo "[macula_quic] curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh"
exit 1
fi
if ! command -v cargo >/dev/null 2>&1; then
echo "[macula_quic] ERROR: Rust toolchain not found."
echo "[macula_quic] curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh"
exit 1
fi
echo "[macula_quic] Building NIF from source..."
cargo build --release --manifest-path "${NATIVE_DIR}/Cargo.toml"
cp "${NATIVE_DIR}/target/release/libmacula_quic.so" "${NIF_FILE}" 2>/dev/null || \
cp "${NATIVE_DIR}/target/release/libmacula_quic.dylib" "${NIF_FILE}" 2>/dev/null || true
echo "[macula_quic] NIF built successfully."
}
# Detect platform
ARCH=$(uname -m)
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
case "${ARCH}" in
x86_64|amd64) ARCH="x86_64" ;;
aarch64|arm64) ARCH="aarch64" ;;
*) echo "[macula_quic] Unsupported arch: ${ARCH}" && build_from_source && exit 0 ;;
esac
if [ "${OS}" != "linux" ]; then
echo "[macula_quic] Precompiled NIF only for Linux"
build_from_source
exit 0
fi
# Detect musl (Alpine) vs glibc
LIBC="glibc"
if ldd --version 2>&1 | grep -qi musl; then
LIBC="musl"
fi
if [ "${LIBC}" = "musl" ]; then
ARTIFACT="libmacula_quic-${OS}-musl-${ARCH}.so"
else
ARTIFACT="libmacula_quic-${OS}-${ARCH}.so"
fi
# Read version from app.src
VERSION=$(grep '{vsn' "${BASEDIR}/src/macula.app.src" 2>/dev/null | sed 's/.*"\(.*\)".*/\1/' || echo "")
if [ -z "${VERSION}" ]; then
echo "[macula_quic] Cannot determine version"
build_from_source
exit 0
fi
RELEASE_URL="https://github.com/macula-io/macula/releases/download/v${VERSION}/${ARTIFACT}"
CHECKSUM_URL="${RELEASE_URL}.sha256"
echo "[macula_quic] Fetching precompiled NIF v${VERSION} for ${OS}-${ARCH}..."
# Try downloading precompiled NIF
if curl -fsSL --retry 2 --max-time 30 -o "${NIF_FILE}" "${RELEASE_URL}" 2>/dev/null; then
# Verify checksum
if curl -fsSL --retry 2 --max-time 10 -o "${NIF_FILE}.sha256" "${CHECKSUM_URL}" 2>/dev/null; then
EXPECTED=$(awk '{print $1}' "${NIF_FILE}.sha256")
ACTUAL=$(sha256sum "${NIF_FILE}" | awk '{print $1}')
rm -f "${NIF_FILE}.sha256"
if [ "${EXPECTED}" = "${ACTUAL}" ]; then
echo "[macula_quic] Checksum OK. Precompiled NIF ready."
exit 0
fi
echo "[macula_quic] Checksum mismatch!"
rm -f "${NIF_FILE}"
else
# No checksum available but download succeeded — use it
echo "[macula_quic] No checksum, using downloaded NIF."
exit 0
fi
else
echo "[macula_quic] Download failed."
fi
# Fallback: build from source
build_from_source