2025-07-29 09:05:47 -04:00
#!/usr/bin/env bash
#
2025-07-29 09:25:44 -04:00
# install.sh - Comprehensive interactive installation script for GridFire.
2025-07-29 09:05:47 -04:00
#
# This script performs the following actions:
2025-07-29 09:25:44 -04:00
# 1. Checks for essential system dependencies.
# 2. If run with the --tui flag, it provides a comprehensive text-based user interface
# to select and install dependencies, configure the build, and run build steps.
2025-07-29 09:05:47 -04:00
# 3. If run without flags, it prompts the user interactively for each missing dependency.
# 4. Provides detailed installation instructions for various Linux distributions and macOS.
2025-07-29 09:25:44 -04:00
# 5. Once all dependencies are met, it can run the meson setup, compile, install, and test commands.
2025-07-29 09:05:47 -04:00
# 6. Logs all operations to a file for easy debugging.
set -o pipefail
# --- Configuration ---
LOGFILE = "GridFire_Installer.log"
2025-07-29 09:25:44 -04:00
# --- Build Configuration Globals ---
2025-07-29 09:05:47 -04:00
BUILD_DIR = "build"
2025-07-29 09:25:44 -04:00
INSTALL_PREFIX = "/usr/local"
MESON_BUILD_TYPE = "release"
MESON_LOG_LEVEL = "info"
MESON_PKG_CONFIG = "true"
MESON_NUM_CORES = $( getconf _NPROCESSORS_ONLN 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1)
2025-07-29 09:05:47 -04:00
# --- ANSI Color Codes ---
RED = "\033[0;31m"
GREEN = "\033[0;32m"
YELLOW = "\033[0;33m"
BLUE = "\033[0;34m"
NC = "\033[0m" # No Color
# --- Logging and Utility Functions ---
# Log a message to stdout and to the log file.
log( ) {
local message = " $1 "
# Print the colored message to the terminal.
echo -e " ${ message } "
# Strip ANSI color codes and append to the log file.
echo -e " ${ message } " | sed 's/\x1B\[[0-9;]*[mK]//g' >> " $LOGFILE "
}
# Prompt the user for a yes/no answer.
prompt_yes_no( ) {
local prompt_msg = " $1 "
local answer
while true; do
read -p " $( echo -e " ${ YELLOW } ${ prompt_msg } ${ NC } " ) " answer
case " $answer " in
[ Yy] * ) return 0; ;
[ Nn] * ) return 1; ;
* ) echo "Please answer yes or no." ; ;
esac
done
}
# Show the help message and exit.
show_help( ) {
echo "Usage: ./install.sh [options]"
echo
echo "This script checks for dependencies, installs them, and builds the project."
echo
echo "Options:"
2025-07-29 09:25:44 -04:00
echo " --tui Run in Text-based User Interface mode for interactive dependency installation and build control."
2025-07-29 09:05:47 -04:00
echo " --help, -h Show this help message and exit."
echo " --clean Remove the build directory and log file before starting."
echo
echo "The script will automatically detect your OS and suggest the correct package manager commands."
echo " All output is logged to ${ LOGFILE } . "
}
# --- OS Detection ---
OS_NAME = $( uname -s)
DISTRO_ID = "unknown"
if [ -f /etc/os-release ] ; then
. /etc/os-release
DISTRO_ID = $ID
fi
if [ [ " $OS_NAME " = = "Darwin" ] ] ; then
OS_NAME = "macOS"
fi
# --- Dependency Check Functions ---
2025-07-29 09:25:44 -04:00
check_command( ) {
command -v " $1 " & >/dev/null
}
2025-07-29 09:05:47 -04:00
check_compiler( ) {
2025-07-29 09:25:44 -04:00
if check_command g++; then
log " ${ GREEN } [OK] Found C++ compiler: g++ ${ NC } "
2025-07-29 09:05:47 -04:00
return 0
2025-07-29 09:25:44 -04:00
elif check_command clang++; then
log " ${ GREEN } [OK] Found C++ compiler: clang++ ${ NC } "
2025-07-29 09:05:47 -04:00
return 0
else
log " ${ RED } [FAIL] No C++ compiler (g++ or clang++) found. ${ NC } "
return 1
fi
}
check_python_dev( ) {
2025-07-29 09:25:44 -04:00
if check_command python3 && python3-config --includes & >/dev/null; then
2025-07-29 09:05:47 -04:00
log " ${ GREEN } [OK] Found Python 3 development headers. ${ NC } "
return 0
else
log " ${ RED } [FAIL] Python 3 development headers not found. ${ NC } "
return 1
fi
}
check_cmake( ) {
2025-07-29 09:25:44 -04:00
if check_command cmake; then
2025-07-29 09:05:47 -04:00
log " ${ GREEN } [OK] Found CMake: $( cmake --version | head -n1) ${ NC } "
return 0
else
log " ${ RED } [FAIL] CMake not found. ${ NC } "
return 1
fi
}
check_meson( ) {
2025-07-29 09:25:44 -04:00
if check_command meson; then
2025-07-29 09:05:47 -04:00
log " ${ GREEN } [OK] Found Meson: $( meson --version) ${ NC } "
return 0
else
log " ${ RED } [FAIL] Meson not found. ${ NC } "
return 1
fi
}
check_boost( ) {
log " ${ BLUE } [Info] Checking for Boost dependency using Meson... ${ NC } "
local test_dir = "meson-boost-test"
2025-07-29 09:25:44 -04:00
rm -rf " $test_dir " && mkdir -p " $test_dir "
2025-07-29 09:05:47 -04:00
cat > " $test_dir /meson.build " <<EOF
project( 'boost-check' , 'cpp' )
boost_dep = dependency( 'boost' , required: true )
EOF
if meson setup " $test_dir /build " " $test_dir " & >/dev/null; then
log " ${ GREEN } [OK] Found Boost libraries. ${ NC } "
rm -rf " $test_dir "
return 0
else
log " ${ RED } [FAIL] Boost libraries not found by Meson. ${ NC } "
rm -rf " $test_dir "
return 1
fi
}
# --- Dependency Installation Functions ---
run_install_cmd( ) {
local cmd = " $1 "
log " ${ BLUE } [Exec] Running: ${ cmd } ${ NC } "
if prompt_yes_no "Execute this command? (y/n):" ; then
eval " ${ cmd } " 2>& 1 | tee -a " $LOGFILE "
return $?
else
log " ${ YELLOW } [Skip] User skipped installation command. ${ NC } "
return 1
fi
}
get_install_cmd( ) {
local dep_name = " $1 "
local cmd = ""
case " $OS_NAME " in
"macOS" )
2025-07-29 09:25:44 -04:00
[ ! -f /opt/homebrew/bin/brew ] && [ ! -f /usr/local/bin/brew ] && log " ${ YELLOW } Homebrew not found. Please install from https://brew.sh ${ NC } "
local brew_cmd
brew_cmd = $( command -v brew)
2025-07-29 09:05:47 -04:00
case " $dep_name " in
"compiler" ) cmd = "xcode-select --install" ; ;
2025-07-29 09:25:44 -04:00
"python-dev" ) cmd = " $brew_cmd install python3 " ; ;
"cmake" ) cmd = " $brew_cmd install cmake " ; ;
"meson" ) cmd = " $brew_cmd install meson " ; ;
"boost" ) cmd = " $brew_cmd install boost " ; ;
"dialog" ) cmd = " $brew_cmd install dialog " ; ;
2025-07-29 09:05:47 -04:00
esac
; ;
"Linux" )
case " $DISTRO_ID " in
"ubuntu" | "debian" | "linuxmint" )
case " $dep_name " in
"compiler" ) cmd = "sudo apt-get install -y build-essential" ; ;
"python-dev" ) cmd = "sudo apt-get install -y python3-dev" ; ;
"cmake" ) cmd = "sudo apt-get install -y cmake" ; ;
"meson" ) cmd = "sudo apt-get install -y meson" ; ;
"boost" ) cmd = "sudo apt-get install -y libboost-all-dev" ; ;
"dialog" ) cmd = "sudo apt-get install -y dialog" ; ;
esac
; ;
"fedora" )
case " $dep_name " in
"compiler" ) cmd = "sudo dnf install -y gcc-c++" ; ;
"python-dev" ) cmd = "sudo dnf install -y python3-devel" ; ;
"cmake" ) cmd = "sudo dnf install -y cmake" ; ;
"meson" ) cmd = "sudo dnf install -y meson" ; ;
"boost" ) cmd = "sudo dnf install -y boost-devel" ; ;
"dialog" ) cmd = "sudo dnf install -y dialog" ; ;
esac
; ;
"arch" | "manjaro" )
case " $dep_name " in
"compiler" ) cmd = "sudo pacman -S --noconfirm base-devel" ; ;
"python-dev" ) cmd = "sudo pacman -S --noconfirm python" ; ;
"cmake" ) cmd = "sudo pacman -S --noconfirm cmake" ; ;
"meson" ) cmd = "sudo pacman -S --noconfirm meson" ; ;
"boost" ) cmd = "sudo pacman -S --noconfirm boost" ; ;
"dialog" ) cmd = "sudo pacman -S --noconfirm dialog" ; ;
esac
; ;
2025-07-29 09:25:44 -04:00
*) log " ${ YELLOW } [Warn] Unsupported Linux distribution: ${ DISTRO_ID } . ${ NC } " ; ;
2025-07-29 09:05:47 -04:00
esac
; ;
2025-07-29 09:25:44 -04:00
*) log " ${ YELLOW } [Warn] Unsupported OS: ${ OS_NAME } . ${ NC } " ; ;
2025-07-29 09:05:47 -04:00
esac
echo " $cmd "
}
2025-07-29 09:25:44 -04:00
# --- Build Functions ---
2025-07-29 09:05:47 -04:00
2025-07-29 09:25:44 -04:00
run_meson_setup( ) {
log " \n ${ BLUE } --- Configuring Meson Build --- ${ NC } "
if [ ! -f "meson.build" ] ; then
log " ${ RED } [FATAL] meson.build file not found. Cannot proceed. ${ NC } " ; return 1;
fi
local reconfigure_flag = ""
if [ -d " $BUILD_DIR " ] ; then
reconfigure_flag = "--reconfigure"
log " ${ YELLOW } [Info] Existing build directory found. Will reconfigure. ${ NC } "
fi
2025-07-29 09:05:47 -04:00
2025-07-29 09:25:44 -04:00
local meson_opts = ( )
meson_opts += ( " -Dbuildtype= ${ MESON_BUILD_TYPE } " )
meson_opts += ( " -Dlog_level= ${ MESON_LOG_LEVEL } " )
meson_opts += ( " -Dpkg-config= ${ MESON_PKG_CONFIG } " )
meson_opts += ( " --prefix= ${ INSTALL_PREFIX } " )
2025-07-29 09:05:47 -04:00
2025-07-29 09:25:44 -04:00
log " ${ BLUE } [Info] Running meson setup with options: ${ meson_opts [*] } ${ NC } "
if ! meson setup " ${ BUILD_DIR } " " ${ meson_opts [@] } " ${ reconfigure_flag } ; then
log " ${ RED } [FATAL] Meson setup failed. See log for details. ${ NC } " ; return 1;
fi
log " ${ GREEN } [Success] Meson setup complete. ${ NC } "
}
run_meson_compile( ) {
log " \n ${ BLUE } --- Compiling Project --- ${ NC } "
if [ ! -d " $BUILD_DIR " ] ; then
log " ${ RED } [FATAL] Build directory not found. Run setup first. ${ NC } " ; return 1;
fi
log " ${ BLUE } [Info] Running meson compile with ${ MESON_NUM_CORES } cores... ${ NC } "
if ! meson compile -C " ${ BUILD_DIR } " -j " ${ MESON_NUM_CORES } " ; then
log " ${ RED } [FATAL] Meson compile failed. See log for details. ${ NC } " ; return 1;
fi
log " ${ GREEN } [Success] Meson compile complete. ${ NC } "
}
run_meson_install( ) {
log " \n ${ BLUE } --- Installing Project --- ${ NC } "
if [ ! -d " $BUILD_DIR " ] ; then
log " ${ RED } [FATAL] Build directory not found. Run setup and compile first. ${ NC } " ; return 1;
fi
log " ${ BLUE } [Info] Running meson install (prefix: ${ INSTALL_PREFIX } )... ${ NC } "
if ! sudo meson install -C " ${ BUILD_DIR } " ; then
log " ${ RED } [FATAL] Meson install failed. See log for details. ${ NC } " ; return 1;
fi
log " ${ GREEN } [Success] Meson install complete. ${ NC } "
}
2025-07-29 09:05:47 -04:00
2025-07-29 09:25:44 -04:00
run_meson_tests( ) {
log " \n ${ BLUE } --- Running Tests --- ${ NC } "
if [ ! -d " $BUILD_DIR " ] ; then
log " ${ RED } [FATAL] Build directory not found. Run setup and compile first. ${ NC } " ; return 1;
fi
log " ${ BLUE } [Info] Running meson test... ${ NC } "
if ! meson test -C " ${ BUILD_DIR } " ; then
log " ${ RED } [FATAL] Meson tests failed. See log for details. ${ NC } " ; return 1;
fi
log " ${ GREEN } [Success] Tests passed. ${ NC } "
2025-07-29 09:05:47 -04:00
}
2025-07-29 09:25:44 -04:00
# --- TUI Functions ---
check_dialog_installed( ) {
if ! check_command dialog; then
log " ${ YELLOW } [Warn] The 'dialog' utility is required for TUI mode. ${ NC } "
2025-07-29 09:05:47 -04:00
local install_cmd
install_cmd = $( get_install_cmd "dialog" )
if [ -n " $install_cmd " ] ; then
2025-07-29 09:25:44 -04:00
if prompt_yes_no "Attempt to install it now? (y/n):" ; then
2025-07-29 09:05:47 -04:00
eval " $install_cmd "
2025-07-29 09:25:44 -04:00
if ! check_command dialog; then
2025-07-29 09:05:47 -04:00
log " ${ RED } [FATAL] Failed to install 'dialog'. Cannot run in TUI mode. ${ NC } "
2025-07-29 09:25:44 -04:00
return 1
2025-07-29 09:05:47 -04:00
fi
else
log " ${ RED } [FATAL] Cannot run in TUI mode without 'dialog'. Exiting. ${ NC } "
2025-07-29 09:25:44 -04:00
return 1
2025-07-29 09:05:47 -04:00
fi
else
2025-07-29 09:25:44 -04:00
log " ${ RED } [FATAL] Cannot auto-install 'dialog'. Please install it manually. ${ NC } "
return 1
2025-07-29 09:05:47 -04:00
fi
fi
2025-07-29 09:25:44 -04:00
return 0
}
run_dependency_installer_tui( ) {
declare -A DEP_STATUS
check_compiler; DEP_STATUS[ compiler] = $?
check_python_dev; DEP_STATUS[ python-dev] = $?
check_cmake; DEP_STATUS[ cmake] = $?
check_meson; DEP_STATUS[ meson] = $?
check_boost; DEP_STATUS[ boost] = $?
2025-07-29 09:05:47 -04:00
local choices
choices = $( dialog --clear --backtitle "Project Dependency Installer" \
2025-07-29 09:25:44 -04:00
--title "Install System Dependencies" \
--checklist "Select dependencies to install. Already found dependencies are unchecked." 20 70 5 \
"compiler" "C++ Compiler (g++ or clang++)" " $( [ [ ${ DEP_STATUS [compiler] } -ne 0 ] ] && echo "on" || echo "off" ) " \
"python-dev" "Python 3 Dev Headers" " $( [ [ ${ DEP_STATUS [python-dev] } -ne 0 ] ] && echo "on" || echo "off" ) " \
"cmake" "CMake" " $( [ [ ${ DEP_STATUS [cmake] } -ne 0 ] ] && echo "on" || echo "off" ) " \
"meson" "Meson Build System" " $( [ [ ${ DEP_STATUS [meson] } -ne 0 ] ] && echo "on" || echo "off" ) " \
"boost" "Boost Libraries" " $( [ [ ${ DEP_STATUS [boost] } -ne 0 ] ] && echo "on" || echo "off" ) " \
2025-07-29 09:05:47 -04:00
3>& 1 1>& 2 2>& 3)
clear
2025-07-29 09:25:44 -04:00
if [ -z " $choices " ] ; then log " ${ YELLOW } [Info] No dependencies selected. ${ NC } " ; return ; fi
2025-07-29 09:05:47 -04:00
for choice in $choices ; do
2025-07-29 09:25:44 -04:00
local dep; dep = $( echo " $choice " | tr -d '"' )
2025-07-29 09:05:47 -04:00
log " \n ${ BLUE } --- Installing ${ dep } --- ${ NC } "
2025-07-29 09:25:44 -04:00
local install_cmd; install_cmd = $( get_install_cmd " $dep " )
2025-07-29 09:05:47 -04:00
if [ -n " $install_cmd " ] ; then
2025-07-29 09:25:44 -04:00
eval " $install_cmd " 2>& 1 | tee -a " $LOGFILE "
2025-07-29 09:05:47 -04:00
else
2025-07-29 09:25:44 -04:00
log " ${ RED } [Error] No automatic installation command for ' ${ dep } '. Please install manually. ${ NC } "
dialog --msgbox " Could not find an automatic installation command for ' ${ dep } ' on your system. Please install it manually. " 8 60
2025-07-29 09:05:47 -04:00
fi
done
}
2025-07-29 09:25:44 -04:00
run_python_bindings_tui( ) {
local python_exec
python_exec = $( command -v python3)
if [ -z " $python_exec " ] ; then
dialog --msgbox "Could not find 'python3' executable. Please ensure Python 3 is installed and in your PATH." 8 60
return
fi
local choice
choice = $( dialog --clear --backtitle "Python Bindings Installer" \
--title "Install Python Bindings" \
--menu " Using Python: ${ python_exec } \n\nSelect installation mode: " 15 70 2 \
"1" "Developer Mode (pip install -e .)" \
"2" "User Mode (pip install .)" \
3>& 1 1>& 2 2>& 3)
clear
case " $choice " in
1)
log " ${ BLUE } [Info] Installing Python bindings in Developer Mode... ${ NC } "
if ! pip install -e . --no-build-isolation -vv; then
log " ${ RED } [Error] Failed to install Python bindings in developer mode. ${ NC } "
dialog --msgbox "Developer mode installation failed. Check the log for details." 8 60
else
log " ${ GREEN } [Success] Python bindings installed in developer mode. ${ NC } "
dialog --msgbox "Successfully installed Python bindings in developer mode." 8 60
fi
; ;
2)
log " ${ BLUE } [Info] Installing Python bindings in User Mode... ${ NC } "
if ! pip install .; then
log " ${ RED } [Error] Failed to install Python bindings in user mode. ${ NC } "
dialog --msgbox "User mode installation failed. Check the log for details." 8 60
else
log " ${ GREEN } [Success] Python bindings installed in user mode. ${ NC } "
dialog --msgbox "Successfully installed Python bindings in user mode." 8 60
fi
; ;
*)
log " ${ YELLOW } [Info] Python binding installation cancelled. ${ NC } "
; ;
esac
}
run_build_config_tui( ) {
local choice
choice = $( dialog --clear --backtitle "Build Configuration" \
--title "Configure Build Options" \
--menu "Select an option to configure:" 20 70 6 \
"1" " Build Directory (current: ${ BUILD_DIR } ) " \
"2" " Install Prefix (current: ${ INSTALL_PREFIX } ) " \
"3" " Build Type (current: ${ MESON_BUILD_TYPE } ) " \
"4" " Log Level (current: ${ MESON_LOG_LEVEL } ) " \
"5" " Generate pkg-config (current: ${ MESON_PKG_CONFIG } ) " \
"6" " Number of Cores (current: ${ MESON_NUM_CORES } ) " \
3>& 1 1>& 2 2>& 3)
clear
case " $choice " in
1)
local new_dir
new_dir = $( dialog --title "Set Build Directory" --inputbox "Enter new build directory name:" 10 60 " ${ BUILD_DIR } " 3>& 1 1>& 2 2>& 3)
if [ -n " $new_dir " ] ; then
BUILD_DIR = " $new_dir "
log " ${ BLUE } [Config] Set build directory to: ${ BUILD_DIR } ${ NC } "
fi
; ;
2)
local new_prefix
new_prefix = $( dialog --title "Set Install Prefix" --inputbox "Enter absolute path for installation prefix:" 10 60 " ${ INSTALL_PREFIX } " 3>& 1 1>& 2 2>& 3)
if [ -n " $new_prefix " ] ; then
INSTALL_PREFIX = " $new_prefix "
log " ${ BLUE } [Config] Set install prefix to: ${ INSTALL_PREFIX } ${ NC } "
fi
; ;
3)
local build_type_choice
build_type_choice = $( dialog --title "Select Build Type" --menu "" 15 70 3 \
"release" "Optimized for performance" \
"debug" "With debug symbols, no optimization" \
"debugoptimized" "With debug symbols and optimization" \
3>& 1 1>& 2 2>& 3)
if [ -n " $build_type_choice " ] ; then
MESON_BUILD_TYPE = " $build_type_choice "
log " ${ BLUE } [Config] Set build type to: ${ MESON_BUILD_TYPE } ${ NC } "
fi
; ;
4)
local log_level_choice
log_level_choice = $( dialog --title "Select Log Level" --menu "" 15 70 8 \
"traceL3" "" "traceL2" "" "traceL1" "" "debug" "" "info" "" "warning" "" "error" "" "critical" "" \
3>& 1 1>& 2 2>& 3)
if [ -n " $log_level_choice " ] ; then
MESON_LOG_LEVEL = " $log_level_choice "
log " ${ BLUE } [Config] Set log level to: ${ MESON_LOG_LEVEL } ${ NC } "
fi
; ;
5)
if dialog --title "Generate pkg-config" --yesno "Generate gridfire.pc file?" 7 60; then
MESON_PKG_CONFIG = "true"
else
MESON_PKG_CONFIG = "false"
fi
log " ${ BLUE } [Config] Set pkg-config generation to: ${ MESON_PKG_CONFIG } ${ NC } "
; ;
6)
local max_cores; max_cores = $( getconf _NPROCESSORS_ONLN 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1)
local core_choice
core_choice = $( dialog --title "Set Number of Cores" --inputbox " Enter number of cores for compilation.\nAvailable: ${ max_cores } " 10 60 " ${ MESON_NUM_CORES } " 3>& 1 1>& 2 2>& 3)
if [ [ " $core_choice " = ~ ^[ 0-9] +$ ] ] && [ " $core_choice " -gt 0 ] ; then
MESON_NUM_CORES = " $core_choice "
log " ${ BLUE } [Config] Set number of cores to: ${ MESON_NUM_CORES } ${ NC } "
elif [ -n " $core_choice " ] ; then
dialog --msgbox "Invalid input. Please enter a positive number." 6 40
fi
; ;
esac
}
run_main_tui( ) {
if ! check_dialog_installed; then return 1; fi
while true; do
local build_dir_status = "Not Found"
[ -d " $BUILD_DIR " ] && build_dir_status = "Found"
local choice
choice = $( dialog --clear --backtitle "GridFire Installation and Build Manager" \
--title "Main Menu" \
--menu " DIR: ${ BUILD_DIR } | TYPE: ${ MESON_BUILD_TYPE } | CORES: ${ MESON_NUM_CORES } \nPREFIX: ${ INSTALL_PREFIX } \nLOG: ${ MESON_LOG_LEVEL } | PKG-CONFIG: ${ MESON_PKG_CONFIG } " 20 70 10 \
"1" "Install System Dependencies" \
"2" "Configure Build Options" \
"3" "Install Python Bindings" \
"4" "Run Full Build (Setup + Compile)" \
"5" "Run Meson Setup/Reconfigure" \
"6" "Run Meson Compile" \
"7" "Run Meson Install (requires sudo)" \
"8" "Run Tests" \
"9" "Exit" \
3>& 1 1>& 2 2>& 3)
clear
case " $choice " in
1) run_dependency_installer_tui ; ;
2) run_build_config_tui ; ;
3) run_python_bindings_tui ; ;
4) run_meson_setup && run_meson_compile ; ;
5) run_meson_setup ; ;
6) run_meson_compile ; ;
7) run_meson_install ; ;
8) run_meson_tests ; ;
9) break ; ;
*) log " ${ YELLOW } [Info] TUI cancelled. ${ NC } " ; break ; ;
esac
done
clear
}
2025-07-29 09:05:47 -04:00
# --- Script Entry Point ---
main( ) {
2025-07-29 09:25:44 -04:00
if [ [ " $@ " = ~ " --help " ] ] || [ [ " $@ " = ~ " -h " ] ] ; then show_help; exit 0; fi
if [ [ " $@ " = ~ " --clean " ] ] ; then log " ${ BLUE } [Info] Cleaning up... ${ NC } " ; rm -rf " $BUILD_DIR " " $LOGFILE " ; fi
2025-07-29 09:05:47 -04:00
2025-07-29 09:25:44 -04:00
echo "" > " $LOGFILE " # Clear log file
log "--- GridFire Installation Log ---"
2025-07-29 09:05:47 -04:00
log " Date: $( date) "
log " OS: ${ OS_NAME } , Distro: ${ DISTRO_ID } "
2025-07-29 09:25:44 -04:00
if [ [ " $@ " = ~ " --tui " ] ] ; then
run_main_tui
log " ${ GREEN } Exited TUI mode. ${ NC } "
2025-07-29 09:05:47 -04:00
exit 0
fi
2025-07-29 09:25:44 -04:00
# --- Non-TUI path ---
log " \n ${ BLUE } --- Checking System Dependencies (CLI Mode) --- ${ NC } "
declare -A CHECKS = (
[ compiler] = "check_compiler" [ python-dev] = "check_python_dev"
[ cmake] = "check_cmake" [ meson] = "check_meson" [ boost] = "check_boost"
)
local all_deps_met = true
for dep in " ${ !CHECKS[@] } " ; do
if ! ${ CHECKS [ $dep ] } ; then
all_deps_met = false
local install_cmd; install_cmd = $( get_install_cmd " $dep " )
if [ -n " $install_cmd " ] ; then
if prompt_yes_no " Dependency ' ${ dep } ' is missing. Attempt to install? (y/n): " ; then
run_install_cmd " $install_cmd "
fi
else
log " ${ RED } [Error] No automatic installation for ' ${ dep } '. Please install manually. ${ NC } "
2025-07-29 09:05:47 -04:00
fi
fi
2025-07-29 09:25:44 -04:00
done
2025-07-29 09:05:47 -04:00
2025-07-29 09:25:44 -04:00
log " \n ${ BLUE } --- Re-checking all dependencies --- ${ NC } "
local final_fail = false
for dep in " ${ !CHECKS[@] } " ; do
if ! ${ CHECKS [ $dep ] } ; then
log " ${ RED } [FATAL] Dependency still missing: ${ dep } ${ NC } "
final_fail = true
fi
2025-07-29 09:05:47 -04:00
done
2025-07-29 09:25:44 -04:00
if $final_fail ; then
log " ${ RED } Please install missing dependencies and re-run. ${ NC } "
exit 1
2025-07-29 09:05:47 -04:00
fi
2025-07-29 09:25:44 -04:00
log " \n ${ GREEN } --- All dependencies met. Proceeding with build. --- ${ NC } "
run_meson_setup && run_meson_compile
2025-07-29 09:05:47 -04:00
}
main " $@ "