build(console): added simple bash console
added a simple bash console to handle meson commands and tests
This commit is contained in:
205
4DSSEConsole.sh
Executable file
205
4DSSEConsole.sh
Executable file
@@ -0,0 +1,205 @@
|
||||
#!/bin/bash
|
||||
|
||||
# --- Functions ---
|
||||
|
||||
# Display the main menu
|
||||
display_menu() {
|
||||
clear # Clear the screen for a clean menu
|
||||
echo "--- Project Install Console ---"
|
||||
echo "1. Reconfigure (with tests)"
|
||||
echo "2. Reconfigure (without tests)"
|
||||
echo "3. Build"
|
||||
echo "4. Run Tests"
|
||||
echo "5. Run Test with gdb (Specify test name)"
|
||||
echo "6. Wipe (Clean build directory)"
|
||||
echo "7. Generate Documentation" # Added documentation option
|
||||
echo "8. Exit"
|
||||
echo "-------------------------------"
|
||||
echo -n "Enter your choice [1-8]: "
|
||||
}
|
||||
|
||||
# Reconfigure the project (meson setup)
|
||||
reconfigure() {
|
||||
local test_flag="$1" # Use local to avoid global variable pollution
|
||||
|
||||
if [[ "$test_flag" == "true" ]]; then
|
||||
meson setup build -Dbuild_tests=true --buildtype=debug
|
||||
else
|
||||
meson setup build -Dbuild_tests=false --buildtype=release
|
||||
fi
|
||||
|
||||
if [[ $? -eq 0 ]]; then # Check exit code for success
|
||||
echo "Reconfiguration successful."
|
||||
else
|
||||
echo "Reconfiguration failed."
|
||||
return 1 # Return a non-zero exit code to signal failure
|
||||
fi
|
||||
}
|
||||
|
||||
# Build the project
|
||||
build_project() {
|
||||
meson compile -C build
|
||||
|
||||
if [[ $? -eq 0 ]]; then
|
||||
echo "Build successful."
|
||||
else
|
||||
echo "Build failed."
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Run tests
|
||||
run_tests() {
|
||||
meson test -C build
|
||||
|
||||
if [[ $? -eq 0 ]]; then
|
||||
echo "Tests passed." # More specific message.
|
||||
else
|
||||
echo "Tests failed."
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Run a specific test with GDB
|
||||
run_test_gdb() {
|
||||
local test_dir="build/tests" # Store the base test directory
|
||||
local selected_test=""
|
||||
local test_options=()
|
||||
local test_index=1
|
||||
local choice
|
||||
|
||||
# --- Find test executables ---
|
||||
# Use find to get a list of potential test executables, *excluding* .p and .cpp.o files
|
||||
# We sort it for consistent ordering. The '-type f' ensures we only find files.
|
||||
# The '-executable' ensures the files are actually executable.
|
||||
find "$test_dir" -type f -executable \
|
||||
! -name "*.p" ! -name "*.cpp.o" ! -name "*.h.gch" | sort | while read -r file; do
|
||||
# Remove the 'build/tests/' prefix and the file extension
|
||||
test_name=$(basename "$file")
|
||||
test_options+=("$test_name")
|
||||
echo "$test_index. $test_name"
|
||||
test_index=$((test_index + 1))
|
||||
done
|
||||
|
||||
# Check if any tests were found
|
||||
if [[ ${#test_options[@]} -eq 0 ]]; then
|
||||
echo "No test executables found in build/tests."
|
||||
return 1
|
||||
fi
|
||||
|
||||
# --- Prompt for test selection ---
|
||||
echo "-------------------------------"
|
||||
echo -n "Enter the number of the test to debug (or 0 to cancel): "
|
||||
read -r choice
|
||||
|
||||
# --- Input Validation ---
|
||||
if ! [[ "$choice" =~ ^[0-9]+$ ]]; then # Check if input is a number
|
||||
echo "Invalid input. Please enter a number."
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ "$choice" -eq 0 ]]; then
|
||||
echo "Test selection cancelled."
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ "$choice" -lt 1 || "$choice" -gt ${#test_options[@]} ]]; then
|
||||
echo "Invalid test number. Please enter a number within the valid range."
|
||||
return 1
|
||||
fi
|
||||
|
||||
# --- Get the selected test name ---
|
||||
selected_test="${test_options[$((choice - 1))]}" # Adjust for 0-based array indexing
|
||||
|
||||
# --- Run GDB ---
|
||||
# Construct full path. More reliable than changing directories.
|
||||
local full_test_path="$test_dir/$selected_test"
|
||||
|
||||
if [[ ! -x "$full_test_path" ]]; then
|
||||
echo "Error: Test executable '$full_test_path' not found or not executable."
|
||||
return 1
|
||||
fi
|
||||
|
||||
gdb --args "$full_test_path"
|
||||
|
||||
}
|
||||
|
||||
# Wipe the build directory
|
||||
wipe_build() {
|
||||
echo -n "Are you sure you want to wipe the build directory? (y/N): "
|
||||
read -r confirm
|
||||
|
||||
if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then
|
||||
rm -rf build
|
||||
echo "Build directory wiped."
|
||||
else
|
||||
echo "Wipe cancelled."
|
||||
fi
|
||||
}
|
||||
|
||||
generate_docs() {
|
||||
echo "Generating documentation..."
|
||||
doxygen
|
||||
if [[ $? -ne 0 ]]; then # Check if doxygen succeeded
|
||||
echo "Error: Doxygen failed."
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ -d docs/latex ]]; then #Check if directory exist
|
||||
cd docs/latex || return #cd into docs/latex and exit the function if unsuccesful
|
||||
make
|
||||
if [[ $? -ne 0 ]]; then #Check make
|
||||
echo "Error: make in docs/latex failed."
|
||||
cd ../.. || exit #go back, or exit the script if it fails
|
||||
return 1
|
||||
fi
|
||||
cd ../.. || exit # Go back to the project root
|
||||
else
|
||||
echo "Warning: docs/latex directory not found. Skipping LaTeX build."
|
||||
fi
|
||||
|
||||
echo "Documentation generated."
|
||||
}
|
||||
|
||||
# --- Main Loop ---
|
||||
|
||||
while true; do
|
||||
display_menu
|
||||
read -r choice
|
||||
|
||||
case "$choice" in
|
||||
1)
|
||||
reconfigure "true"
|
||||
;;
|
||||
2)
|
||||
reconfigure "false"
|
||||
;;
|
||||
3)
|
||||
build_project
|
||||
;;
|
||||
4)
|
||||
run_tests
|
||||
;;
|
||||
5)
|
||||
run_test_gdb
|
||||
;;
|
||||
6)
|
||||
wipe_build
|
||||
;;
|
||||
7)
|
||||
generate_docs
|
||||
;;
|
||||
8)
|
||||
echo "Exiting..."
|
||||
break # Exit the while loop
|
||||
;;
|
||||
*)
|
||||
echo "Invalid choice. Please enter a number between 1 and 8."
|
||||
;;
|
||||
esac
|
||||
|
||||
echo -n "Press Enter to continue..."
|
||||
read -r # Wait for Enter key press
|
||||
done
|
||||
|
||||
exit 0 #Good practice
|
||||
Reference in New Issue
Block a user