build(install): added more options and save an d load

This commit is contained in:
2025-07-29 11:22:39 -04:00
parent 7ceb997b7d
commit ebc9a50112
3 changed files with 216 additions and 6 deletions

2
.gitignore vendored
View File

@@ -102,3 +102,5 @@ output/
.idea/ .idea/
scratch/ scratch/
meson-boost-test/

View File

@@ -16,6 +16,7 @@ set -o pipefail
# --- Configuration --- # --- Configuration ---
LOGFILE="GridFire_Installer.log" LOGFILE="GridFire_Installer.log"
NOTES_FILE="notes.txt" NOTES_FILE="notes.txt"
CONFIG_FILE="gridfire_build.conf"
MIN_GCC_VER="13.0.0" MIN_GCC_VER="13.0.0"
MIN_CLANG_VER="16.0.0" MIN_CLANG_VER="16.0.0"
MIN_MESON_VER="1.5.0" MIN_MESON_VER="1.5.0"
@@ -31,6 +32,18 @@ C_COMPILER=""
CC_COMPILER="" CC_COMPILER=""
FC_COMPILER="" FC_COMPILER=""
declare -A VALID_COMPILERS declare -A VALID_COMPILERS
declare -A MESON_ADVANCED_OPTS
# --- Initialize default advanced options ---
MESON_ADVANCED_OPTS["b_lto"]="false"
MESON_ADVANCED_OPTS["strip"]="false"
MESON_ADVANCED_OPTS["unity"]="off"
MESON_ADVANCED_OPTS["warning_level"]="1"
MESON_ADVANCED_OPTS["backend"]="ninja"
MESON_ADVANCED_OPTS["werror"]="false"
MESON_ADVANCED_OPTS["b_pch"]="true"
MESON_ADVANCED_OPTS["b_coverage"]="false"
MESON_ADVANCED_OPTS["default_library"]="shared"
# --- ANSI Color Codes --- # --- ANSI Color Codes ---
RED="\033[0;31m" RED="\033[0;31m"
@@ -94,6 +107,7 @@ show_help() {
echo " --tui Run in Text-based User Interface mode for interactive dependency installation and build control." echo " --tui Run in Text-based User Interface mode for interactive dependency installation and build control."
echo " --help, -h Show this help message and exit." echo " --help, -h Show this help message and exit."
echo " --clean Remove the build directory and log file before starting." echo " --clean Remove the build directory and log file before starting."
echo " --config FILE Load a configuration file on startup."
echo echo
echo "The script will automatically detect your OS and suggest the correct package manager commands." echo "The script will automatically detect your OS and suggest the correct package manager commands."
echo "All output is logged to ${LOGFILE}." echo "All output is logged to ${LOGFILE}."
@@ -388,6 +402,11 @@ run_meson_setup() {
meson_opts+=("-Dpkg-config=${MESON_PKG_CONFIG}") meson_opts+=("-Dpkg-config=${MESON_PKG_CONFIG}")
meson_opts+=("--prefix=${INSTALL_PREFIX}") meson_opts+=("--prefix=${INSTALL_PREFIX}")
# Add advanced options
for key in "${!MESON_ADVANCED_OPTS[@]}"; do
meson_opts+=("-D${key}=${MESON_ADVANCED_OPTS[$key]}")
done
log "${BLUE}[Info] Using C compiler: ${C_COMPILER}${NC}" log "${BLUE}[Info] Using C compiler: ${C_COMPILER}${NC}"
log "${BLUE}[Info] Using C++ compiler: ${CC_COMPILER}${NC}" log "${BLUE}[Info] Using C++ compiler: ${CC_COMPILER}${NC}"
log "${BLUE}[Info] Using Fortran compiler: ${FC_COMPILER}${NC}" log "${BLUE}[Info] Using Fortran compiler: ${FC_COMPILER}${NC}"
@@ -611,11 +630,107 @@ run_compiler_selection_tui() {
fi fi
} }
run_advanced_options_tui() {
while true; do
local choice
choice=$(dialog --clear --backtitle "Advanced Build Options" \
--title "Advanced Meson Core & Base Options" \
--menu "Select an option to configure:" 20 78 10 \
"1" "Backend (current: ${MESON_ADVANCED_OPTS[backend]})" \
"2" "Default Library (current: ${MESON_ADVANCED_OPTS[default_library]})" \
"3" "LTO (Link-Time Opt) (current: ${MESON_ADVANCED_OPTS[b_lto]})" \
"4" "PCH (Precompiled H) (current: ${MESON_ADVANCED_OPTS[b_pch]})" \
"5" "Coverage (current: ${MESON_ADVANCED_OPTS[b_coverage]})" \
"6" "Strip on install (current: ${MESON_ADVANCED_OPTS[strip]})" \
"7" "Unity build (current: ${MESON_ADVANCED_OPTS[unity]})" \
"8" "Warning Level (current: ${MESON_ADVANCED_OPTS[warning_level]})" \
"9" "Warnings as Errors (current: ${MESON_ADVANCED_OPTS[werror]})" \
"10" "Back to main config" \
3>&1 1>&2 2>&3)
case "$choice" in
1)
local backend_choice
backend_choice=$(dialog --title "Select Backend" --menu "" 15 70 4 \
"ninja" "Ninja build system" \
"vs" "Visual Studio" \
"xcode" "Xcode" \
"none" "No backend" 3>&1 1>&2 2>&3)
if [ -n "$backend_choice" ]; then MESON_ADVANCED_OPTS["backend"]="$backend_choice"; fi
;;
2)
local lib_choice
lib_choice=$(dialog --title "Default Library Type" --menu "" 15 70 3 \
"shared" "Shared (.so, .dylib)" \
"static" "Static (.a)" \
"both" "Build both types" 3>&1 1>&2 2>&3)
if [ -n "$lib_choice" ]; then MESON_ADVANCED_OPTS["default_library"]="$lib_choice"; fi
;;
3)
if dialog --title "LTO (Link-Time Optimization)" --yesno "Enable Link-Time Optimization?\n(Can improve performance but increases link time)" 8 70; then
MESON_ADVANCED_OPTS["b_lto"]="true"
else
MESON_ADVANCED_OPTS["b_lto"]="false"
fi
;;
4)
if dialog --title "PCH (Precompiled Headers)" --yesno "Use precompiled headers?\n(Can speed up compilation)" 8 70; then
MESON_ADVANCED_OPTS["b_pch"]="true"
else
MESON_ADVANCED_OPTS["b_pch"]="false"
fi
;;
5)
if dialog --title "Enable Coverage Tracking" --yesno "Enable code coverage tracking?\n(For generating coverage reports)" 8 70; then
MESON_ADVANCED_OPTS["b_coverage"]="true"
else
MESON_ADVANCED_OPTS["b_coverage"]="false"
fi
;;
6)
if dialog --title "Strip on Install" --yesno "Strip binaries on install?\n(Reduces size, removes debug symbols)" 8 70; then
MESON_ADVANCED_OPTS["strip"]="true"
else
MESON_ADVANCED_OPTS["strip"]="false"
fi
;;
7)
local unity_choice
unity_choice=$(dialog --title "Unity Build" --menu "" 15 70 3 \
"on" "Enable for all targets" \
"subprojects" "Enable for subprojects only" \
"off" "Disable unity builds" 3>&1 1>&2 2>&3)
if [ -n "$unity_choice" ]; then MESON_ADVANCED_OPTS["unity"]="$unity_choice"; fi
;;
8)
local warn_choice
warn_choice=$(dialog --title "Compiler Warning Level" --menu "" 15 70 5 \
"0" "No warnings" \
"1" "Normal warnings" \
"2" "More warnings" \
"3" "All warnings" \
"everything" "Pedantic warnings" 3>&1 1>&2 2>&3)
if [ -n "$warn_choice" ]; then MESON_ADVANCED_OPTS["warning_level"]="$warn_choice"; fi
;;
9)
if dialog --title "Treat Warnings as Errors" --yesno "Enable -Werror?\n(Build will fail on any compiler warning)" 8 70; then
MESON_ADVANCED_OPTS["werror"]="true"
else
MESON_ADVANCED_OPTS["werror"]="false"
fi
;;
10) break ;;
*) break ;;
esac
done
}
run_build_config_tui() { run_build_config_tui() {
local choice local choice
choice=$(dialog --clear --backtitle "Build Configuration" \ choice=$(dialog --clear --backtitle "Build Configuration" \
--title "Configure Build Options" \ --title "Configure Build Options" \
--menu "Select an option to configure:" 20 70 7 \ --menu "Select an option to configure:" 20 70 8 \
"1" "Build Directory (current: ${BUILD_DIR})" \ "1" "Build Directory (current: ${BUILD_DIR})" \
"2" "Install Prefix (current: ${INSTALL_PREFIX})" \ "2" "Install Prefix (current: ${INSTALL_PREFIX})" \
"3" "Manage & Select C/C++/Fortran Compiler" \ "3" "Manage & Select C/C++/Fortran Compiler" \
@@ -623,6 +738,7 @@ run_build_config_tui() {
"5" "Log Level (current: ${MESON_LOG_LEVEL})" \ "5" "Log Level (current: ${MESON_LOG_LEVEL})" \
"6" "Generate pkg-config (current: ${MESON_PKG_CONFIG})" \ "6" "Generate pkg-config (current: ${MESON_PKG_CONFIG})" \
"7" "Number of Cores (current: ${MESON_NUM_CORES})" \ "7" "Number of Cores (current: ${MESON_NUM_CORES})" \
"8" "Advanced Build Options" \
3>&1 1>&2 2>&3) 3>&1 1>&2 2>&3)
clear clear
@@ -688,6 +804,9 @@ run_build_config_tui() {
dialog --msgbox "Invalid input. Please enter a positive number." 6 40 dialog --msgbox "Invalid input. Please enter a positive number." 6 40
fi fi
;; ;;
8)
run_advanced_options_tui
;;
esac esac
} }
@@ -705,7 +824,6 @@ run_notes_tui() {
if [[ -z "$line" || "$line" =~ ^[[:space:]]*# ]]; then if [[ -z "$line" || "$line" =~ ^[[:space:]]*# ]]; then
continue continue
fi fi
echo "$line"
notes_content+="${counter}. ${line}\n\n" notes_content+="${counter}. ${line}\n\n"
((counter++)) ((counter++))
done < "$NOTES_FILE" done < "$NOTES_FILE"
@@ -717,6 +835,66 @@ run_notes_tui() {
fi fi
} }
run_save_config_tui() {
local file_to_save
file_to_save=$(dialog --title "Save Configuration" --inputbox "Enter filename to save configuration:" 10 60 "$CONFIG_FILE" 3>&1 1>&2 2>&3)
if [ -z "$file_to_save" ]; then
dialog --msgbox "Save cancelled." 8 50
return
fi
# Write main settings
{
echo "# GridFire Build Configuration"
echo "BUILD_DIR=\"$BUILD_DIR\""
echo "INSTALL_PREFIX=\"$INSTALL_PREFIX\""
echo "MESON_BUILD_TYPE=\"$MESON_BUILD_TYPE\""
echo "MESON_LOG_LEVEL=\"$MESON_LOG_LEVEL\""
echo "MESON_PKG_CONFIG=\"$MESON_PKG_CONFIG\""
echo "MESON_NUM_CORES=\"$MESON_NUM_CORES\""
echo "C_COMPILER=\"$C_COMPILER\""
echo "CC_COMPILER=\"$CC_COMPILER\""
echo "FC_COMPILER=\"$FC_COMPILER\""
echo ""
echo "# Advanced Meson Options"
for key in "${!MESON_ADVANCED_OPTS[@]}"; do
echo "MESON_ADVANCED_OPTS[\"$key\"]=\"${MESON_ADVANCED_OPTS[$key]}\""
done
} > "$file_to_save"
dialog --title "Success" --msgbox "Configuration saved to:\n${file_to_save}" 8 60
}
run_load_config_tui() {
local file_to_load
file_to_load=$(dialog --title "Load Configuration" --inputbox "Enter filename to load configuration:" 10 60 "$CONFIG_FILE" 3>&1 1>&2 2>&3)
if [ -z "$file_to_load" ]; then
dialog --msgbox "Load cancelled." 8 50
return
fi
if [ ! -f "$file_to_load" ]; then
dialog --msgbox "Error: File not found:\n${file_to_load}" 8 60
return
fi
# Source the file to load the variables
# We need to re-declare the associative array for it to be populated by source
declare -A MESON_ADVANCED_OPTS
# shellcheck source=/dev/null
. "$file_to_load"
# Re-validate the compiler
check_compiler
if ! check_command "$CC_COMPILER"; then
dialog --title "Warning" --msgbox "Compiler '${CC_COMPILER}' from config file not found.\nRe-detecting a valid compiler." 10 60
check_compiler
fi
dialog --title "Success" --msgbox "Configuration loaded from:\n${file_to_load}" 8 60
}
run_main_tui() { run_main_tui() {
if ! check_dialog_installed; then return 1; fi if ! check_dialog_installed; then return 1; fi
# Initial check to populate compiler list and set a default # Initial check to populate compiler list and set a default
@@ -731,7 +909,7 @@ run_main_tui() {
local choice local choice
choice=$(dialog --clear --backtitle "GridFire Installer - [${sudo_status}]" \ choice=$(dialog --clear --backtitle "GridFire Installer - [${sudo_status}]" \
--title "Main Menu" \ --title "Main Menu" \
--menu "C: ${C_COMPILER:-N/A} C++: ${CC_COMPILER:-N/A} FC: ${FC_COMPILER:-N/A}\nDIR: ${BUILD_DIR} | TYPE: ${MESON_BUILD_TYPE} | CORES: ${MESON_NUM_CORES}\nPREFIX: ${INSTALL_PREFIX}\nLOG: ${MESON_LOG_LEVEL} | PKG-CONFIG: ${MESON_PKG_CONFIG}" 22 78 11 \ --menu "C: ${C_COMPILER:-N/A} C++: ${CC_COMPILER:-N/A} FC: ${FC_COMPILER:-N/A}\nDIR: ${BUILD_DIR} | TYPE: ${MESON_BUILD_TYPE} | CORES: ${MESON_NUM_CORES}\nPREFIX: ${INSTALL_PREFIX}\nLOG: ${MESON_LOG_LEVEL} | PKG-CONFIG: ${MESON_PKG_CONFIG}" 24 78 13 \
"1" "Install System Dependencies" \ "1" "Install System Dependencies" \
"2" "Configure Build Options" \ "2" "Configure Build Options" \
"3" "Install Python Bindings" \ "3" "Install Python Bindings" \
@@ -741,7 +919,9 @@ run_main_tui() {
"7" "Run Meson Install (requires sudo)" \ "7" "Run Meson Install (requires sudo)" \
"8" "Run Tests" \ "8" "Run Tests" \
"9" "View Notes" \ "9" "View Notes" \
"10" "Exit" \ "10" "Save Configuration" \
"11" "Load Configuration" \
"12" "Exit" \
3>&1 1>&2 2>&3) 3>&1 1>&2 2>&3)
clear clear
@@ -755,7 +935,9 @@ run_main_tui() {
7) run_meson_install ;; 7) run_meson_install ;;
8) run_meson_tests ;; 8) run_meson_tests ;;
9) run_notes_tui ;; 9) run_notes_tui ;;
10) break ;; 10) run_save_config_tui ;;
11) run_load_config_tui ;;
12) break ;;
*) log "${YELLOW}[Info] TUI cancelled.${NC}"; break ;; *) log "${YELLOW}[Info] TUI cancelled.${NC}"; break ;;
esac esac
done done
@@ -764,7 +946,9 @@ run_main_tui() {
# --- Script Entry Point --- # --- Script Entry Point ---
main() { main() {
# shellcheck disable=SC2199
if [[ " $@ " =~ " --help " ]] || [[ " $@ " =~ " -h " ]]; then show_help; exit 0; fi if [[ " $@ " =~ " --help " ]] || [[ " $@ " =~ " -h " ]]; then show_help; exit 0; fi
# shellcheck disable=SC2199
if [[ " $@ " =~ " --clean " ]]; then log "${BLUE}[Info] Cleaning up...${NC}"; rm -rf "$BUILD_DIR" "$LOGFILE"; fi if [[ " $@ " =~ " --clean " ]]; then log "${BLUE}[Info] Cleaning up...${NC}"; rm -rf "$BUILD_DIR" "$LOGFILE"; fi
echo "" > "$LOGFILE" # Clear log file echo "" > "$LOGFILE" # Clear log file
@@ -773,11 +957,34 @@ main() {
log "OS: ${OS_NAME}, Distro: ${DISTRO_ID}" log "OS: ${OS_NAME}, Distro: ${DISTRO_ID}"
if [[ " $@ " =~ " --tui " ]]; then if [[ " $@ " =~ " --tui " ]]; then
log "${BLUE}[Info] Running in TUI mode...${NC}"
run_main_tui run_main_tui
log "${GREEN}Exited TUI mode.${NC}"
exit 0 exit 0
fi fi
# Handle --config argument
while [ $# -gt 0 ]; do
case "$1" in
--config)
if [ -f "$2" ]; then
log "${BLUE}[Info] Loading configuration from $2...${NC}"
declare -A MESON_ADVANCED_OPTS
# shellcheck source=/dev/null
. "$2"
else
log "${RED}[Error] Configuration file not found: $2${NC}"
exit 1
fi
shift 2
;;
*)
shift
;;
esac
done
# --- Non-TUI path --- # --- Non-TUI path ---
log "\n${BLUE}--- Checking System Dependencies (CLI Mode) ---${NC}" log "\n${BLUE}--- Checking System Dependencies (CLI Mode) ---${NC}"
# Run check_compiler first to set the default # Run check_compiler first to set the default

View File

@@ -2,5 +2,6 @@ The logical flow of using this installer is (for C++ usage): install system depe
The logical flow of using this installer is (for Python usage): install system dependencies > "Install Python Bindings" (note this will take a while). The logical flow of using this installer is (for Python usage): install system dependencies > "Install Python Bindings" (note this will take a while).
When building in release mode (default), static analysis of CppAD throws a few bounds warnings. Testing indicates that these are not problems. These warnings do not get identified in debug builds. When building in release mode (default), static analysis of CppAD throws a few bounds warnings. Testing indicates that these are not problems. These warnings do not get identified in debug builds.
GridFire requires gcc >= 13.0.0 or clang >= 16.0.0 GridFire requires gcc >= 13.0.0 or clang >= 16.0.0
A directory named meson-boost-test will be created in the build directory. This is used to test the boost installation and may be deleted after the build is complete.
GridFire is authored by the 4D-STAR collaboration and Emily M. Boudreaux. GridFire is authored by the 4D-STAR collaboration and Emily M. Boudreaux.
4D-STAR is funded by European Research Council (ERC) under the Horizon Europe programme (Synergy Grant agreement No. 101071505: 4D-STAR). Work for this project is funded by the European Union. Views and opinions expressed are however those of the author(s) only and do not necessarily reflect those of the European Union or the European Research Council. 4D-STAR is funded by European Research Council (ERC) under the Horizon Europe programme (Synergy Grant agreement No. 101071505: 4D-STAR). Work for this project is funded by the European Union. Views and opinions expressed are however those of the author(s) only and do not necessarily reflect those of the European Union or the European Research Council.