@ -17,6 +17,7 @@ from qmk.search import search_keymap_targets
@cli.argument ( ' -t ' , ' --no-temp ' , arg_only = True , action = ' store_true ' , help = " Remove temporary files during build. " )
@cli.argument ( ' -j ' , ' --parallel ' , type = int , default = 1 , help = " Set the number of parallel make jobs; 0 means unlimited. " )
@cli.argument ( ' -c ' , ' --clean ' , arg_only = True , action = ' store_true ' , help = " Remove object files before compiling. " )
@cli.argument ( ' -n ' , ' --dry-run ' , arg_only = True , action = ' store_true ' , help = " Don ' t actually build, just show the commands to be run. " )
@cli.argument (
' -f ' ,
' --filter ' ,
@ -47,47 +48,52 @@ def mass_compile(cli):
if len ( targets ) == 0 :
return
builddir . mkdir ( parents = True , exist_ok = True )
with open ( makefile , " w " ) as f :
if cli . args . dry_run :
cli . log . info ( ' Compilation targets: ' )
for target in sorted ( targets ) :
keyboard_name = target [ 0 ]
keymap_name = target [ 1 ]
keyboard_safe = keyboard_name . replace ( ' / ' , ' _ ' )
build_log = f " {QMK_FIRMWARE}/.build/build.log.{os.getpid()}.{keyboard_safe}.{keymap_name} "
failed_log = f " {QMK_FIRMWARE}/.build/failed.log.{os.getpid()}.{keyboard_safe}.{keymap_name} "
# yapf: disable
f . write (
f """ \
all : { keyboard_safe } _ { keymap_name } _binary
{ keyboard_safe } _ { keymap_name } _binary :
@rm - f " {build_log} " | | true
@echo " Compiling QMK Firmware for target: ' {keyboard_name}:{keymap_name} ' ... " >> " {build_log} "
+ @ $ ( MAKE ) - C " {QMK_FIRMWARE} " - f " {QMK_FIRMWARE}/builddefs/build_keyboard.mk " KEYBOARD = " {keyboard_name} " KEYMAP = " {keymap_name} " COLOR = true SILENT = false { ' ' . join ( cli . args . env ) } \\
>> " {build_log} " 2 > & 1 \\
| | cp " {build_log} " " {failed_log} "
@ { { grep ' \ [ERRORS \ ] ' " {build_log} " > / dev / null 2 > & 1 & & printf " Build %-64s \ e[1;31m[ERRORS] \ e[0m \\ n " " {keyboard_name}:{keymap_name} " ; } } \\
| | { { grep ' \ [WARNINGS \ ] ' " {build_log} " > / dev / null 2 > & 1 & & printf " Build %-64s \ e[1;33m[WARNINGS] \ e[0m \\ n " " {keyboard_name}:{keymap_name} " ; } } \\
| | printf " Build %-64s \ e[1;32m[OK] \ e[0m \\ n " " {keyboard_name}:{keymap_name} "
@rm - f " {build_log} " | | true
""" # noqa
)
# yapf: enable
if cli . args . no_temp :
cli . log . info ( f " {{fg_cyan}}qmk compile -kb {target[0]} -km {target[1]}{{fg_reset}} " )
else :
builddir . mkdir ( parents = True , exist_ok = True )
with open ( makefile , " w " ) as f :
for target in sorted ( targets ) :
keyboard_name = target [ 0 ]
keymap_name = target [ 1 ]
keyboard_safe = keyboard_name . replace ( ' / ' , ' _ ' )
build_log = f " {QMK_FIRMWARE}/.build/build.log.{os.getpid()}.{keyboard_safe}.{keymap_name} "
failed_log = f " {QMK_FIRMWARE}/.build/failed.log.{os.getpid()}.{keyboard_safe}.{keymap_name} "
# yapf: disable
f . write (
f """ \
@rm - rf " {QMK_FIRMWARE}/.build/{keyboard_safe}_{keymap_name}.elf " 2 > / dev / null | | true
@rm - rf " {QMK_FIRMWARE}/.build/{keyboard_safe}_{keymap_name}.map " 2 > / dev / null | | true
@rm - rf " {QMK_FIRMWARE}/.build/obj_{keyboard_safe}_{keymap_name} " | | true
""" # noqa
all : { keyboard_safe } _ { keymap_name } _binary
{ keyboard_safe } _ { keymap_name } _binary :
@rm - f " {build_log} " | | true
@echo " Compiling QMK Firmware for target: ' {keyboard_name}:{keymap_name} ' ... " >> " {build_log} "
+ @ $ ( MAKE ) - C " {QMK_FIRMWARE} " - f " {QMK_FIRMWARE}/builddefs/build_keyboard.mk " KEYBOARD = " {keyboard_name} " KEYMAP = " {keymap_name} " COLOR = true SILENT = false { ' ' . join ( cli . args . env ) } \\
>> " {build_log} " 2 > & 1 \\
| | cp " {build_log} " " {failed_log} "
@ { { grep ' \ [ERRORS \ ] ' " {build_log} " > / dev / null 2 > & 1 & & printf " Build %-64s \ e[1;31m[ERRORS] \ e[0m \\ n " " {keyboard_name}:{keymap_name} " ; } } \\
| | { { grep ' \ [WARNINGS \ ] ' " {build_log} " > / dev / null 2 > & 1 & & printf " Build %-64s \ e[1;33m[WARNINGS] \ e[0m \\ n " " {keyboard_name}:{keymap_name} " ; } } \\
| | printf " Build %-64s \ e[1;32m[OK] \ e[0m \\ n " " {keyboard_name}:{keymap_name} "
@rm - f " {build_log} " | | true
""" # noqa
)
# yapf: enable
f . write ( ' \n ' )
cli . run ( [ make_cmd , * get_make_parallel_args ( cli . args . parallel ) , ' -f ' , makefile . as_posix ( ) , ' all ' ] , capture_output = False , stdin = DEVNULL )
if cli . args . no_temp :
# yapf: disable
f . write (
f """ \
@rm - rf " {QMK_FIRMWARE}/.build/{keyboard_safe}_{keymap_name}.elf " 2 > / dev / null | | true
@rm - rf " {QMK_FIRMWARE}/.build/{keyboard_safe}_{keymap_name}.map " 2 > / dev / null | | true
@rm - rf " {QMK_FIRMWARE}/.build/obj_{keyboard_safe}_{keymap_name} " | | true
""" # noqa
)
# yapf: enable
f . write ( ' \n ' )
cli . run ( [ make_cmd , * get_make_parallel_args ( cli . args . parallel ) , ' -f ' , makefile . as_posix ( ) , ' all ' ] , capture_output = False , stdin = DEVNULL )
# Check for failures
failures = [ f for f in builddir . glob ( f ' failed.log.{os.getpid()}.* ' ) ]
if len ( failures ) > 0 :
return False
# Check for failures
failures = [ f for f in builddir . glob ( f ' failed.log.{os.getpid()}.* ' ) ]
if len ( failures ) > 0 :
return False