diff --git a/tools/build_all_firmwares.sh b/tools/build_all_firmwares.sh
index cdc7b533c..2be8047eb 100755
--- a/tools/build_all_firmwares.sh
+++ b/tools/build_all_firmwares.sh
@@ -17,14 +17,27 @@
 #-----------------------------------------------------------------------------
 
 # These vars can be overridden by env variables
-echo "Makefile flags: ${MKFLAGS:=-j8}"
+echo "Makefile flags: ${MKFLAGS:=-j$(nproc)}"
 echo "Destination:    ${DEST:=firmware}"
 echo "Produce stats?: ${STATS:=false}"
 
+if [ "${1}" = "--pm5-only" ]; then
+  BUILD="pm5-only"
+elif [ "${1}" = "--pm3-only" ]; then
+  BUILD="pm3-only"
+fi
+
+# This safely splits MKFLAGS into arguements and stores in $@
+# This prevents anything in here from accidently becoming a shell glob and doing unexpected things
+set -f
+# shellcheck disable=SC2086
+set -- ${MKFLAGS}
+set +f
+
 # Which parts to skip for the 256kb version?
 SKIPS256="SKIP_HITAG=1 SKIP_LEGICRF=1 SKIP_FELICA=1 SKIP_EM4x50=1 SKIP_EM4x70=1 SKIP_ISO14443b=1 SKIP_NFCBARCODE=1 SKIP_ZX8211=1 SKIP_LF=1 SKIP_DESFIRE_SIM=1"
 
-make $MKFLAGS bootrom || exit 1
+make "$@" bootrom || exit 1
 chmod 644 bootrom/obj/bootrom.elf
 mkdir -p "$DEST"
 mv bootrom/obj/bootrom.elf "$DEST/PM3BOOTROM.elf"
