2021-05-01 03:00:04 +02:00
""" Used by the make system to generate keyboard.h from info.json.
"""
from milc import cli
from qmk . info import info_json
from qmk . keyboard import keyboard_completer , keyboard_folder
2021-05-02 17:43:40 +02:00
from qmk . path import normpath
2021-05-01 03:00:04 +02:00
def would_populate_layout_h ( keyboard ) :
""" Detect if a given keyboard is doing data driven layouts
"""
# Build the info.json file
kb_info_json = info_json ( keyboard )
for layout_name in kb_info_json [ ' layouts ' ] :
if kb_info_json [ ' layouts ' ] [ layout_name ] [ ' c_macro ' ] :
continue
if ' matrix ' not in kb_info_json [ ' layouts ' ] [ layout_name ] [ ' layout ' ] [ 0 ] :
cli . log . debug ( ' %s / %s : No matrix data! ' , keyboard , layout_name )
continue
return True
return False
@cli.argument ( ' -o ' , ' --output ' , arg_only = True , type = normpath , help = ' File to write to ' )
@cli.argument ( ' -q ' , ' --quiet ' , arg_only = True , action = ' store_true ' , help = " Quiet mode, only output error messages " )
2021-08-18 22:52:41 +02:00
@cli.argument ( ' -kb ' , ' --keyboard ' , arg_only = True , type = keyboard_folder , completer = keyboard_completer , required = True , help = ' Keyboard to generate keyboard.h for. ' )
2021-05-01 03:00:04 +02:00
@cli.subcommand ( ' Used by the make system to generate keyboard.h from info.json ' , hidden = True )
def generate_keyboard_h ( cli ) :
""" Generates the keyboard.h file.
"""
2021-08-18 22:52:41 +02:00
has_layout_h = would_populate_layout_h ( cli . args . keyboard )
2021-05-01 03:00:04 +02:00
# Build the layouts.h file.
keyboard_h_lines = [ ' /* This file was generated by `qmk generate-keyboard-h`. Do not edit or copy. ' ' */ ' , ' ' , ' #pragma once ' , ' #include " quantum.h " ' ]
if not has_layout_h :
keyboard_h_lines . append ( ' #pragma error( " <keyboard>.h is only optional for data driven keyboards - kb.h == bad times " ) ' )
# Show the results
keyboard_h = ' \n ' . join ( keyboard_h_lines ) + ' \n '
if cli . args . output :
cli . args . output . parent . mkdir ( parents = True , exist_ok = True )
if cli . args . output . exists ( ) :
cli . args . output . replace ( cli . args . output . parent / ( cli . args . output . name + ' .bak ' ) )
cli . args . output . write_text ( keyboard_h )
if not cli . args . quiet :
cli . log . info ( ' Wrote keyboard_h to %s . ' , cli . args . output )
else :
print ( keyboard_h )