cmake_cpputest_template/otto.sh

269 lines
6.4 KiB
Bash
Raw Normal View History

2024-03-07 05:06:20 +00:00
#!/bin/sh
# Author: Jake Goodwin
# Date: 2024
# Filename: otto.sh
2024-06-14 22:08:29 +00:00
AVR_TC="$(pwd)/avr-gcc-toolchain.cmake"
2024-03-07 05:06:20 +00:00
CMAKE_VERBOSE="ON"
CROSS_COMPILE=1
TEMPLATE_FILES=".template_files"
MODULE_DIR="${TEMPLATE_FILES}/modules"
add_compile_commands () {
if [ -f ./compile_commands.json ]; then
echo "compile_commands.json already exists!\n"
else
echo "Creating new symlink for compile commands!\n"
ln -s ./build/compile_commands.json ./compile_commands.json
fi
}
2024-03-07 05:06:20 +00:00
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
# Tests cmake file needs to be edited in place.
sed -i'' "s/# TEST_DIRS.*$/# TEST_DIRS\r\nadd_subdirectory(${basename})/g" ./tests/CMakeLists.txt
2024-03-20 20:43:03 +00:00
sed -i'' "s/# TEST_LINKS.*$/# TEST_LINKS\r\n\t${basename}/g" ./tests/CMakeLists.txt
2024-03-07 05:06:20 +00:00
}
remove_module_from_cmakes () {
local basename="$1"
sed -i'' "s/^.*add_subdirectory(${basename}).*$//g" ./src/CMakeLists.txt
sed -i'' "s/^.*add_subdirectory(${basename}).*$//g" ./tests/CMakeLists.txt
sed -i'' "s/^.*${basename}.*$//g" ./tests/CMakeLists.txt
2024-03-07 05:06:20 +00:00
}
git_add_module () {
local basename="$1"
read -p "Auto add to git?(y/n):" CHOICE
if [ "${CHOICE}" = "n" ]; then
2024-03-07 05:06:20 +00:00
echo "not being added!"
return 0
fi
2024-03-07 05:06:20 +00:00
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_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
modname_cap=$(echo $modname | sed 's/[a-z]/\U&/g')
modsrc_dir="./src/${modname}"
modtest_dir="./tests/${modname}"
echo "creating: ${modsrc_dir}, ${modtest_dir}"
mkdir $modsrc_dir
mkdir $modtest_dir
#copy the template files.
echo "copying & customizing template files..."
sed "s/module_name/${modname}/" $MODULE_DIR/module_name.c > $modsrc_dir/${modname}.c
sed -i'' "3s/todays_date/$(date +%Y)/" $modsrc_dir/${modname}.c
2024-03-07 05:06:20 +00:00
sed "s/module_name/${modname_cap}/" $MODULE_DIR/module_name.h > $modsrc_dir/${modname}.h
sed -i'' "3s/todays_date/$(date +%Y)/" $modsrc_dir/${modname}.h
2024-03-07 05:06:20 +00:00
sed "s/module_name/${modname}/" $MODULE_DIR/CMakeLists.txt > $modsrc_dir/CMakeLists.txt
2024-03-16 20:47:37 +00:00
sed "s/module_name/${modname}/" $MODULE_DIR/test_module_name.cpp > $modtest_dir/test_${modname}.cpp
2024-03-07 05:06:20 +00:00
sed "s/module_name/${modname}/" $MODULE_DIR/TestCMakeLists.txt > $modtest_dir/CMakeLists.txt
# Add the module to the cmake lists files.
add_module_to_cmakes "${modname}"
echo "Resulting files/dirs:"
tree -L 2 $modsrc_dir
tree -L 2 $modtest_dir
# 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} ../
2024-03-07 06:01:25 +00:00
make
2024-03-07 05:06:20 +00:00
}
build_main () {
clear_cmake_cache
cmake -DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE} ../
make main
}
2024-06-14 22:08:29 +00:00
build_hex () {
clear_cmake_cache
CMAKE_ARGS="-DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE}"
CMAKE_ARGS="${CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${AVR_TC}"
cmake ${CMAKE_ARGS} ../
make all
2024-06-14 22:08:29 +00:00
make hex
}
2024-06-14 22:08:41 +00:00
build_hex_optimized () {
clear_cmake_cache
CMAKE_ARGS="-DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE}"
CMAKE_ARGS="${CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${AVR_TC}"
cmake ${CMAKE_ARGS} ../
make all
2024-06-14 22:08:41 +00:00
make hex-release
}
flash_avr () {
build_hex_optimized
make upload
}
2024-03-07 05:06:20 +00:00
run_c_tests () {
clear_cmake_cache
cmake -DUNIT_TESTING=ON -DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE} ../
make AllTests && ./tests/AllTests
2024-03-07 05:06:20 +00:00
}
print_menu () {
echo "BUILD MENU:"
echo "1. Run Tests"
2024-06-14 22:08:29 +00:00
echo "2. Build Project(hex)"
echo "3. Build for release(hex)"
echo "4. Flash to AVR"
2024-03-07 05:06:20 +00:00
echo "5. Add new module to project"
echo "6. Delete module from project"
echo "7. Exit"
}
main() {
add_compile_commands
2024-03-07 05:06:20 +00:00
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
2024-06-14 22:08:29 +00:00
build_hex
2024-03-07 05:06:20 +00:00
;;
3)
echo "You selected Option 3"
valid_choice=true
2024-06-14 22:08:41 +00:00
build_hex_optimized
2024-03-07 05:06:20 +00:00
;;
4)
echo "You selected Option 4"
valid_choice=true
flash_avr
2024-03-07 05:06:20 +00:00
;;
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