@@ -41,52 +54,89 @@ STANDALONE_MODES_REQ_FLASH=(LF_HIDFCBRUTE LF_ICEHID LF_NEXID LF_THAREXDE HF_BOG
 # PM3GENERIC 256kb, no flash, need to skip some parts to reduce size
 
 # Need to use the "recovery" target to test the size
-make $MKFLAGS PLATFORM=PM3GENERIC PLATFORM_SIZE=256 PLATFORM_EXTRAS= STANDALONE= $SKIPS256 recovery || exit 1
+make "$@" PLATFORM=PM3GENERIC PLATFORM_SIZE=256 PLATFORM_EXTRAS= STANDALONE= "${SKIPS256}" recovery || exit 1
 chmod 644 armsrc/obj/fullimage.elf
 mv armsrc/obj/fullimage.elf "$DEST/PM3GENERIC_256.elf"
 
-# PM3GENERIC, no flash
+if [ "${BUILD}" != "pm5-only" ]; then
+  # PM3GENERIC, no flash
 
-make $MKFLAGS PLATFORM=PM3GENERIC PLATFORM_EXTRAS= STANDALONE= fullimage || exit 1
-chmod 644 armsrc/obj/fullimage.elf
-mv armsrc/obj/fullimage.elf "$DEST/PM3GENERIC.elf"
-$STATS && ( echo "PM3GENERIC:" > standalones_stats.txt )
-$STATS && ( echo "   text	   data	    bss	    dec	    hex	filename" >> standalones_stats.txt )
-for mode in "${STANDALONE_MODES[@]}"; do
-  [[ " ${STANDALONE_MODES_REQ_BT[*]} " =~ " $mode " ]] && continue
-  [[ " ${STANDALONE_MODES_REQ_SMARTCARD[*]} " =~ " $mode " ]] && continue
-  [[ " ${STANDALONE_MODES_REQ_FLASH[*]} " =~ " $mode " ]] && continue
-  make $MKFLAGS PLATFORM=PM3GENERIC PLATFORM_EXTRAS= STANDALONE=$mode fullimage || exit 1
+  make "$@" PLATFORM=PM3GENERIC PLATFORM_EXTRAS= STANDALONE= fullimage || exit 1
   chmod 644 armsrc/obj/fullimage.elf
-  mv armsrc/obj/fullimage.elf "$DEST/PM3GENERIC_${mode/_/}.elf"
-  ! $STATS || ( LANG=C arm-none-eabi-size armsrc/obj/[hl]f_*.o |grep -v "filename" >> standalones_stats.txt )
-done
+  mv armsrc/obj/fullimage.elf "$DEST/PM3GENERIC.elf"
+  ${STATS} && ( echo "PM3GENERIC:" > standalones_stats.txt )
+  ${STATS} && ( echo "   text	   data	    bss	    dec	    hex	filename" >> standalones_stats.txt )
+  for mode in "${STANDALONE_MODES[@]}"; do
+    [[ " ${STANDALONE_MODES_REQ_BT[*]} " =~  $mode  ]] && continue
+    [[ " ${STANDALONE_MODES_REQ_SMARTCARD[*]} " =~  $mode  ]] && continue
+    [[ " ${STANDALONE_MODES_REQ_FLASH[*]} " =~  $mode  ]] && continue
+    make "$@" PLATFORM=PM3GENERIC PLATFORM_EXTRAS= STANDALONE="${mode}" fullimage || exit 1
+    chmod 644 armsrc/obj/fullimage.elf
+    mv armsrc/obj/fullimage.elf "$DEST/PM3GENERIC_${mode/_/}.elf"
+    ! ${STATS} || ( LANG=C arm-none-eabi-size armsrc/obj/[hl]f_*.o |grep -v "filename" >> standalones_stats.txt )
+  done
 
-# PM3RDV4
+  # PM3RDV4
 
-make $MKFLAGS PLATFORM=PM3RDV4 PLATFORM_EXTRAS= STANDALONE= fullimage || exit 1
-chmod 644 armsrc/obj/fullimage.elf
-mv armsrc/obj/fullimage.elf "$DEST/PM3RDV4.elf"
-$STATS && ( echo "PM3RDV4:" >> standalones_stats.txt )
-$STATS && ( echo "   text	   data	    bss	    dec	    hex	filename" >> standalones_stats.txt )
-for mode in "${STANDALONE_MODES[@]}"; do
-  [[ " ${STANDALONE_MODES_REQ_BT[*]} " =~ " $mode " ]] && continue
-  make $MKFLAGS PLATFORM=PM3RDV4 PLATFORM_EXTRAS= STANDALONE=$mode fullimage || exit 1
+  make "$@" PLATFORM=PM3RDV4 PLATFORM_EXTRAS= STANDALONE= fullimage || exit 1
   chmod 644 armsrc/obj/fullimage.elf
-  mv armsrc/obj/fullimage.elf "$DEST/PM3RDV4_${mode/_/}.elf"
-  ! $STATS || ( LANG=C arm-none-eabi-size armsrc/obj/[hl]f_*.o |grep -v "filename" >> standalones_stats.txt )
-done
+  mv armsrc/obj/fullimage.elf "$DEST/PM3RDV4.elf"
+  ${STATS} && ( echo "PM3RDV4:" >> standalones_stats.txt )
+  ${STATS} && ( echo "   text	   data	    bss	    dec	    hex	filename" >> standalones_stats.txt )
+  for mode in "${STANDALONE_MODES[@]}"; do
+    [[ " ${STANDALONE_MODES_REQ_BT[*]} " =~  ${mode}  ]] && continue
+    make "$@" PLATFORM=PM3RDV4 PLATFORM_EXTRAS= STANDALONE="${mode}" fullimage || exit 1
+    chmod 644 armsrc/obj/fullimage.elf
+    mv armsrc/obj/fullimage.elf "$DEST/PM3RDV4_${mode/_/}.elf"
+    ! ${STATS} || ( LANG=C arm-none-eabi-size armsrc/obj/[hl]f_*.o |grep -v "filename" >> standalones_stats.txt )
+  done
 
-# PM4RDV4 + BTADDON
+  # PM4RDV4 + BTADDON
 
-make $MKFLAGS PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON STANDALONE= fullimage || exit 1
-chmod 644 armsrc/obj/fullimage.elf
-mv armsrc/obj/fullimage.elf "$DEST/PM3RDV4_BTADDON.elf"
-$STATS && ( echo "PM3RDV4 + BTADDON:" >> standalones_stats.txt )
-$STATS && ( echo "   text	   data	    bss	    dec	    hex	filename" >> standalones_stats.txt )
-for mode in "${STANDALONE_MODES[@]}"; do
-  make $MKFLAGS PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON STANDALONE=$mode fullimage || exit 1
+  make "$@" PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON STANDALONE= fullimage || exit 1
+  chmod 644 armsrc/obj/fullimage.elf
+  mv armsrc/obj/fullimage.elf "$DEST/PM3RDV4_BTADDON.elf"
+  ${STATS} && ( echo "PM3RDV4 + BTADDON:" >> standalones_stats.txt )
+  ${STATS} && ( echo "   text	   data	    bss	    dec	    hex	filename" >> standalones_stats.txt )
+  for mode in "${STANDALONE_MODES[@]}"; do
+    make "$@" PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON STANDALONE="${mode}" fullimage || exit 1
+    chmod 644 armsrc/obj/fullimage.elf
+    mv armsrc/obj/fullimage.elf "$DEST/PM3RDV4_BTADDON_${mode/_/}.elf"
+    ! ${STATS} || ( LANG=C arm-none-eabi-size armsrc/obj/[hl]f_*.o |grep -v "filename" >> standalones_stats.txt )
+  done
+fi
+
+if [ "${BUILD}" != "pm3-only" ]; then
+  # PM5
+
+  make "$@" PLATFORM=PM5 PLATFORM_EXTRAS= STANDALONE= fullimage || exit 1
+  chmod 644 armsrc/obj/fullimage.elf
+  mv armsrc/obj/fullimage.elf "$DEST/PM3RDV4.elf"
+  ${STATS} && ( echo "PM5:" >> standalones_stats.txt )
+  ${STATS} && ( echo "   text	   data	    bss	    dec	    hex	filename" >> standalones_stats.txt )
+  for mode in "${STANDALONE_MODES[@]}"; do
+    [[ " ${STANDALONE_MODES_REQ_BT[*]} " =~  ${mode}  ]] && continue
+    make "$@" PLATFORM=PM5 PLATFORM_EXTRAS= STANDALONE="${mode}" fullimage || exit 1
+    chmod 644 armsrc/obj/fullimage.elf
+    mv armsrc/obj/fullimage.elf "$DEST/PM5_${mode/_/}.elf"
+    ! ${STATS} || ( LANG=C arm-none-eabi-size armsrc/obj/[hl]f_*.o |grep -v "filename" >> standalones_stats.txt )
+  done
+
+  # PM5 + BWM
+
+  make "$@" PLATFORM=PM5 PLATFORM_EXTRAS=BWM STANDALONE= fullimage || exit 1
   chmod 644 armsrc/obj/fullimage.elf
-  mv armsrc/obj/fullimage.elf "$DEST/PM3RDV4_BTADDON_${mode/_/}.elf"
-  ! $STATS || ( LANG=C arm-none-eabi-size armsrc/obj/[hl]f_*.o |grep -v "filename" >> standalones_stats.txt )
-done
+  mv armsrc/obj/fullimage.elf "$DEST/PM5_BWM.elf"
+  ${STATS} && ( echo "PM5 + BWM:" >> standalones_stats.txt )
+  ${STATS} && ( echo "   text	   data	    bss	    dec	    hex	filename" >> standalones_stats.txt )
+  for mode in "${STANDALONE_MODES[@]}"; do
+    # *** Chosen Standalone mode * requires -DWITH_FPC_USART_HOST, unsupported by Proxmark5.  Stop.
+    # This is probably a bug, but for now don't build the firmware that won't build.
+    [[ "${mode}" == "HF_CARDHOPPER" ]] && continue
+    [[ "${mode}" == "HF_REBLAY" ]] && continue
+    make "$@" PLATFORM=PM5 PLATFORM_EXTRAS=BWM STANDALONE="${mode}" fullimage || exit 1
+    chmod 644 armsrc/obj/fullimage.elf
+    mv armsrc/obj/fullimage.elf "$DEST/PM5_BWM_${mode/_/}.elf"
+    ! ${STATS} || ( LANG=C arm-none-eabi-size armsrc/obj/[hl]f_*.o |grep -v "filename" >> standalones_stats.txt )
+  done
+fi
