blob: 3f070da32081245155e80f3348f799e8088e28eb [file] [log] [blame]
#!/bin/bash
#
# Script Name: build-rpm.sh
#
# Description:
# This script automates the process of building an RPM package using a specified
# version and release number. It ensures that the necessary tools are installed
# and that the spec file exists before attempting to build the RPM. The script
# also includes error handling to provide meaningful feedback in case of failure.
#
# Usage:
# ./build-rpm.sh -v <version> [-r <release>] [-d|--with-debug] [-h] [--dry-run]
#
# Options:
# -v, --version <version> : Specify the version (required)
# -r, --release <release> : Specify the release (optional, default is 1)
# -d, --with-debug : Build with debug symbols (optional)
# -h, --help : Display this help and exit
# -n, --dry-run : Show what would be done, without making any changes
#
# Example:
# ./build-rpm.sh -v 1.5.5 -r 2 # Build with version 1.5.5 and release 2
# ./build-rpm.sh -v 1.5.5 # Build with version 1.5.5 and default release 1
# ./build-rpm.sh -v 1.5.5 --with-debug # Build with debug symbols
#
# Prerequisites:
# - The rpm-build package must be installed (provides the rpmbuild command).
# - The spec file must exist at ~/rpmbuild/SPECS/apache-cloudberry-db-incubating.spec.
#
# Error Handling:
# The script includes checks to ensure:
# - The version option (-v or --version) is provided.
# - The necessary commands are available.
# - The spec file exists at the specified location.
# If any of these checks fail, the script exits with an appropriate error message.
# Enable strict mode for better error handling
set -euo pipefail
# Default values
VERSION=""
RELEASE="1"
DEBUG_BUILD=false
# Function to display usage information
usage() {
echo "Usage: $0 -v <version> [-r <release>] [-h] [--dry-run]"
echo " -v, --version <version> : Specify the version (required)"
echo " -r, --release <release> : Specify the release (optional, default is 1)"
echo " -d, --with-debug : Build with debug symbols (optional)"
echo " -h, --help : Display this help and exit"
echo " -n, --dry-run : Show what would be done, without making any changes"
exit 1
}
# Function to check if required commands are available
check_commands() {
local cmds=("rpmbuild")
for cmd in "${cmds[@]}"; do
if ! command -v "$cmd" &> /dev/null; then
echo "Error: Required command '$cmd' not found. Please install it before running the script."
exit 1
fi
done
}
# Parse options
while [[ "$#" -gt 0 ]]; do
case $1 in
-v|--version)
VERSION="$2"
shift 2
;;
-r|--release)
RELEASE="$2"
shift 2
;;
-d|--with-debug)
DEBUG_BUILD=true
shift
;;
-h|--help)
usage
;;
-n|--dry-run)
DRY_RUN=true
shift
;;
*)
echo "Unknown option: ($1)"
shift
;;
esac
done
# Ensure version is provided
if [ -z "$VERSION" ]; then
echo "Error: Version (-v or --version) is required."
usage
fi
# Check if required commands are available
check_commands
# Define the spec file path
SPEC_FILE=~/rpmbuild/SPECS/apache-cloudberry-db-incubating.spec
# Check if the spec file exists
if [ ! -f "$SPEC_FILE" ]; then
echo "Error: Spec file not found at $SPEC_FILE."
exit 1
fi
# Build the rpmbuild command based on options
RPMBUILD_CMD="rpmbuild -bb \"$SPEC_FILE\" --define \"version $VERSION\" --define \"release $RELEASE\""
if [ "$DEBUG_BUILD" = true ]; then
RPMBUILD_CMD+=" --with debug"
fi
# Dry-run mode
if [ "${DRY_RUN:-false}" = true ]; then
echo "Dry-run mode: This is what would be done:"
echo " $RPMBUILD_CMD"
exit 0
fi
# Run rpmbuild with the provided options
echo "Building RPM with Version: $VERSION, Release: $RELEASE$([ "$DEBUG_BUILD" = true ] && echo ", Debug: enabled")..."
if ! eval "$RPMBUILD_CMD"; then
echo "Error: rpmbuild failed."
exit 1
fi
# Print completion message
echo "RPM build completed successfully with Version: $VERSION, Release: $RELEASE"