#!/usr/bin/env bash
set -euo pipefail
usage() {
cat <<'USAGE'
Usage: run_specchain.sh (--servers-dir <dir> | --server-dir <dir>) --work-dir <dir> [--rpmbuild-root <dir>]
Runs the MCP spec packaging chain:
1) Generate spec + tar.gz via generate_mcp_spec_gitcode.py
2) Copy outputs to rpmbuild tree
3) Build each spec with rpmbuild -ba
Options:
--servers-dir <dir> Parent directory containing MCP server subdirectories
--server-dir <dir> Single MCP server directory
--work-dir <dir> Working directory for copy/build (required)
--rpmbuild-root <dir> RPM build root (default: ~/rpmbuild)
-h, --help Show help
USAGE
}
servers_dir=""
server_dir=""
work_dir=""
rpmbuild_root="$HOME/rpmbuild"
while [[ $# -gt 0 ]]; do
case "$1" in
--servers-dir)
servers_dir="$2"
shift 2
;;
--server-dir)
server_dir="$2"
shift 2
;;
--work-dir)
work_dir="$2"
shift 2
;;
--rpmbuild-root)
rpmbuild_root="$2"
shift 2
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unknown argument: $1" >&2
usage >&2
exit 1
;;
esac
done
if [[ -z "$work_dir" ]]; then
echo "--work-dir is required" >&2
usage >&2
exit 1
fi
if [[ -n "$servers_dir" && -n "$server_dir" ]] || [[ -z "$servers_dir" && -z "$server_dir" ]]; then
echo "Provide exactly one of --servers-dir or --server-dir" >&2
usage >&2
exit 1
fi
script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
cd "$script_dir"
if [[ -t 1 ]]; then
BOLD=$'\033[1m'
RESET=$'\033[0m'
CYAN=$'\033[36m'
GREEN=$'\033[32m'
else
BOLD=""
RESET=""
CYAN=""
GREEN=""
fi
banner() {
local label="$1"
local step="$2"
printf "\n${BOLD}${CYAN}╔══════════════════════════════════════╗${RESET}\n"
printf "${BOLD}${CYAN}║ %-36s ║${RESET}\n" "$label"
printf "${BOLD}${CYAN}╚══════════════════════════════════════╝${RESET}\n"
printf "${BOLD}${GREEN}>>${RESET} ${BOLD}%s${RESET}\n\n" "$step"
}
banner "Phase 1/3" "Generating spec and tar.gz..."
cmd=(python scripts/generate_mcp_spec_gitcode.py --work-dir "$work_dir")
if [[ -n "$servers_dir" ]]; then
cmd+=(--servers-dir "$servers_dir")
else
cmd+=(--server-dir "$server_dir")
fi
"${cmd[@]}"
banner "Phase 2/3" "Copying outputs to rpmbuild tree..."
spec_dir="$rpmbuild_root/SPECS"
src_dir="$rpmbuild_root/SOURCES"
mkdir -p "$spec_dir" "$src_dir"
mapfile -t spec_files < <(find "$work_dir" -type f -name "*.spec" | sort)
if [[ ${#spec_files[@]} -eq 0 ]]; then
echo "No .spec files found under $work_dir" >&2
exit 2
fi
mapfile -t tar_files < <(find "$work_dir" -type f -name "*.tar.gz" | sort)
if [[ ${#tar_files[@]} -eq 0 ]]; then
echo "No .tar.gz files found under $work_dir" >&2
exit 3
fi
for spec in "${spec_files[@]}"; do
cp -f "$spec" "$spec_dir/"
done
for tarball in "${tar_files[@]}"; do
cp -f "$tarball" "$src_dir/"
done
banner "Phase 3/3" "Building rpms..."
for spec in "${spec_files[@]}"; do
spec_name=$(basename "$spec")
echo "- building: $spec_name"
rpmbuild -ba "$spec_dir/$spec_name"
done
echo "Done."