diff --git a/sbs b/sbs index a789ae025c2120f6297f52fd553c159253d3a441..dee9fd248df9a0b65657eb647f0910c7f616d51c 100755 --- a/sbs +++ b/sbs @@ -39,50 +39,111 @@ print_banner() { EOF } -show_found_deps() { - printf "Found Ccache: "; [ $ccache_found ] && echo "yes" || echo "no" - printf "Found Ninja: "; [ $ninja_found ] && echo "yes" || echo "no" +find_deps() { + command -v ccache &> /dev/null && config_ccache=true + command -v ninja &> /dev/null && config_ninja=true +} + +print_found_deps() { + printf "Found Ccache: "; [ "$config_ccache" = true ] && echo "yes" || echo "no" + printf "Found Ninja: "; [ "$config_ninja" = true ] && echo "yes" || echo "no" echo } configure() { - show_found_deps - config_ccache= && [ $ccache_found ] && config_ccache="-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache" - config_toolchain="-DCMAKE_TOOLCHAIN_FILE=$sbs_base/libs/miosix-kernel/miosix/_tools/toolchain.cmake" - config_generator="-GUnix Makefiles" && [ $ninja_found ] && config_generator="-GNinja" - cmake \ - -B"$build_dir" \ - $config_ccache \ - $config_toolchain \ - $config_generator \ - $config_buildtype \ - $config_verbose \ - "$source_dir" + print_found_deps + + defs="-DCMAKE_TOOLCHAIN_FILE=$sbs_base/libs/miosix-kernel/miosix/_tools/toolchain.cmake" + [ "$config_ccache" = true ] && defs="$defs -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache" + [ "$config_debug" = true ] && defs="$defs -DCMAKE_BUILD_TYPE=Debug" || defs="$defs -DCMAKE_BUILD_TYPE=Release" + [ "$config_verbose" = true ] && defs="$defs -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON" + [ "$config_ninja" = true ] && gen="-GNinja" || gen="-GUnix Makefiles" + + if cmake -B"$build_dir" $defs "$gen" "$source_dir"; then + [ "$config_debug" = true ] && touch "$build_dir/$DEBUG_FILENAME" || rm -f "$build_dir/$DEBUG_FILENAME" + [ "$config_verbose" = true ] && touch "$build_dir/$VERBOSE_FILENAME" || rm -f "$build_dir/$VERBOSE_FILENAME" + fi } -clean() { [ -d "$build_dir" ] && cmake --build "$build_dir" $build_jobs --target clean; rm -rf "$build_dir"; } +check_configured() { + to_reconfigure=false + + if [ ! -d "$build_dir" ]; then + to_reconfigure=true + elif [ ! -f "$build_dir/$CMAKE_FILENAME" ]; then + rm -rf "$build_dir" + to_reconfigure=true + else + [ -f "$build_dir/$DEBUG_FILENAME" ] && found_debug=true || found_debug=false + [ -f "$build_dir/$VERBOSE_FILENAME" ] && found_verbose=true || found_verbose=false + if [ "$config_debug" != "$found_debug" ] \ + || [ "$config_verbose" != "$found_verbose" ]; then + to_reconfigure=true + fi + fi + + [ "$to_reconfigure" = true ] && configure && echo || true +} -build_all() { check_configured && cmake --build "$build_dir" $build_jobs; } +build() { + if check_configured; then + cmake --build "$build_dir" $(get_jobs_opt) --target "$1" + fi +} -build() { check_configured && cmake --build "$build_dir" $build_jobs --target "$1"; } +clean() { + if [ -f "$build_dir/$CMAKE_FILENAME" ]; then + cmake --build "$build_dir" $(get_jobs_opt) --target clean && echo + fi + echo "Removing build folder..." + rm -rf "$build_dir" +} -flash() { build "$1" && [ -f "$build_dir/$1.bin" ] && echo && st-flash --reset write "$build_dir/$1.bin" 0x08000000; } +flash() { + if build "$1"; then + echo + if [ -f "$build_dir/$1.bin" ]; then + st-flash --reset write "$build_dir/$1.bin" 0x08000000 + else + echo "Error: target '$1' is not flashable" + fi + fi +} -lint() { "$sbs_base/scripts/linter.sh" "$source_dir/src/shared"; } +list() { + if check_configured; then + echo "[1/1] All SBS targets available:" + cmake --build "$build_dir" $(get_jobs_opt) --target help | grep -o '^[^/]*\.bin' | cut -f 1 -d '.' + fi +} -list() { check_configured && echo "[1/1] All SBS targets available:" \ - && cmake --build "$build_dir" $build_jobs --target help | grep -o '^[^/]*\.bin' | cut -f 1 -d '.'; } +boards() { + build help-boards +} -boards() { check_configured && cmake --build "$build_dir" $build_jobs --target help-boards; } +build_all() { + build all +} -check_configured() { ([ "$to_reconfigure" = true ] || [ ! -d "$build_dir" ] || [ ! -f "$build_dir/CMakeCache.txt" ] && rm -rf "$build_dir") \ - && configure && echo || true; } +set_debug() { + config_debug=true +} -set_debug() { config_buildtype="-DCMAKE_BUILD_TYPE=Debug" && to_reconfigure=true; } +set_verbose() { + config_verbose=true +} -set_verbose() { config_verbose="-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON" && to_reconfigure=true; } +set_jobs() { + build_jobs="$1" +} -set_jobs() { build_jobs="-j $1"; } +get_jobs_opt() { + [ ! -z "$build_jobs" ] && echo "-j $build_jobs" || echo +} + +lint() { + "$sbs_base/scripts/linter.sh" "$source_dir/src/shared" +} usage() { cat <<EOF @@ -98,24 +159,30 @@ OPTIONS: -j JOBS, --jobs JOBS Build in parallel using the given number of jobs -d, --debug Enable debug -v, --verbose Print a verbose output - -n, --lint Run the linter -l, --list List all targets available -r, --boards List all boards available + -n, --lint Run the linter EOF } +CMAKE_FILENAME="CMakeCache.txt" +DEBUG_FILENAME=".sbs_debug" +VERBOSE_FILENAME=".sbs_verbose" + print_banner sbs_base="$(cd -- "$(dirname "$0")" > /dev/null 2>&1; pwd -P)" source_dir="$PWD" build_dir="$source_dir/build" -config_buildtype="-DCMAKE_BUILD_TYPE=Release" -config_verbose= -build_jobs= + to_reconfigure=false +config_ccache=false +config_debug=false +config_verbose=false +config_ninja=false +build_jobs= -ccache_found="$(command -v ccache)" -ninja_found="$(command -v ninja)" +find_deps for arg in "$@"; do shift @@ -127,14 +194,14 @@ for arg in "$@"; do --jobs) set -- "$@" "-j";; --debug) set -- "$@" "-d";; --verbose) set -- "$@" "-v";; - --lint) set -- "$@" "-n";; --list) set -- "$@" "-l";; --boards) set -- "$@" "-r";; + --lint) set -- "$@" "-n";; *) set -- "$@" "$arg" esac done -while getopts hcb:f:j:dvnlr opt; do +while getopts hcb:f:j:dvlrn opt; do case "$opt" in h) usage; exit 0;; c) clean; exit $?;; @@ -143,9 +210,9 @@ while getopts hcb:f:j:dvnlr opt; do j) set_jobs "$OPTARG";; d) set_debug;; v) set_verbose;; - n) lint; exit $?;; l) list; exit $?;; r) boards; exit $?;; + n) lint; exit $?;; ?) usage; exit 2;; esac done