diff --git a/local-build.sh b/local-build.sh new file mode 100755 index 0000000..a8a18b6 --- /dev/null +++ b/local-build.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash +# Mimics the AlmaLinux RPM %prep + cmake pipeline locally. +# Usage: ./local-build.sh [almalinux9|almalinux10] [git-repo-url-or-local-path] [branch] +# +# Defaults: product=almalinux10, repo=https://github.com/swoutersup/ComplianceAsCode-content, branch=main +# +# Patches and support scripts are sourced from this autopatch repo's files/ directory. +# The script is branch-aware: if the current checkout is not the branch that owns +# the requested product, it extracts files/ from git automatically — no manual +# branch switch needed. +# +# Produces: /build/ssg--ds.xml + +set -euo pipefail + +PRODUCT="${1:-almalinux10}" +CONTENT_SRC="${2:-https://github.com/swoutersup/ComplianceAsCode-content}" +CONTENT_BRANCH="${3:-}" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +WORK_DIR="$(pwd)/work-${PRODUCT}" + +# Map each product to its branch in this autopatch repo +case "${PRODUCT}" in + almalinux9) PRODUCT_BRANCH="a9" ;; + almalinux10) PRODUCT_BRANCH="a10" ;; + *) echo "ERROR: unsupported product '${PRODUCT}'. Use almalinux9 or almalinux10." >&2; exit 1 ;; +esac + +CURRENT_BRANCH="$(git -C "${SCRIPT_DIR}" branch --show-current 2>/dev/null || echo '')" + +if [[ "${CURRENT_BRANCH}" != "${PRODUCT_BRANCH}" ]]; then + # Extract files/ from the correct branch into a temporary directory + echo "==> Current branch is '${CURRENT_BRANCH}'; extracting ${PRODUCT} build files from '${PRODUCT_BRANCH}'" + BUILD_FILES_DIR="$(mktemp -d)" + trap 'rm -rf "${BUILD_FILES_DIR}"' EXIT + + git -C "${SCRIPT_DIR}" show \ + "${PRODUCT_BRANCH}:files/add-${PRODUCT}-support.sh" \ + > "${BUILD_FILES_DIR}/add-${PRODUCT}-support.sh" + + while IFS= read -r patch; do + git -C "${SCRIPT_DIR}" show "${PRODUCT_BRANCH}:files/${patch}" \ + > "${BUILD_FILES_DIR}/${patch}" + done < <(git -C "${SCRIPT_DIR}" ls-tree --name-only "${PRODUCT_BRANCH}:files/" \ + | grep '\.patch$') +else + BUILD_FILES_DIR="${SCRIPT_DIR}/files" +fi + +SUPPORT_SCRIPT="${BUILD_FILES_DIR}/add-${PRODUCT}-support.sh" + +if [[ ! -f "${SUPPORT_SCRIPT}" ]]; then + echo "ERROR: support script not found: ${SUPPORT_SCRIPT}" >&2 + exit 1 +fi + +rm -rf "${WORK_DIR}" + +if [[ "${CONTENT_SRC}" == http* || "${CONTENT_SRC}" == git@* ]]; then + BRANCH_ARGS=() + [[ -n "${CONTENT_BRANCH}" ]] && BRANCH_ARGS=(--branch "${CONTENT_BRANCH}") + echo "==> Cloning ${CONTENT_SRC}${CONTENT_BRANCH:+ (branch: ${CONTENT_BRANCH})} to ${WORK_DIR}" + git clone --depth=1 "${BRANCH_ARGS[@]}" "${CONTENT_SRC}" "${WORK_DIR}" +else + echo "==> Copying ${CONTENT_SRC} to ${WORK_DIR}" + cp -r "${CONTENT_SRC}" "${WORK_DIR}" +fi + +cd "${WORK_DIR}" + +echo "==> Applying patches (%autosetup -p1)" +for PATCH in "${BUILD_FILES_DIR}"/*.patch; do + [[ -f "${PATCH}" ]] || continue + echo " Applying $(basename "${PATCH}")" + patch -p1 --forward --silent < "${PATCH}" || { + echo "WARNING: patch $(basename "${PATCH}") already applied or failed — continuing" + } +done + +echo "==> Running ${SUPPORT_SCRIPT}" +bash "${SUPPORT_SCRIPT}" + +echo "==> Building ssg-${PRODUCT}-ds.xml" +ADDITIONAL_CMAKE_OPTIONS="-DSSG_SCE_ENABLED=ON" ./build_product "${PRODUCT}" --datastream + +echo "" +echo "==> Done. Datastream at:" +echo " ${WORK_DIR}/build/ssg-${PRODUCT}-ds.xml"