#!/bin/bash set -e # Build script for creating Debian package SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" BUILD_DIR="$PROJECT_DIR/build" DEB_DIR="$PROJECT_DIR/debian" # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color echo_info() { echo -e "${GREEN}[INFO]${NC} $1" } echo_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } echo_error() { echo -e "${RED}[ERROR]${NC} $1" } # Clean previous builds echo_info "Cleaning previous builds..." rm -rf "$BUILD_DIR" mkdir -p "$BUILD_DIR" # Change to project directory cd "$PROJECT_DIR" # Build the applications echo_info "Building SkyView applications..." export CGO_ENABLED=0 export GOOS=linux export GOARCH=amd64 VERSION=$(git describe --tags --always --dirty) LDFLAGS="-w -s -X main.version=$VERSION" # Build main skyview binary echo_info "Building skyview..." if ! go build -ldflags="$LDFLAGS" \ -o "$DEB_DIR/usr/bin/skyview" \ ./cmd/skyview; then echo_error "Failed to build skyview" exit 1 fi # Build beast-dump utility echo_info "Building beast-dump..." if ! go build -ldflags="$LDFLAGS" \ -o "$DEB_DIR/usr/bin/beast-dump" \ ./cmd/beast-dump; then echo_error "Failed to build beast-dump" exit 1 fi echo_info "Built binaries:" echo_info " skyview: $(file "$DEB_DIR/usr/bin/skyview")" echo_info " beast-dump: $(file "$DEB_DIR/usr/bin/beast-dump")" # Set executable permissions chmod +x "$DEB_DIR/usr/bin/skyview" chmod +x "$DEB_DIR/usr/bin/beast-dump" # Generate incremental changelog from git history echo_info "Generating incremental changelog from git history..." CHANGELOG_DIR="$DEB_DIR/usr/share/doc/skyview-adsb" mkdir -p "$CHANGELOG_DIR" # Function to generate incremental changelog generate_incremental_changelog() { local changelog_file="$1" # Get all tags in reverse chronological order local tags tags=$(git tag -l --sort=-version:refname) # If no tags exist, create a single entry for current state if [ -z "$tags" ]; then local current_version current_version=$(git describe --tags --always) echo_info "No tags found, generating initial changelog for $current_version" { echo "skyview-adsb ($current_version) unstable; urgency=medium" echo "" echo " * Initial release" echo " * Multi-source ADS-B aircraft tracker with Beast format support" echo "" echo " -- $(git config user.name) <$(git config user.email)> $(date -R)" echo "" } > "$changelog_file" return fi # Create empty changelog : > "$changelog_file" # Add entry for current development version if there are commits after the last tag local latest_tag latest_tag=$(echo "$tags" | head -n1) local commits_since_tag commits_since_tag=$(git rev-list "$latest_tag"..HEAD --count 2>/dev/null || echo 0) if [ "$commits_since_tag" -gt 0 ]; then local current_version current_version=$(git describe --tags --always) echo_info "Adding entry for current development version: $current_version" { echo "skyview-adsb ($current_version) unstable; urgency=medium" echo "" git log --pretty=format:" * %s" "$latest_tag"..HEAD | head -20 echo "" echo "" echo " -- $(git config user.name) <$(git config user.email)> $(date -R)" echo "" } >> "$changelog_file" fi # Process all tags to create incremental changelog local prev_tag="" for tag in $tags; do echo_info "Processing version $tag" # Get tag date and author info local tag_date tag_date=$(git log -1 --format=%aD "$tag") local tag_author tag_author=$(git log -1 --format='%an <%ae>' "$tag") # Add version header { echo "skyview-adsb ($tag) unstable; urgency=medium" echo "" } >> "$changelog_file" # Add changes for this version if [ -n "$prev_tag" ]; then # Show changes between this tag and the previous one git log --pretty=format:" * %s" "$tag..$prev_tag" | head -20 >> "$changelog_file" else # For the oldest tag, show changes from the beginning git log --pretty=format:" * %s" "$tag" | head -20 >> "$changelog_file" fi # Add footer { echo "" echo "" echo " -- $tag_author $tag_date" echo "" } >> "$changelog_file" prev_tag="$tag" done } # Generate the incremental changelog generate_incremental_changelog "$CHANGELOG_DIR/changelog" echo_info "Generated incremental changelog with $(grep -c '^skyview-adsb (' "$CHANGELOG_DIR/changelog") version entries" # Compress changelog as per Debian standards (force overwrite if exists) gzip -9f "$CHANGELOG_DIR/changelog" echo_info "Generated changelog: $CHANGELOG_DIR/changelog.gz" # Get package info VERSION=$(grep "Version:" "$DEB_DIR/DEBIAN/control" | cut -d' ' -f2) PACKAGE=$(grep "Package:" "$DEB_DIR/DEBIAN/control" | cut -d' ' -f2) ARCH=$(grep "Architecture:" "$DEB_DIR/DEBIAN/control" | cut -d' ' -f2) DEB_FILE="${PACKAGE}_${VERSION}_${ARCH}.deb" echo_info "Creating Debian package: $DEB_FILE" # Calculate installed size INSTALLED_SIZE=$(du -sk "$DEB_DIR" | cut -f1) sed -i "s/Installed-Size:.*/Installed-Size: $INSTALLED_SIZE/" "$DEB_DIR/DEBIAN/control" 2>/dev/null || \ echo "Installed-Size: $INSTALLED_SIZE" >> "$DEB_DIR/DEBIAN/control" # Build the package if dpkg-deb --root-owner-group --build "$DEB_DIR" "$BUILD_DIR/$DEB_FILE"; then echo_info "Successfully created: $BUILD_DIR/$DEB_FILE" # Show package info echo_info "Package information:" dpkg-deb --info "$BUILD_DIR/$DEB_FILE" echo_info "Package contents:" dpkg-deb --contents "$BUILD_DIR/$DEB_FILE" # Test the package (requires root) if [ "$EUID" -eq 0 ]; then echo_info "Testing package installation (as root)..." dpkg --dry-run -i "$BUILD_DIR/$DEB_FILE" else echo_warn "Run as root to test package installation" fi echo_info "Debian package build complete!" echo_info "Install with: sudo dpkg -i $BUILD_DIR/$DEB_FILE" echo_info "Or upload to repository for apt installation" else echo_error "Failed to create Debian package" exit 1 fi