include(ParseMakefile) include(Utils) macro(process_keyboard) message(CHECK_START "Processing keyboard") list(APPEND CMAKE_MESSAGE_INDENT " ") validate_json(${QMK_KEYBOARD_FOLDER_ABS}/info.json keyboard QMK_KEYBOARD_INFO_JSON_STRING) # process rules from info.json file(READ ${CMAKE_SOURCE_DIR}/data/mappings/info_rules.hjson JSON_STRING) string(JSON MAPPING_LENGTH LENGTH ${JSON_STRING}) math(EXPR MAX "${MAPPING_LENGTH} - 1") foreach(IDX RANGE ${MAX}) string(JSON RULE_KEY MEMBER ${JSON_STRING} ${IDX}) # string(JSON INFO_KEY GET ${JSON_STRING} ${RULE_KEY} info_key) json_get_with_default(INFO_KEY ${JSON_STRING} _ ${RULE_KEY} info_key) string(REPLACE "." " " INFO_KEYS ${INFO_KEY}) string(JSON RULE_VALUE ERROR_VARIABLE RULE_KEY_NOT_FOUND GET ${QMK_KEYBOARD_INFO_JSON_STRING} ${INFO_KEYS}) if(${RULE_KEY_NOT_FOUND} STREQUAL "NOTFOUND") json_get_with_default(VALUE_TYPE ${JSON_STRING} raw ${RULE_KEY} value_type) if(${VALUE_TYPE} STREQUAL "list") string(JSON NUM_VALUES LENGTH ${RULE_VALUE}) math(EXPR MAX "${NUM_VALUES} - 1") foreach(IDX RANGE ${MAX}) string(JSON VALUE GET ${RULE_VALUE} ${IDX}) list(APPEND ${RULE_KEY} ${VALUE}) endforeach() message(STATUS "Found rule '${INFO_KEY}': '${${RULE_KEY}}' assigned to '${RULE_KEY}'") else() set(${RULE_KEY} ${RULE_VALUE}) message(STATUS "Found rule '${INFO_KEY}': '${RULE_VALUE}' assigned to '${RULE_KEY}'") endif() endif() endforeach() # process definitions from info.json file(READ ${CMAKE_SOURCE_DIR}/data/mappings/info_config.hjson JSON_STRING) string(JSON MAPPING_LENGTH LENGTH ${JSON_STRING}) math(EXPR MAX "${MAPPING_LENGTH} - 1") foreach(IDX RANGE ${MAX}) string(JSON CONFIG_KEY MEMBER ${JSON_STRING} ${IDX}) json_get_with_default(INFO_KEY ${JSON_STRING} _ ${CONFIG_KEY} info_key) string(REPLACE "." ";" INFO_KEYS ${INFO_KEY}) # string(JSON CONFIG_VALUE ERROR_VARIABLE CONFIG_KEY_NOT_FOUND GET ${QMK_KEYBOARD_INFO_JSON_STRING} ${INFO_KEYS}) json_get_with_default(CONFIG_VALUE ${QMK_KEYBOARD_INFO_JSON_STRING} NOTFOUND ${INFO_KEYS}) if(NOT CONFIG_VALUE STREQUAL "NOTFOUND") set(${CONFIG_KEY} ${CONFIG_VALUE}) json_get_with_default(VALUE_TYPE ${JSON_STRING} raw ${CONFIG_KEY} value_type) if(${VALUE_TYPE} STREQUAL "str") add_compile_definitions(${CONFIG_KEY}="${CONFIG_VALUE}") message(STATUS "Found definition '${INFO_KEY}': '\"${CONFIG_VALUE}\"' assigned to '${CONFIG_KEY}'") elseif(${VALUE_TYPE} STREQUAL "bcd_version") string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" VERSION_MATCH ${CONFIG_VALUE}) set(VERSION_MAJOR ${CMAKE_MATCH_1}) set(VERSION_MINOR ${CMAKE_MATCH_2}) set(VERSION_PATCH ${CMAKE_MATCH_3}) math(EXPR BCD_VERSION "${VERSION_MAJOR} * 10000 + ${VERSION_MINOR} * 100 + ${VERSION_PATCH}" OUTPUT_FORMAT HEXADECIMAL) add_compile_definitions(${CONFIG_KEY}=${BCD_VERSION}) message(STATUS "Found definition '${INFO_KEY}': '${BCD_VERSION}' assigned to '${CONFIG_KEY}'") else() add_compile_definitions(${CONFIG_KEY}=${CONFIG_VALUE}) message(STATUS "Found definition '${INFO_KEY}': '${CONFIG_VALUE}' assigned to '${CONFIG_KEY}'") endif() endif() endforeach() string(JSON KEYBOARD_NAME GET ${QMK_KEYBOARD_INFO_JSON_STRING} keyboard_name) string(JSON MANUFACTURER GET ${QMK_KEYBOARD_INFO_JSON_STRING} manufacturer) string(JSON URL GET ${QMK_KEYBOARD_INFO_JSON_STRING} url) string(JSON QMK_MCU GET ${QMK_KEYBOARD_INFO_JSON_STRING} processor) list(POP_BACK CMAKE_MESSAGE_INDENT) message(CHECK_PASS "info.json validated and loaded") ParseMakefile(${QMK_KEYBOARD_FOLDER_ABS}/rules.mk) endmacro()