11#! /usr/bin/env bash
22#
3- # mftest Select a test to apply and build
4- # mftest -b [#] Build the auto-detected environment
5- # mftest -u [#] Upload the auto-detected environment
6- # mftest -tname -n# [-y] Set config options and optionally build a test
3+ # mftest Select a test to apply and build
4+ # mftest -a [#] Build the auto-detected environment
5+ # mftest -u [#] Upload the auto-detected environment
6+ # mftest -tname -n# [-y] Set config options and optionally build a test
77#
88
9- [[ -d Marlin/src ]] || { echo " Please 'cd' to the Marlin repo root." ; exit 1 ; }
10-
11- which pio > /dev/null || { echo " Make sure 'pio' is in your execution PATH." ; exit 1 ; }
12-
13- perror () { echo -e " $0 : \033[0;31m$1 -- $2 \033[0m" ; }
9+ # Error helpers
1410errout () { echo -e " \033[0;31m$1 \033[0m" ; }
11+ perror () { errout " $0 : $1 -- $2 " ; }
1512bugout () { (( DEBUG)) && echo -e " \033[0;32m$1 \033[0m" ; }
1613
14+ # Ensure we are in root and PlatformIO is available
15+ [[ -d Marlin/src ]] || { errout " Please 'cd' to the Marlin repo root." ; exit 1 ; }
16+ command -v pio & > /dev/null || { errout " Make sure 'pio' is in your PATH." ; exit 1 ; }
17+
1718usage () {
1819 echo "
1920Usage: mftest [-a|--autobuild]
@@ -57,12 +58,13 @@ TESTENV='-'
5758CHOICE=0
5859DEBUG=0
5960
60- while getopts ' adhmn :rst:uvy-:' OFLAG; do
61+ while getopts ' acdhmn :rst:uvy-:' OFLAG; do
6162 case " ${OFLAG} " in
6263 a) AUTO_BUILD=1 ; bugout " Auto-Build target..." ;;
64+ c) CLEAN_BUILD=1 ; bugout " Clean build..." ;;
6365 d) DL_DEFAULTS=1 ; bugout " Restore to defaults..." ;;
6466 h) EXIT_USAGE=1 ;;
65- m) USE_MAKE=1 ; bugout " Using make with Docker..." ;;
67+ m) USE_MAKE=1 ; bugout " Using Make with Docker..." ;;
6668 n) case " $OPTARG " in
6769 * [!0-9]* ) perror " option requires a number" $OFLAG ; EXIT_USAGE=2 ;;
6870 * ) CHOICE=" $OPTARG " ; bugout " Got a number: $CHOICE " ;;
@@ -79,14 +81,15 @@ while getopts 'adhmn:rst:uvy-:' OFLAG; do
7981 help) [[ -z " $OVAL " ]] || perror " option can't take value $OVAL " $ONAM ; EXIT_USAGE=1 ;;
8082 autobuild) AUTO_BUILD=1 ; bugout " Auto-Build target..." ;;
8183 autoupload) AUTO_BUILD=2 ; bugout " Auto-Upload target..." ;;
84+ clean) CLEAN_BUILD=1 ; bugout " Clean build..." ;;
8285 env) case " $OVAL " in
8386 ' ' ) perror " option requires a value" $ONAM ; EXIT_USAGE=2 ;;
8487 * ) TESTENV=" $OVAL " ; bugout " Got a target: $TESTENV " ;;
8588 esac
8689 ;;
8790 num) case " $OVAL " in
8891 [0-9]+) CHOICE=" $OVAL " ; bugout " Got a number: $CHOICE " ;;
89- * ) perror " option requires a value " $ONAM ; EXIT_USAGE=2 ;;
92+ * ) perror " option requires a number " $ONAM ; EXIT_USAGE=2 ;;
9093 esac
9194 ;;
9295 rebuild) REBUILD=1 ; bugout " Rebuilding previous..." ;;
@@ -101,7 +104,7 @@ debug|verbose) DEBUG=1 ; bugout "Debug ON" ;;
101104 esac
102105 bugout " Build will initiate? ($BUILD_YES )"
103106 ;;
104- * ) perror " Unknown flag " " $OPTARG " ; EXIT_USAGE=2 ;;
107+ * ) perror " Unknown value " " $OPTARG " ; EXIT_USAGE=2 ;;
105108 esac
106109 ;;
107110 * ) EXIT_USAGE=2 ;;
@@ -113,11 +116,18 @@ shift $((OPTIND - 1))
113116
114117if (( REBUILD)) ; then
115118 bugout " Rebuilding previous..."
116- # Build with the last-built env
117- [[ -f " $STATE_FILE " ]] || { errout " No previous (-r) build state found." ; exit 1 ; }
118- read TESTENV < " $STATE_FILE "
119- pio run $SILENT_FLAG -d . -e $TESTENV
120- exit 0
119+ [[ -f $STATE_FILE ]] || { errout " No previous (-r) build state found." ; exit 1 ; }
120+ read -r TESTENV < " $STATE_FILE "
121+ pio run ${SILENT_FLAG:- } -d . -e $TESTENV
122+ exit $? # Exit with the status of pio run
123+ fi
124+
125+ if (( CLEAN_BUILD)) ; then
126+ bugout " Cleaning build env..."
127+ [[ -f $STATE_FILE ]] || { errout " No previous (-r) build state found." ; exit 1 ; }
128+ read -r TESTENV < " $STATE_FILE "
129+ pio run ${SILENT_FLAG:- } -d . -e $TESTENV -t clean
130+ exit $? # Exit with the status of pio run
121131fi
122132
123133case $TESTENV in
@@ -146,9 +156,7 @@ lp9|lpc9) TESTENV='LPC1769' ;;
146156esac
147157
148158if (( AUTO_BUILD)) ; then
149- #
150159 # List environments that apply to the current MOTHERBOARD.
151- #
152160 case $( uname | tr ' [:upper:]' ' [:lower:]' ) in
153161 darwin) SYS=' mac' ;;
154162 * linux) SYS=' lin' ;;
@@ -160,17 +168,15 @@ if ((AUTO_BUILD)); then
160168 esac
161169 echo ; echo -n " Auto " ; (( AUTO_BUILD == 2 )) && echo " Upload..." || echo " Build..."
162170
163- #
164171 # Get the MOTHERBOARD define value from the .h file and strip off the "BOARD_" prefix
165- #
166172 ACODE=' /^[[:space:]]*#define[[:space:]]MOTHERBOARD[[:space:]]/ { sub(/^BOARD_/, "", $3); print $3 }'
167173 MB=$( awk " $ACODE " Marlin/Configuration.h 2> /dev/null)
168174 [[ -z $MB ]] && MB=$( awk " $ACODE " Marlin/Config.h 2> /dev/null)
169- [[ -z $MB ]] && { echo " Error - Can't read MOTHERBOARD setting." ; exit 1 ; }
175+ [[ -z $MB ]] && { errout " Error - Can't read MOTHERBOARD setting." ; exit 1 ; }
170176 BLINE=$( grep -E " define\s+BOARD_$MB \b" Marlin/src/core/boards.h )
171177 BNUM=$( sed -E ' s/^.+BOARD_[^ ]+ +([0-9]+).+$/\1/' <<< " $BLINE" )
172178 BDESC=$( sed -E ' s/^.+\/\/ *(.+)$/\1/' <<< " $BLINE" )
173- [[ -z $BNUM ]] && { echo " Error - Can't find BOARD_$MB in core/boards.h." ; exit 1 ; }
179+ [[ -z $BNUM ]] && { errout " Error - Can't find BOARD_$MB in core/boards.h." ; exit 1 ; }
174180 ENVS=( $( grep -EA1 " MB\(.*\b$MB \b.*\)" Marlin/src/pins/pins.h | grep -E " #include.+//.+(env|$SYS ):[^ ]+" | grep -oE " (env|$SYS ):[^ ]+" | sed -E " s/(env|$SYS )://" ) )
175181 # If AUTO_BUILD is not 2 (upload), strip envs ending in '_xfer' from $ENVS
176182 if [[ $AUTO_BUILD != 2 ]]; then
@@ -196,15 +202,15 @@ if ((AUTO_BUILD)); then
196202 for (( ; ; ))
197203 do
198204 read -p " Select a target for '$MB ' (1-$ECOUNT ) : " CHOICE
199- [[ -z " $CHOICE " ]] && { echo ' (canceled)' ; exit 1 ; }
205+ [[ -z " $CHOICE " ]] && { errout ' (canceled)' ; exit 1 ; }
200206 [[ $CHOICE =~ $ISNUM ]] && (( CHOICE >= 1 && CHOICE <= ECOUNT)) && break
201207 errout " >>> Invalid environment choice '$CHOICE '."
202208 done
203209 echo
204210 fi
205211 else
206212 echo " Detected \" $BDESC \" | $MB ($BNUM )."
207- [[ $CHOICE > $ECOUNT ]] && { echo " Environment selection out of range." ; exit 66 ; }
213+ [[ $CHOICE > $ECOUNT ]] && { errout " Environment selection out of range." ; exit 66 ; }
208214 fi
209215 TARGET=" ${ENVS[$CHOICE-1]} "
210216 if [[ $MB == ' SIMULATED' && $TARGET == ' linux_native' ]]; then
@@ -225,10 +231,7 @@ if ((AUTO_BUILD)); then
225231 exit $?
226232fi
227233
228- #
229234# List available tests and ask for selection
230- #
231-
232235if [[ $TESTENV == ' -' ]]; then
233236 IND=0
234237 NAMES=()
@@ -306,14 +309,10 @@ if [[ $CHOICE == 0 ]]; then
306309 fi
307310fi
308311
309- #
310- # Restore to defaults if requested
311- #
312+ # Restore defaults if requested
312313(( DL_DEFAULTS)) && use_example_configs
313314
314- #
315315# Run the specified test lines
316- #
317316echo -ne " \033[0;33m"
318317echo " $OUT " | {
319318 IND=0
@@ -322,20 +321,18 @@ echo "$OUT" | {
322321 while IFS= read -r LINE
323322 do
324323 if [[ $LINE =~ $ISCMD || $GOTX == 1 ]]; then
325- (( ! IND)) && let IND++
324+ (( ! IND )) && (( IND++ ))
326325 if [[ $LINE =~ $ISEXEC ]]; then
327326 (( IND++ > CHOICE)) && break
328- else
329- (( ! HEADER)) && {
327+ elif (( IND == CHOICE )) ; then
328+ if ! (( HEADER)) ; then
330329 HEADER=1
331- echo -e " \n#\n# Test $TESTENV ($CHOICE ) $DESC \n#"
332- }
333- (( IND == CHOICE)) && {
330+ echo -e " \n#\n# Test $TESTENV ($CHOICE ): $DESC \n#"
334331 GOTX=1
335- [[ -n $DL_DEFAULTS && $LINE =~ $ISRST ]] && LINE= " use_example_configs "
336- [[ $CMD == " " ]] && CMD= " $LINE " || CMD= $( echo -e " $CMD$ LINE" | sed -e ' s/\\//g ' | sed -E ' s/ +/ /g ' )
337- [[ $LINE =~ $ISCONT ]] || { echo " $CMD " ; eval " $CMD " ; CMD= " " ; }
338- }
332+ fi
333+ [[ -n $DL_DEFAULTS && $LINE =~ $ISRST ]] && LINE= " use_example_configs "
334+ [[ $CMD == " " ]] && CMD= " $LINE " || CMD= $( echo -e " $CMD$LINE " | sed -e ' s/\\//g ' | sed -E ' s/ +/ /g ' )
335+ [[ $LINE =~ $ISCONT ]] || { echo " $CMD " ; eval " $CMD " ; CMD= " " ; }
339336 fi
340337 fi
341338 done
@@ -345,14 +342,14 @@ echo -ne "\033[0m"
345342# Make clear it's a TEST
346343opt_set CUSTOM_MACHINE_NAME " \" Test $TESTENV ($CHOICE )\" "
347344
348- # Build the test too?
349- if [[ -z " $BUILD_YES " ]]; then
345+ # Build if requested
346+ if [[ -z $BUILD_YES ]]; then
350347 echo
351- read -p " Build $TESTENV test #$CHOICE (y/N) ? " BUILD_YES
348+ read -r - p " Build $TESTENV test #$CHOICE (y/N)? " BUILD_YES
352349fi
353350
354- [[ $BUILD_YES == ' Y ' || $BUILD_YES == ' Yes' ]] && {
351+ [[ $BUILD_YES =~ ^(Y | Yes)$ ]] && {
355352 (( USE_MAKE)) && make tests-single-local TEST_TARGET=$TESTENV ONLY_TEST=$CHOICE
356- (( USE_MAKE)) || pio run $SILENT_FLAG -d . -e $TESTENV
353+ (( USE_MAKE)) || pio run ${ SILENT_FLAG:- } -d . -e $TESTENV
357354 echo " $TESTENV " > " $STATE_FILE "
358355}
0 commit comments