@@ -536,6 +536,10 @@ SPINNER_START() {
536536 now=$( date +%s)
537537 el=$(( now - _t0 ))
538538
539+ h=$(( el / 3600 ))
540+ m=$(( (el % 3600 ) / 60 ))
541+ s=$(( el % 60 ))
542+
539543 base_hue=$(( cycle * 12 ))
540544
541545 bar=" "
@@ -555,7 +559,7 @@ SPINNER_START() {
555559 i=$(( i + 1 ))
556560 done
557561
558- printf " \r%s ┤%s├ %3ds elapsed\033[K" " $_label " " $bar " " $el "
562+ printf " \r%s ┤%s├ %d:%02d:%02d elapsed\033[K" " $_label " " $bar " " $h " " $m " " $s "
559563
560564 step=$(( step + 1 ))
561565 sleep 0.05
@@ -807,35 +811,56 @@ for NAME in $CORES; do
807811 SOURCE=$( echo " $MODULE " | jq -r ' .source' )
808812 SYMBOLS=$( echo " $MODULE " | jq -r ' .symbols' )
809813
810- # Make keys
811- MAKE_FILE=$( echo " $MODULE " | jq -r ' .make.file' )
814+ # Make skip: allow skipping the main 'make' phase entirely.
815+ MAKE_SKIP=$( echo " $MODULE " | jq -r ' .make.skip // 0' 2> /dev/null)
816+ case " $MAKE_SKIP " in
817+ 1) MAKE_SKIP=1 ;;
818+ * ) MAKE_SKIP=0 ;;
819+ esac
820+
821+ # Make keys (make.file is only required when make.skip=0)
822+ MAKE_FILE=$( echo " $MODULE " | jq -r ' .make.file // ""' )
812823
813824 # Accept .make.args as either:
814825 # - array: ["A=B","C=D"]
815826 # - string: "A=B C=D"
816827 # - null/missing: empty
817- MAKE_ARGS_TYPE=$( echo " $MODULE " | jq -r ' (.make.args // empty) | type ' 2> /dev/null || echo " " )
828+ MAKE_ARGS_TYPE=" "
818829 MAKE_ARGS_STR=" "
819830 MAKE_ARGS_FILE=" "
820831
821- if [ " $MAKE_ARGS_TYPE " = " array" ]; then
832+ if [ " $MAKE_SKIP " -eq 0 ]; then
833+ MAKE_ARGS_TYPE=$( echo " $MODULE " | jq -r ' (.make.args // empty) | type' 2> /dev/null || echo " " )
834+ fi
835+
836+ if [ " $MAKE_SKIP " -eq 0 ] && [ " $MAKE_ARGS_TYPE " = " array" ]; then
822837 MAKE_ARGS_FILE=" $RUN_TMPDIR /.make_args.${NAME} .$$ "
823838 : > " $MAKE_ARGS_FILE "
824839 echo " $MODULE " | jq -r ' .make.args[]' > " $MAKE_ARGS_FILE " 2> /dev/null || :
825840 MAKE_ARGS_STR=$( tr ' \n' ' ' < " $MAKE_ARGS_FILE " | sed ' s/[[:space:]][[:space:]]*/ /g; s/[[:space:]]*$//' )
826- elif [ " $MAKE_ARGS_TYPE " = " string" ]; then
841+ elif [ " $MAKE_SKIP " -eq 0 ] && [ " $ MAKE_ARGS_TYPE" = " string" ]; then
827842 MAKE_ARGS_STR=$( echo " $MODULE " | jq -r ' .make.args' 2> /dev/null)
828843 else
829844 MAKE_ARGS_STR=" "
830845 fi
831846
832- MAKE_TARGET=$( echo " $MODULE " | jq -r ' .make.target' )
847+ MAKE_TARGET=" "
848+ if [ " $MAKE_SKIP " -eq 0 ]; then
849+ MAKE_TARGET=$( echo " $MODULE " | jq -r ' .make.target' )
850+ fi
851+
833852 MAKE_ARCH=' -march=armv8-a+crc+crypto -mtune=cortex-a53'
834853
835- # Verify required keys
836- if [ -z " $DIR " ] || [ -z " $OUTPUT_LIST " ] || [ -z " $SOURCE " ] || [ -z " $MAKE_FILE " ] || [ -z " $ SYMBOLS" ]; then
854+ # Verify required keys (make.file is only required when make.skip=0)
855+ if [ -z " $DIR " ] || [ -z " $OUTPUT_LIST " ] || [ -z " $SOURCE " ] || [ -z " $SYMBOLS " ]; then
837856 printf " Missing required configuration keys for '%s' in '%s'\n" " $NAME " " $CORE_CONFIG " >&2
838- MARK_FAIL " $NAME " " config" " missing required keys: directory/output/source/make.file/symbols"
857+ MARK_FAIL " $NAME " " config" " missing required keys: directory/output/source/symbols"
858+ continue
859+ fi
860+
861+ if [ " $MAKE_SKIP " -eq 0 ] && [ -z " $MAKE_FILE " ]; then
862+ printf " Missing required configuration key for '%s': make.file (and make.skip is not set)\n" " $NAME " >&2
863+ MARK_FAIL " $NAME " " config" " missing required key: make.file (set make.skip=1 to disable)"
839864 continue
840865 fi
841866
@@ -997,92 +1022,97 @@ for NAME in $CORES; do
9971022 cd " $WORKDIR " || { printf " Failed to enter WORKDIR %s\n" " $WORKDIR " >&2 ; FAIL_AND_CONTINUE " $NAME " " fs" " failed to enter WORKDIR" ; }
9981023
9991024 printf " Make Structure:"
1000- printf " \n\tFILE:\t%s" " $MAKE_FILE "
1001- printf " \n\tARCH:\t%s" " ARM64_A53"
1002- printf " \n\tARGS:\t%s" " $MAKE_ARGS_STR "
1003- printf " \n\tTARGET: %s\n" " $MAKE_TARGET "
1025+ if [ " $MAKE_SKIP " -eq 1 ]; then
1026+ printf " \n\tSKIP:\t1\n"
1027+ printf " \tNOTE:\tSkipping main make step for '%s'\n" " $NAME "
1028+ printf " SKIP: make phase disabled by make.skip=1 for %s\n" " $NAME " >> " $LOGFILE "
1029+ else
1030+ printf " \n\tFILE:\t%s" " $MAKE_FILE "
1031+ printf " \n\tARCH:\t%s" " ARM64_A53"
1032+ printf " \n\tARGS:\t%s" " $MAKE_ARGS_STR "
1033+ printf " \n\tTARGET: %s\n" " $MAKE_TARGET "
1034+ fi
10041035
10051036 START_TS=$( date +%s)
10061037 BUILD_LABEL=" Building $NAME started @ $START_WALL "
10071038
1008- # Build make argv safely (no eval)
1009- set -- make -j" $MAKE_CORES " -f " $MAKE_FILE "
1039+ if [ " $MAKE_SKIP " -eq 0 ]; then
1040+ # Build make argv safely (no eval)
1041+ set -- make -j" $MAKE_CORES " -f " $MAKE_FILE "
1042+
1043+ TRANSFORM_MAKE_ARG () {
1044+ _a=$1
1045+
1046+ case $_a in
1047+ OVERRIDE_CC=* )
1048+ _v=${_a# OVERRIDE_CC=}
1049+ case " $_v " in
1050+ * " -march=" * |* " -mcpu=" * |* " -mtune=" * ) printf ' %s\n' " OVERRIDE_CC=$_v " ;;
1051+ * ) printf ' %s\n' " OVERRIDE_CC=$_v $MAKE_ARCH " ;;
1052+ esac
1053+ return 0
1054+ ;;
1055+ OVERRIDE_CXX=* )
1056+ _v=${_a# OVERRIDE_CXX=}
1057+ case " $_v " in
1058+ * " -march=" * |* " -mcpu=" * |* " -mtune=" * ) printf ' %s\n' " OVERRIDE_CXX=$_v " ;;
1059+ * ) printf ' %s\n' " OVERRIDE_CXX=$_v $MAKE_ARCH " ;;
1060+ esac
1061+ return 0
1062+ ;;
1063+ OVERRIDE_LD=* )
1064+ _v=${_a# OVERRIDE_LD=}
1065+ case " $_v " in
1066+ * " -march=" * |* " -mcpu=" * |* " -mtune=" * ) printf ' %s\n' " OVERRIDE_LD=$_v " ;;
1067+ * ) printf ' %s\n' " OVERRIDE_LD=$_v $MAKE_ARCH " ;;
1068+ esac
1069+ return 0
1070+ ;;
1071+ esac
10101072
1011- TRANSFORM_MAKE_ARG () {
1012- _a= $1
1073+ printf ' %s\n ' " $_a "
1074+ }
10131075
1014- case $_a in
1015- OVERRIDE_CC=* )
1016- _v=${_a# OVERRIDE_CC=}
1017- case " $_v " in
1018- * " -march=" * |* " -mcpu=" * |* " -mtune=" * ) printf ' %s\n' " OVERRIDE_CC=$_v " ;;
1019- * ) printf ' %s\n' " OVERRIDE_CC=$_v $MAKE_ARCH " ;;
1020- esac
1021- return 0
1022- ;;
1023- OVERRIDE_CXX=* )
1024- _v=${_a# OVERRIDE_CXX=}
1025- case " $_v " in
1026- * " -march=" * |* " -mcpu=" * |* " -mtune=" * ) printf ' %s\n' " OVERRIDE_CXX=$_v " ;;
1027- * ) printf ' %s\n' " OVERRIDE_CXX=$_v $MAKE_ARCH " ;;
1028- esac
1029- return 0
1030- ;;
1031- OVERRIDE_LD=* )
1032- _v=${_a# OVERRIDE_LD=}
1033- case " $_v " in
1034- * " -march=" * |* " -mcpu=" * |* " -mtune=" * ) printf ' %s\n' " OVERRIDE_LD=$_v " ;;
1035- * ) printf ' %s\n' " OVERRIDE_LD=$_v $MAKE_ARCH " ;;
1036- esac
1037- return 0
1038- ;;
1039- esac
1076+ # Append args from JSON
1077+ if [ " $MAKE_ARGS_TYPE " = " array" ] && [ -n " $MAKE_ARGS_FILE " ] && [ -s " $MAKE_ARGS_FILE " ]; then
1078+ while IFS= read -r _a; do
1079+ [ -n " $_a " ] || continue
1080+ _t=$( TRANSFORM_MAKE_ARG " $_a " )
1081+ [ -n " $_t " ] && set -- " $@ " " $_t "
1082+ done < " $MAKE_ARGS_FILE "
1083+ elif [ -n " $MAKE_ARGS_STR " ]; then
1084+ # shellcheck disable=SC2086
1085+ for _a in $MAKE_ARGS_STR ; do
1086+ _t=$( TRANSFORM_MAKE_ARG " $_a " )
1087+ [ -n " $_t " ] && set -- " $@ " " $_t "
1088+ done
1089+ fi
10401090
1041- printf ' %s\n' " $_a "
1042- }
1091+ # Add explicit make target if present
1092+ if [ -n " $MAKE_TARGET " ] && [ " $MAKE_TARGET " != " null" ]; then
1093+ set -- " $@ " " $MAKE_TARGET "
1094+ fi
10431095
1044- # Append args from JSON
1045- if [ " $MAKE_ARGS_TYPE " = " array" ] && [ -n " $MAKE_ARGS_FILE " ] && [ -s " $MAKE_ARGS_FILE " ]; then
1046- while IFS= read -r _a; do
1047- [ -n " $_a " ] || continue
1048- _t=$( TRANSFORM_MAKE_ARG " $_a " )
1049- [ -n " $_t " ] && set -- " $@ " " $_t "
1050- done < " $MAKE_ARGS_FILE "
1051- elif [ -n " $MAKE_ARGS_STR " ]; then
1052- # shellcheck disable=SC2086
1053- for _a in $MAKE_ARGS_STR ; do
1054- _t=$( TRANSFORM_MAKE_ARG " $_a " )
1055- [ -n " $_t " ] && set -- " $@ " " $_t "
1096+ # Debug: log actual argv we will run
1097+ printf " EXEC:" >> " $LOGFILE "
1098+ for __x in " $@ " ; do
1099+ printf " [%s]" " $__x " >> " $LOGFILE "
10561100 done
1057- fi
1058-
1059- # Add explicit make target if present
1060- if [ -n " $MAKE_TARGET " ] && [ " $MAKE_TARGET " != " null" ]; then
1061- set -- " $@ " " $MAKE_TARGET "
1062- fi
1063-
1064- # Debug: log actual argv we will run
1065- printf " EXEC:" >> " $LOGFILE "
1066- for __x in " $@ " ; do
1067- printf " [%s]" " $__x " >> " $LOGFILE "
1068- done
1069- printf " \n" >> " $LOGFILE "
1070-
1071- # Run make with spinner; log all output
1072- if RUN_WITH_SPINNER_LOG " $BUILD_LABEL " " $LOGFILE " " $@ " ; then
1073- END_WALL=" $( NOW) "
1074- printf " \nBuild succeeded: %s at %s\n" " $NAME " " $END_WALL "
1101+ printf " \n" >> " $LOGFILE "
10751102
1076- jq --arg name " $NAME " --arg hash " $REMOTE_HASH " --arg dir " $DIR " \
1077- ' (.[$name] = {"hash":$hash,"dir":$dir})' " $CACHE_FILE " > " $CACHE_FILE .tmp" && mv " $CACHE_FILE .tmp" " $CACHE_FILE "
1078- else
1079- FAIL_WALL=" $( NOW) "
1080- printf " \nBuild FAILED: %s at %s - see %s\n" " $NAME " " $FAIL_WALL " " $LOGFILE " >&2
1081- printf ' \a' 2> /dev/null || :
1103+ # Run make with spinner; log all output
1104+ if RUN_WITH_SPINNER_LOG " $BUILD_LABEL " " $LOGFILE " " $@ " ; then
1105+ END_WALL=" $( NOW) "
1106+ printf " \nBuild succeeded: %s at %s\n" " $NAME " " $END_WALL "
1107+ else
1108+ FAIL_WALL=" $( NOW) "
1109+ printf " \nBuild FAILED: %s at %s - see %s\n" " $NAME " " $FAIL_WALL " " $LOGFILE " >&2
1110+ printf ' \a' 2> /dev/null || :
10821111
1083- MARK_FAIL " $NAME " " make" " make failed (see build.log)"
1084- RETURN_TO_BASE
1085- continue
1112+ MARK_FAIL " $NAME " " make" " make failed (see build.log)"
1113+ RETURN_TO_BASE
1114+ continue
1115+ fi
10861116 fi
10871117
10881118 END_TS=$( date +%s)
@@ -1182,23 +1212,31 @@ for NAME in $CORES; do
11821212 sort -k3 .index-extended -o .index-extended
11831213 sort .index -o .index
11841214
1215+ # Cache update only after outputs validated, moved, zipped, and indexed successfully
1216+ jq --arg name " $NAME " --arg hash " $REMOTE_HASH " --arg dir " $DIR " \
1217+ ' (.[$name] = {"hash":$hash,"dir":$dir})' " $CACHE_FILE " > " $CACHE_FILE .tmp" && mv " $CACHE_FILE .tmp" " $CACHE_FILE "
1218+
11851219 # After packaging: purge repo if requested, otherwise try cleaning build artifacts
11861220 if [ " $PURGE " -eq 1 ] || [ " $CORE_PURGE_FLAG " -eq 1 ]; then
11871221 printf " \nPurging core repo directory: %s\n" " $CORE_DIR "
11881222 rm -rf -- " $CORE_DIR "
11891223 else
11901224 printf " \nCleaning build environment for '%s'\n" " $NAME "
1191- (
1192- cd " $CORE_DIR " 2> /dev/null || exit 0
1225+ if [ " $MAKE_SKIP " -eq 1 ]; then
1226+ printf " Skipping clean: make.skip=1 for '%s'\n" " $NAME "
1227+ else
1228+ (
1229+ cd " $CORE_DIR " 2> /dev/null || exit 0
11931230
1194- # Prefer cleaning using the same makefile we built with
1195- make -j" $MAKE_CORES " -f " $MAKE_FILE " clean > /dev/null 2>&1 && exit 0
1231+ # Prefer cleaning using the same makefile we built with
1232+ make -j" $MAKE_CORES " -f " $MAKE_FILE " clean > /dev/null 2>&1 && exit 0
11961233
1197- # Fallback: common clean target
1198- make clean -j" $MAKE_CORES " > /dev/null 2>&1 && exit 0
1234+ # Fallback: common clean target
1235+ make clean -j" $MAKE_CORES " > /dev/null 2>&1 && exit 0
11991236
1200- exit 0
1201- ) || :
1237+ exit 0
1238+ ) || :
1239+ fi
12021240 fi
12031241
12041242 RETURN_TO_BASE
0 commit comments