#!/bin/bash # Color definitions for output GREEN='\033[0;32m' RED='\033[0;31m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Logging functions log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # Get script directory and project root SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "${SCRIPT_DIR}")" PROJECT_NAME="collision_avoidance" # Generate version number based on current time VERSION=$(date +"%Y%m%d_%H%M%S") log_info "Building version: ${VERSION}" # Create temp directory TEMP_DIR="${PROJECT_ROOT}/temp_build" rm -rf "${TEMP_DIR}" mkdir -p "${TEMP_DIR}/bin" mkdir -p "${TEMP_DIR}/lib" # Build the project log_info "Building project..." cd "${PROJECT_ROOT}" rm -rf build mkdir build cd build # Configure and build cmake3 -DCMAKE_BUILD_TYPE=Release .. if [ $? -ne 0 ]; then log_error "CMake configuration failed" exit 1 fi make -j$(nproc) if [ $? -ne 0 ]; then log_error "Build failed" exit 1 fi # Copy executable log_info "Copying executable..." cp "bin/${PROJECT_NAME}" "${TEMP_DIR}/bin/" || { log_error "Failed to copy executable" exit 1 } # --- BEGIN: Copy Libraries --- log_info "Copying required runtime libraries to ${TEMP_DIR}/lib/ ..." GCC_RUNTIME_LIB_PATH="/usr/local/lib64" if [ -f "${GCC_RUNTIME_LIB_PATH}/libstdc++.so.6" ]; then cp -Lv "${GCC_RUNTIME_LIB_PATH}/libstdc++.so.6" "${TEMP_DIR}/lib/" log_info "Copied libstdc++.so.6 (and its target file)" else log_warn "libstdc++.so.6 not found in ${GCC_RUNTIME_LIB_PATH}" fi if [ -f "${GCC_RUNTIME_LIB_PATH}/libgcc_s.so.1" ]; then cp -Lv "${GCC_RUNTIME_LIB_PATH}/libgcc_s.so.1" "${TEMP_DIR}/lib/" log_info "Copied libgcc_s.so.1 (and its target file)" else log_warn "libgcc_s.so.1 not found in ${GCC_RUNTIME_LIB_PATH}" fi # Modified Boost library copying ACTUAL_BOOST_LIB_PATH="/usr/lib64" # Actual .so.1.69.0 files are in /usr/lib64 BOOST_VERSIONED_FILES=( "libboost_system.so.1.69.0" "libboost_filesystem.so.1.69.0" "libboost_thread.so.1.69.0" "libboost_chrono.so.1.69.0" "libboost_date_time.so.1.69.0" "libboost_atomic.so.1.69.0" "libboost_regex.so.1.69.0" ) log_info "Attempting to copy Boost libraries from ${ACTUAL_BOOST_LIB_PATH}..." for boost_file in "${BOOST_VERSIONED_FILES[@]}"; do if [ -f "${ACTUAL_BOOST_LIB_PATH}/${boost_file}" ]; then cp -v "${ACTUAL_BOOST_LIB_PATH}/${boost_file}" "${TEMP_DIR}/lib/" log_info "Copied ${boost_file}" else log_warn "Boost library ${boost_file} not found in ${ACTUAL_BOOST_LIB_PATH}" fi done # --- END: Copy Libraries --- # Generate version file echo "${VERSION}" > "${TEMP_DIR}/bin/version.txt" # Generate checksum cd "${TEMP_DIR}/bin" sha256sum "${PROJECT_NAME}" > "${PROJECT_NAME}.sha256" # Create deployment archive cd "${TEMP_DIR}" PACKAGE_NAME="${PROJECT_NAME}_${VERSION}.tar.gz" tar czf "${PROJECT_ROOT}/${PACKAGE_NAME}" bin/ lib/ # Cleanup cd "${PROJECT_ROOT}" rm -rf "${TEMP_DIR}" log_info "Package created: ${PACKAGE_NAME}" log_info "Package contents:" log_info " - Executable binary (in bin/)" log_info " - Runtime libraries (in lib/)" log_info " - Version file (in bin/)" log_info " - Checksum file (in bin/)" # Print instructions echo log_info "To deploy:" echo "1. Copy ${PACKAGE_NAME} to production environment" echo "2. Extract: tar xzf ${PACKAGE_NAME}" echo " This will create 'bin/' and 'lib/' directories." echo "3. Verify checksum: cd bin && sha256sum -c ${PROJECT_NAME}.sha256 && cd .." echo "4. Stop service: systemctl stop collision-avoidance" echo "5. Backup old binary and libraries (optional but recommended)" echo " e.g., mv /opt/collision_avoidance/bin/${PROJECT_NAME} /opt/collision_avoidance/bin/${PROJECT_NAME}.bak" echo " e.g., rsync -ab /opt/collision_avoidance/lib/ /opt/collision_avoidance/lib_bak/" echo "6. Copy new binary: cp bin/${PROJECT_NAME} /opt/collision_avoidance/bin/" echo "7. Copy new libraries: cp lib/* /opt/collision_avoidance/lib/" echo "8. Start service: systemctl start collision-avoidance" echo "9. Check status: systemctl status collision-avoidance"