#!/bin/bash set -e # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' print_status() { echo -e "${BLUE}[INFO]${NC} $1"; } print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; } print_error() { echo -e "${RED}[ERROR]${NC} $1"; } # Function to automatically increment version increment_version() { print_status "Incrementing version..." # Check if we're in a git repository if ! git rev-parse --git-dir > /dev/null 2>&1; then print_warning "Not in a git repository - skipping version increment" return 0 fi # Get the highest version tag (not chronologically latest) LATEST_TAG=$(git tag -l 'v*.*.*' | sort -V | tail -n 1 || echo "v0.1.0") if [[ -z "$LATEST_TAG" ]]; then LATEST_TAG="v0.1.0" fi # Extract version components (remove 'v' prefix) VERSION=${LATEST_TAG#v} # Parse major.minor.patch using regex if [[ $VERSION =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then MAJOR=${BASH_REMATCH[1]} MINOR=${BASH_REMATCH[2]} PATCH=${BASH_REMATCH[3]} else print_error "Invalid version format in tag: $LATEST_TAG" print_error "Expected format: v0.1.0" return 1 fi # Increment patch version NEW_PATCH=$((PATCH + 1)) NEW_VERSION="v${MAJOR}.${MINOR}.${NEW_PATCH}" print_status "Current version: $LATEST_TAG" print_status "New version: $NEW_VERSION" # Create new git tag if git tag "$NEW_VERSION" 2>/dev/null; then print_success "Created new version tag: $NEW_VERSION" else print_warning "Tag $NEW_VERSION already exists - using existing version" NEW_VERSION=$LATEST_TAG # Re-extract version components for existing tag VERSION=${NEW_VERSION#v} if [[ $VERSION =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then MAJOR=${BASH_REMATCH[1]} MINOR=${BASH_REMATCH[2]} NEW_PATCH=${BASH_REMATCH[3]} fi fi # Update VERSION file for compatibility echo "${NEW_VERSION#v}" > VERSION print_success "Updated VERSION file to ${NEW_VERSION#v}" # Generate version.h header file mkdir -p src cat > src/version.h << EOF /* * Auto-Generated Version Header * DO NOT EDIT THIS FILE MANUALLY - Generated by build script */ #ifndef VERSION_H #define VERSION_H #define VERSION_MAJOR ${MAJOR} #define VERSION_MINOR ${MINOR} #define VERSION_PATCH ${NEW_PATCH} #define VERSION_STRING "${MAJOR}.${MINOR}.${NEW_PATCH}" #define VERSION_TAG "${NEW_VERSION}" /* Build information */ #define BUILD_DATE "$(date +%Y-%m-%d)" #define BUILD_TIME "$(date +%H:%M:%S)" #define BUILD_TIMESTAMP "$(date '+%Y-%m-%d %H:%M:%S')" /* Git information */ #define GIT_HASH "$(git rev-parse --short HEAD 2>/dev/null || echo 'unknown')" #define GIT_BRANCH "$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo 'unknown')" /* Display versions */ #define VERSION_DISPLAY "${NEW_VERSION}" #define VERSION_FULL_DISPLAY "${NEW_VERSION} ($(date '+%Y-%m-%d %H:%M:%S'), $(git rev-parse --short HEAD 2>/dev/null || echo 'unknown'))" /* Version API functions */ const char* get_version(void); const char* get_version_full(void); const char* get_build_info(void); #endif /* VERSION_H */ EOF # Generate version.c implementation file cat > src/version.c << EOF /* * Auto-Generated Version Implementation * DO NOT EDIT THIS FILE MANUALLY - Generated by build script */ #include "version.h" const char* get_version(void) { return VERSION_TAG; } const char* get_version_full(void) { return VERSION_FULL_DISPLAY; } const char* get_build_info(void) { return "Built on " BUILD_DATE " at " BUILD_TIME " from commit " GIT_HASH " on branch " GIT_BRANCH; } EOF print_success "Generated version header files" } # Build functions build_project() { print_status "Cleaning previous build..." make clean increment_version print_status "Building OTP project..." make if [ $? -eq 0 ]; then print_success "Build completed successfully" else print_error "Build failed" return 1 fi } build_static() { print_status "Cleaning previous build..." make clean increment_version print_status "Building OTP project with static linking..." make static if [ $? -eq 0 ]; then print_success "Static build completed successfully" else print_error "Static build failed" return 1 fi } clean_project() { print_status "Cleaning build artifacts..." make clean rm -f VERSION src/version.h src/version.c print_success "Clean completed" } install_project() { print_status "Installing OTP project..." make install if [ $? -eq 0 ]; then print_success "Installation completed" else print_error "Installation failed" return 1 fi } uninstall_project() { print_status "Uninstalling OTP project..." make uninstall if [ $? -eq 0 ]; then print_success "Uninstallation completed" else print_error "Uninstallation failed" return 1 fi } # Main script logic case "${1:-build}" in build) build_project ;; static) build_static ;; clean) clean_project ;; install) install_project ;; uninstall) uninstall_project ;; version) increment_version print_status "Version information generated" ;; *) echo "OTP Cipher Build Script" echo "Usage: $0 {build|static|clean|install|uninstall|version}" echo "" echo "Commands:" echo " build - Build project with automatic version increment (default)" echo " static - Build with static linking" echo " clean - Clean build artifacts and generated files" echo " install - Install to system (requires build first)" echo " uninstall - Remove from system" echo " version - Generate version files only" exit 1 ;; esac