#!/bin/sh # Author: Jake Goodwin # Date: 2024 # Filename: otto.sh USERNAME="Jake G" CROSS_TC_WIN="$(pwd)/i686-w64-mingw32_toolchain.cmake" CMAKE_VERBOSE="ON" CROSS_COMPILE=1 TEMPLATE_FILES=".template_files" MODULE_DIR="${TEMPLATE_FILES}/modules" clear_cmake_cache () { cd ./build rm -rf CMakeCache.txt CMakeFiles/ } does_module_exist () { local basename="$1" if [ -d "src/${basename}" ]; then echo "1" else echo "0" fi } add_module_to_cmakes () { local basename="$1" echo "add_subdirectory(${basename})" >> ./src/CMakeLists.txt echo "add_subdirectory(${basename})" >> ./tests/CMakeLists.txt } remove_module_from_cmakes () { local basename="$1" sed "s/^.*add_subdirectory(${basename}).*$//g" ./src/CMakeLists.txt > ./src/CMakeLists.txt sed "s/^.*add_subdirectory(${basename}).*$//g" ./tests/CMakeLists.txt > ./tests/CMakeLists.txt } git_add_module () { local basename="$1" read -p "Auto add to git?(y/n):" CHOICE if [ "${CHOICE}" -eq "n" ]; then echo "not being added!" return 0 fi modsrc_dir="./src/${basename}" modtest_dir="./tests/${basename}" # Now we add the new files to the git tracked files git add ${modsrc_dir}/* git add ${modsrc_dir} git add ${modtest_dir}/* git add ${modtest_dir} git add ./src/CMakeLists.txt git add ./tests/CMakeLists.txt } git_remove_module () { local basename="$1" read -p "Auto del from git?(y/n):" CHOICE if [ "${CHOICE}" -eq "n" ]; then echo "not being removed!" return 0 fi modsrc_dir="./src/${basename}" modtest_dir="./tests/${basename}" # Now we add the new files to the git tracked files git rm -r ${modsrc_dir}/* git rm -r ${modsrc_dir} git rm -r ${modtest_dir}/* git rm -r ${modtest_dir} git rm -r ./src/CMakeLists.txt git rm -r ./tests/CMakeLists.txt } add_new_source_files () { local modname="$1" modname_cap=$(echo $modname | sed 's/[a-z]/\U&/g') modsrc_dir="./src/${modname}" mkdir $modsrc_dir sed "s/module_name/${modname}/" $MODULE_DIR/module_name.c | sed "3s/todays_date/$(date +%Y)/" | sed "s/username/${USERNAME}/" > $modsrc_dir/${modname}.c sed "s/module_name/${modname_cap}/" $MODULE_DIR/module_name.h | sed "3s/todays_date/$(date +%Y)/" $modsrc_dir/${modname}.h | sed "s/username/${USERNAME}/" > $modsrc_dir/${modname}.h sed "s/module_name/${modname}/" $MODULE_DIR/CMakeLists.txt > $modsrc_dir/CMakeLists.txt } add_new_test_files () { local modname="$1" modtest_dir="./tests/${modname}" mkdir $modtest_dir sed "s/module_name/${modname}/" $MODULE_DIR/test_module_name.c sed "3s/todays_date/$(date +%Y)/" | sed "s/username/${USERNAME}/" > $modsrc_dir/test_${modname}.c sed "s/module_name/${modname}/" $MODULE_DIR/TestCMakeLists.txt > $modtest_dir/CMakeLists.txt } add_new_module () { read -p "Enter the name of the module:" modname result=$(does_module_exist "$modname") if [ "${result}" -eq "1" ]; then echo "Module already exists!" echo "Exiting without changing anything" exit fi #copy the template files. echo "copying & customizing template files..." add_new_source_files "$modname" add_new_test_files "$modname" # Add the module to the cmake lists files in /src/ and /tests/ add_module_to_cmakes "${modname}" # Now we add the new files to the git tracked files git_add_module "${modname}" } del_module () { read -p "Enter the name of the module:" modname rm -r ./tests/${modname} rm -r ./src/${modname} remove_module_from_cmakes "${modname}" } cross_compile () { echo "ERROR: Currently no toolchain / target!" } build_release() { clear_cmake_cache cmake -DCAM_HANDLER_LIB=ON -DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE} ../ } build_main () { clear_cmake_cache cmake -DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE} ../ make main } run_c_tests () { clear_cmake_cache cmake -DUNIT_TESTING=ON -DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE} ../ make all && ctest } print_menu () { echo "BUILD MENU:" echo "1. Run Tests" echo "2. Build Project" echo "3. Build for release" echo "4. cross compile for XXXXXX" echo "5. Add new module to project" echo "6. Delete module from project" echo "7. Exit" } main() { valid_choice=false while [ "$valid_choice" != true ]; do print_menu read -p "Enter your choice: " choice case $choice in 1) echo "You selected Option 1" valid_choice=true run_c_tests ;; 2) echo "You selected Option 2" valid_choice=true build_main ;; 3) echo "You selected Option 3" valid_choice=true build_release ;; 4) echo "You selected Option 4" valid_choice=true cross_compile ;; 5) echo "You selected Option 5" valid_choice=true add_new_module ;; 6) echo "You selected Option 6" valid_choice=true del_module ;; 7) echo "Exiting..." exit 0 ;; *) echo "Invalid choice. Please select a valid option." ;; esac done } main