UltrafastSecp256k1/scripts/build_release.sh
vano be528aef66 audit: add AUDIT_COVERAGE.md + ASCII cleanup + CT fixes
- Add comprehensive AUDIT_COVERAGE.md documenting all 46 audit modules
  across 8 sections with ~1M+ total assertions
- Pure ASCII cleanup: remove all Unicode from source/cmake/script files
  (box-drawing, arrows, Greek, emoji, BOM, Georgian in comments)
- CT fix: RISC-V is_zero_mask (seqz+neg inline asm)
- CT fix: ct_compare general path (snez)
- All 188 files updated for ASCII-only compliance (Section 17 rule)
- Verified: 46/46 audit PASS on X64, ARM64, RISC-V (QEMU + Mars HW)
- Verified: 24/24 CTest PASS on X64
2026-02-25 19:14:21 +04:00

187 lines
6.2 KiB
Bash

#!/usr/bin/env bash
# ============================================================================
# UltrafastSecp256k1 -- Release Build Script
# ============================================================================
# Builds release binaries + creates distribution archive + NuGet layout.
#
# Usage:
# ./scripts/build_release.sh # default: Release
# ./scripts/build_release.sh --build-type Debug
# ./scripts/build_release.sh --skip-tests
#
# Output:
# release/UltrafastSecp256k1-<version>-<os>-<arch>/
# release/UltrafastSecp256k1-<version>-<os>-<arch>.tar.gz (or .zip)
# release/nuget/ (NuGet runtime layout)
# ============================================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ROOT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
# -- Defaults --
BUILD_TYPE="Release"
SKIP_TESTS=false
BUILD_DIR="${ROOT_DIR}/build/release-pkg"
RELEASE_DIR="${ROOT_DIR}/release"
# -- Parse args --
while [[ $# -gt 0 ]]; do
case "$1" in
--build-type) BUILD_TYPE="$2"; shift 2 ;;
--skip-tests) SKIP_TESTS=true; shift ;;
*) echo "Unknown arg: $1"; exit 1 ;;
esac
done
# -- Detect platform --
OS="$(uname -s)"
ARCH="$(uname -m)"
case "$OS" in
Linux*) PLATFORM="linux"; EXT="tar.gz" ;;
Darwin*) PLATFORM="macos"; EXT="tar.gz" ;;
MINGW*|MSYS*|CYGWIN*) PLATFORM="win"; EXT="zip" ;;
*) echo "Unsupported OS: $OS"; exit 1 ;;
esac
case "$ARCH" in
x86_64|amd64) ARCH_TAG="x64" ;;
aarch64|arm64) ARCH_TAG="arm64" ;;
*) ARCH_TAG="$ARCH" ;;
esac
# -- Read version from CMakeLists.txt --
VERSION=$(grep -oP 'VERSION\s+\K[0-9]+\.[0-9]+\.[0-9]+' "${ROOT_DIR}/CMakeLists.txt" | head -1)
PKG_NAME="UltrafastSecp256k1-v${VERSION}-${PLATFORM}-${ARCH_TAG}"
echo "============================================================"
echo " UltrafastSecp256k1 Release Build"
echo " Version: ${VERSION}"
echo " Platform: ${PLATFORM}-${ARCH_TAG}"
echo " Build Type: ${BUILD_TYPE}"
echo " Output: ${RELEASE_DIR}/${PKG_NAME}"
echo "============================================================"
# -- Configure --
echo ""
echo ">>> Configuring..."
cmake -S "${ROOT_DIR}" -B "${BUILD_DIR}" \
-G Ninja \
-DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \
-DSECP256K1_BUILD_TESTS=ON \
-DSECP256K1_BUILD_BENCH=OFF \
-DSECP256K1_BUILD_EXAMPLES=OFF
# -- Build --
echo ""
echo ">>> Building..."
cmake --build "${BUILD_DIR}" -j"$(nproc 2>/dev/null || sysctl -n hw.logicalcpu 2>/dev/null || echo 4)"
# -- Test --
if [ "$SKIP_TESTS" = false ]; then
echo ""
echo ">>> Running tests..."
ctest --test-dir "${BUILD_DIR}" --output-on-failure -j4
fi
# -- Install to staging --
echo ""
echo ">>> Installing to staging..."
STAGING="${BUILD_DIR}/staging"
cmake --install "${BUILD_DIR}" --prefix "${STAGING}"
# -- Collect release artifacts --
echo ""
echo ">>> Packaging ${PKG_NAME}..."
rm -rf "${RELEASE_DIR}/${PKG_NAME}"
mkdir -p "${RELEASE_DIR}/${PKG_NAME}/lib"
mkdir -p "${RELEASE_DIR}/${PKG_NAME}/include/ufsecp"
mkdir -p "${RELEASE_DIR}/${PKG_NAME}/include/secp256k1"
# ufsecp headers
cp "${ROOT_DIR}/include/ufsecp/ufsecp.h" "${RELEASE_DIR}/${PKG_NAME}/include/ufsecp/"
cp "${ROOT_DIR}/include/ufsecp/ufsecp_version.h" "${RELEASE_DIR}/${PKG_NAME}/include/ufsecp/"
cp "${ROOT_DIR}/include/ufsecp/ufsecp_error.h" "${RELEASE_DIR}/${PKG_NAME}/include/ufsecp/"
# C++ public headers
if [ -d "${STAGING}/include/secp256k1" ]; then
cp -r "${STAGING}/include/secp256k1/"* "${RELEASE_DIR}/${PKG_NAME}/include/secp256k1/"
fi
# Libraries
find "${STAGING}/lib" "${STAGING}/bin" -maxdepth 1 \( \
-name "*.dll" -o -name "*.lib" -o -name "*.so" -o -name "*.so.*" \
-o -name "*.dylib" -o -name "*.a" \) 2>/dev/null | while read -r f; do
cp "$f" "${RELEASE_DIR}/${PKG_NAME}/lib/"
done
# pkg-config
if [ -d "${STAGING}/lib/pkgconfig" ]; then
cp -r "${STAGING}/lib/pkgconfig" "${RELEASE_DIR}/${PKG_NAME}/lib/"
fi
# CMake config
if [ -d "${STAGING}/lib/cmake" ]; then
cp -r "${STAGING}/lib/cmake" "${RELEASE_DIR}/${PKG_NAME}/lib/"
fi
# Docs
cp "${ROOT_DIR}/LICENSE" "${RELEASE_DIR}/${PKG_NAME}/" 2>/dev/null || true
cp "${ROOT_DIR}/README.md" "${RELEASE_DIR}/${PKG_NAME}/" 2>/dev/null || true
cp "${ROOT_DIR}/CHANGELOG.md" "${RELEASE_DIR}/${PKG_NAME}/" 2>/dev/null || true
cp "${ROOT_DIR}/include/ufsecp/SUPPORTED_GUARANTEES.md" "${RELEASE_DIR}/${PKG_NAME}/" 2>/dev/null || true
# -- Create archive --
echo ""
echo ">>> Creating archive..."
cd "${RELEASE_DIR}"
if [ "$EXT" = "tar.gz" ]; then
tar czf "${PKG_NAME}.tar.gz" "${PKG_NAME}"
echo " Archive: ${RELEASE_DIR}/${PKG_NAME}.tar.gz"
else
if command -v 7z &>/dev/null; then
7z a -tzip "${PKG_NAME}.zip" "${PKG_NAME}" > /dev/null
else
zip -r "${PKG_NAME}.zip" "${PKG_NAME}" > /dev/null
fi
echo " Archive: ${RELEASE_DIR}/${PKG_NAME}.zip"
fi
# -- Populate NuGet runtime layout --
echo ""
echo ">>> Setting up NuGet layout..."
NUGET_ROOT="${RELEASE_DIR}/nuget"
mkdir -p "${NUGET_ROOT}/runtimes/${PLATFORM}-${ARCH_TAG}/native"
# Copy native libraries to NuGet runtimes
find "${RELEASE_DIR}/${PKG_NAME}/lib" -maxdepth 1 \( \
-name "ufsecp*" -o -name "libufsecp*" \) 2>/dev/null | while read -r f; do
cp "$f" "${NUGET_ROOT}/runtimes/${PLATFORM}-${ARCH_TAG}/native/"
done
# Copy ufsecp headers
mkdir -p "${NUGET_ROOT}/include/ufsecp"
cp "${ROOT_DIR}/include/ufsecp/ufsecp.h" "${NUGET_ROOT}/include/ufsecp/"
cp "${ROOT_DIR}/include/ufsecp/ufsecp_version.h" "${NUGET_ROOT}/include/ufsecp/"
cp "${ROOT_DIR}/include/ufsecp/ufsecp_error.h" "${NUGET_ROOT}/include/ufsecp/"
echo " NuGet runtimes: ${NUGET_ROOT}/runtimes/${PLATFORM}-${ARCH_TAG}/native/"
# -- Summary --
echo ""
echo "============================================================"
echo " Release build complete!"
echo ""
echo " Package: ${RELEASE_DIR}/${PKG_NAME}/"
echo " Archive: ${RELEASE_DIR}/${PKG_NAME}.${EXT}"
echo " NuGet: ${NUGET_ROOT}/"
echo ""
echo " Contents:"
ls -lh "${RELEASE_DIR}/${PKG_NAME}/lib/" 2>/dev/null || true
echo ""
echo " To create NuGet package:"
echo " cp -r nuget/* ${NUGET_ROOT}/"
echo " cd ${NUGET_ROOT} && nuget pack UltrafastSecp256k1.Native.nuspec"
echo "============================================================"