ProcessKeyboard.cmake 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. include(ParseMakefile)
  2. include(Utils)
  3. macro(process_keyboard)
  4. message(CHECK_START "Processing keyboard")
  5. list(APPEND CMAKE_MESSAGE_INDENT " ")
  6. validate_json(${QMK_KEYBOARD_FOLDER_ABS}/info.json keyboard QMK_KEYBOARD_INFO_JSON_STRING)
  7. # process rules from info.json
  8. file(READ ${CMAKE_SOURCE_DIR}/data/mappings/info_rules.hjson JSON_STRING)
  9. string(JSON MAPPING_LENGTH LENGTH ${JSON_STRING})
  10. math(EXPR MAX "${MAPPING_LENGTH} - 1")
  11. foreach(IDX RANGE ${MAX})
  12. string(JSON RULE_KEY MEMBER ${JSON_STRING} ${IDX})
  13. # string(JSON INFO_KEY GET ${JSON_STRING} ${RULE_KEY} info_key)
  14. json_get_with_default(INFO_KEY ${JSON_STRING} _ ${RULE_KEY} info_key)
  15. string(REPLACE "." " " INFO_KEYS ${INFO_KEY})
  16. string(JSON RULE_VALUE ERROR_VARIABLE RULE_KEY_NOT_FOUND GET ${QMK_KEYBOARD_INFO_JSON_STRING} ${INFO_KEYS})
  17. if(${RULE_KEY_NOT_FOUND} STREQUAL "NOTFOUND")
  18. json_get_with_default(VALUE_TYPE ${JSON_STRING} raw ${RULE_KEY} value_type)
  19. if(${VALUE_TYPE} STREQUAL "list")
  20. string(JSON NUM_VALUES LENGTH ${RULE_VALUE})
  21. math(EXPR MAX "${NUM_VALUES} - 1")
  22. foreach(IDX RANGE ${MAX})
  23. string(JSON VALUE GET ${RULE_VALUE} ${IDX})
  24. list(APPEND ${RULE_KEY} ${VALUE})
  25. endforeach()
  26. message(STATUS "Found rule '${INFO_KEY}': '${${RULE_KEY}}' assigned to '${RULE_KEY}'")
  27. else()
  28. set(${RULE_KEY} ${RULE_VALUE})
  29. message(STATUS "Found rule '${INFO_KEY}': '${RULE_VALUE}' assigned to '${RULE_KEY}'")
  30. endif()
  31. endif()
  32. endforeach()
  33. # process definitions from info.json
  34. file(READ ${CMAKE_SOURCE_DIR}/data/mappings/info_config.hjson JSON_STRING)
  35. string(JSON MAPPING_LENGTH LENGTH ${JSON_STRING})
  36. math(EXPR MAX "${MAPPING_LENGTH} - 1")
  37. foreach(IDX RANGE ${MAX})
  38. string(JSON CONFIG_KEY MEMBER ${JSON_STRING} ${IDX})
  39. json_get_with_default(INFO_KEY ${JSON_STRING} _ ${CONFIG_KEY} info_key)
  40. string(REPLACE "." ";" INFO_KEYS ${INFO_KEY})
  41. # string(JSON CONFIG_VALUE ERROR_VARIABLE CONFIG_KEY_NOT_FOUND GET ${QMK_KEYBOARD_INFO_JSON_STRING} ${INFO_KEYS})
  42. json_get_with_default(CONFIG_VALUE ${QMK_KEYBOARD_INFO_JSON_STRING} NOTFOUND ${INFO_KEYS})
  43. if(NOT CONFIG_VALUE STREQUAL "NOTFOUND")
  44. set(${CONFIG_KEY} ${CONFIG_VALUE})
  45. json_get_with_default(VALUE_TYPE ${JSON_STRING} raw ${CONFIG_KEY} value_type)
  46. if(${VALUE_TYPE} STREQUAL "str")
  47. add_compile_definitions(${CONFIG_KEY}="${CONFIG_VALUE}")
  48. message(STATUS "Found definition '${INFO_KEY}': '\"${CONFIG_VALUE}\"' assigned to '${CONFIG_KEY}'")
  49. elseif(${VALUE_TYPE} STREQUAL "bcd_version")
  50. string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" VERSION_MATCH ${CONFIG_VALUE})
  51. set(VERSION_MAJOR ${CMAKE_MATCH_1})
  52. set(VERSION_MINOR ${CMAKE_MATCH_2})
  53. set(VERSION_PATCH ${CMAKE_MATCH_3})
  54. math(EXPR BCD_VERSION "${VERSION_MAJOR} * 10000 + ${VERSION_MINOR} * 100 + ${VERSION_PATCH}" OUTPUT_FORMAT HEXADECIMAL)
  55. add_compile_definitions(${CONFIG_KEY}=${BCD_VERSION})
  56. message(STATUS "Found definition '${INFO_KEY}': '${BCD_VERSION}' assigned to '${CONFIG_KEY}'")
  57. else()
  58. add_compile_definitions(${CONFIG_KEY}=${CONFIG_VALUE})
  59. message(STATUS "Found definition '${INFO_KEY}': '${CONFIG_VALUE}' assigned to '${CONFIG_KEY}'")
  60. endif()
  61. endif()
  62. endforeach()
  63. string(JSON KEYBOARD_NAME GET ${QMK_KEYBOARD_INFO_JSON_STRING} keyboard_name)
  64. string(JSON MANUFACTURER GET ${QMK_KEYBOARD_INFO_JSON_STRING} manufacturer)
  65. string(JSON URL GET ${QMK_KEYBOARD_INFO_JSON_STRING} url)
  66. string(JSON QMK_MCU GET ${QMK_KEYBOARD_INFO_JSON_STRING} processor)
  67. list(POP_BACK CMAKE_MESSAGE_INDENT)
  68. message(CHECK_PASS "info.json validated and loaded")
  69. ParseMakefile(${QMK_KEYBOARD_FOLDER_ABS}/rules.mk)
  70. endmacro()