ResolveKeyboard.cmake 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. include(Utils)
  2. function(resolve_keyboard KEYBOARD KEYBOAD_FOLDER_ABS_STR)
  3. message(VERBOSE "Resolving ${KEYBOARD}")
  4. if(EXISTS "${CMAKE_SOURCE_DIR}/keyboards/${KEYBOARD}")
  5. message(VERBOSE "Found in repo: ${KEYBOARD}")
  6. set(${KEYBOAD_FOLDER_ABS_STR} "${CMAKE_SOURCE_DIR}/keyboards/${KEYBOARD}" PARENT_SCOPE)
  7. return()
  8. endif()
  9. if(EXISTS "${CMAKE_SOURCE_DIR}/build/keyboard_repository/${KEYBOARD}")
  10. message(VERBOSE "Already checked out: ${KEYBOARD}")
  11. set(${KEYBOAD_FOLDER_ABS_STR} "${CMAKE_SOURCE_DIR}/build/keyboard_repository/${KEYBOARD}" PARENT_SCOPE)
  12. return()
  13. endif()
  14. file(READ ${CMAKE_SOURCE_DIR}/data/keyboards.json KEYBOARDS_JSON)
  15. string(JSON KEYBOARD_SLUG ERROR_VARIABLE JSON_ERROR GET ${KEYBOARDS_JSON} ${KEYBOARD})
  16. if(${JSON_ERROR} STREQUAL "NOTFOUND")
  17. message(VERBOSE "Found ${KEYBOARD_SLUG}")
  18. if(${KEYBOARD_SLUG} MATCHES "^@([0-9a-zA-Z_]+/[0-9a-zA-Z_]+)")
  19. # keyboard slug is mapped to a github repo
  20. set(GIT_SLUG ${CMAKE_MATCH_1})
  21. # string(MAKE_C_IDENTIFIER ${KEYBOARD} KEYBOARD_NAME)
  22. message(VERBOSE "Cloning ${GIT_SLUG}")
  23. find_package(Git QUIET)
  24. if(GIT_FOUND)
  25. file(MAKE_DIRECTORY "${CMAKE_SOURCE_DIR}/build/keyboard_repository/${KEYBOARD}")
  26. execute_process(COMMAND ${GIT_EXECUTABLE} clone "https://github.com/${GIT_SLUG}.git" .
  27. WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/build/keyboard_repository/${KEYBOARD}"
  28. RESULT_VARIABLE GIT_SUBMOD_RESULT)
  29. if(NOT GIT_SUBMOD_RESULT EQUAL "0")
  30. message(FATAL_ERROR "git clone failed with ${GIT_SUBMOD_RESULT}")
  31. endif()
  32. else()
  33. message("Git not found - skipping submodule update")
  34. endif()
  35. set(${KEYBOAD_FOLDER_ABS_STR} "${CMAKE_SOURCE_DIR}/build/keyboard_repository/${KEYBOARD}" PARENT_SCOPE)
  36. else()
  37. message(FATAL_ERROR "Didn't match")
  38. endif()
  39. else()
  40. message(FATAL_ERROR "Couldn't find")
  41. # set(${RESULT_STR} "NOTFOUND" PARENT_SCOPE)
  42. endif()
  43. endfunction()
  44. function(resolve_config_h KEYBOARD_FOLDER_ABS CONFIG_H_STR)
  45. set(${CONFIG_H_STR} PARENT_SCOPE)
  46. if(${IS_KEYBOARDS_FOLDER})
  47. file(RELATIVE_PATH RELATIVE_KEYBOARD_FOLDER ${QMK_KEYBOARDS_FOLDER} ${KEYBOARD_FOLDER_ABS})
  48. # get the deepest config.h
  49. while(NOT ${RELATIVE_KEYBOARD_FOLDER} STREQUAL "")
  50. if(EXISTS "${QMK_KEYBOARDS_FOLDER}/${RELATIVE_KEYBOARD_FOLDER}/config.h")
  51. parent_list(PREPEND ${CONFIG_H_STR} "${QMK_KEYBOARDS_FOLDER}/${RELATIVE_KEYBOARD_FOLDER}/config.h")
  52. # set(${CONFIG_H_STR} "${QMK_KEYBOARDS_FOLDER}/${RELATIVE_KEYBOARD_FOLDER}/config.h" PARENT_SCOPE)
  53. # return()
  54. endif()
  55. get_filename_component(RELATIVE_KEYBOARD_FOLDER ${RELATIVE_KEYBOARD_FOLDER} DIRECTORY)
  56. endwhile()
  57. # message(FATAL_ERROR "Could not find config.h in ${KEYBOARD_FOLDER_ABS}")
  58. else()
  59. if(EXISTS "${KEYBOARD_FOLDER_ABS}/config.h")
  60. set(${CONFIG_H_STR} "${KEYBOARD_FOLDER_ABS}/config.h" PARENT_SCOPE)
  61. else()
  62. message(FATAL_ERROR "Could not find config.h in ${KEYBOARD_FOLDER_ABS}")
  63. endif()
  64. endif()
  65. endfunction()
  66. function(resolve_keyboard_h KEYBOARD_FOLDER_ABS KEYBOARD_H_STR)
  67. if(${IS_KEYBOARDS_FOLDER})
  68. file(RELATIVE_PATH RELATIVE_KEYBOARD_FOLDER ${QMK_KEYBOARDS_FOLDER} ${KEYBOARD_FOLDER_ABS})
  69. # get the deepest header
  70. while(NOT ${RELATIVE_KEYBOARD_FOLDER} STREQUAL "")
  71. get_filename_component(LAST_PART ${RELATIVE_KEYBOARD_FOLDER} NAME)
  72. if(EXISTS "${QMK_KEYBOARDS_FOLDER}/${RELATIVE_KEYBOARD_FOLDER}/${LAST_PART}.h")
  73. set(${KEYBOARD_H_STR} "${QMK_KEYBOARDS_FOLDER}/${RELATIVE_KEYBOARD_FOLDER}/${LAST_PART}.h" PARENT_SCOPE)
  74. return()
  75. endif()
  76. get_filename_component(RELATIVE_KEYBOARD_FOLDER ${RELATIVE_KEYBOARD_FOLDER} DIRECTORY)
  77. endwhile()
  78. message(FATAL_ERROR "Could not find *.h in ${KEYBOARD_FOLDER_ABS}")
  79. else()
  80. if(EXISTS "${KEYBOARD_FOLDER_ABS}/keyboard.h")
  81. set(${KEYBOARD_H_STR} "${KEYBOARD_FOLDER_ABS}/keyboard.h" PARENT_SCOPE)
  82. else()
  83. message(FATAL_ERROR "Could not find keyboard.h in ${KEYBOARD_FOLDER_ABS}")
  84. endif()
  85. endif()
  86. endfunction()
  87. function(resolve_keymap_c KEYBOARD_FOLDER_ABS KEYMAP_FOLDER KEYMAP_C_STR)
  88. if(IS_ABSOLUTE ${KEYMAP_FOLDER})
  89. if(EXISTS "${KEYMAP_FOLDER}/keymap.c")
  90. set(${KEYMAP_C_STR} "${KEYMAP_FOLDER}/keymap.c" PARENT_SCOPE)
  91. return()
  92. endif()
  93. else()
  94. if(${IS_KEYBOARDS_FOLDER})
  95. file(RELATIVE_PATH RELATIVE_KEYBOARD_FOLDER ${QMK_KEYBOARDS_FOLDER} ${KEYBOARD_FOLDER_ABS})
  96. # get the deepest keymap.c
  97. while(NOT ${RELATIVE_KEYBOARD_FOLDER} STREQUAL "")
  98. if(EXISTS "${QMK_KEYBOARDS_FOLDER}/${RELATIVE_KEYBOARD_FOLDER}/keymaps/${KEYMAP_FOLDER}/keymap.c")
  99. set(${KEYMAP_C_STR} "${QMK_KEYBOARDS_FOLDER}/${RELATIVE_KEYBOARD_FOLDER}/keymaps/${KEYMAP_FOLDER}/keymap.c" PARENT_SCOPE)
  100. return()
  101. endif()
  102. get_filename_component(RELATIVE_KEYBOARD_FOLDER ${RELATIVE_KEYBOARD_FOLDER} DIRECTORY)
  103. endwhile()
  104. else()
  105. if(EXISTS "${KEYBOARD_FOLDER_ABS}/keymap.c")
  106. set(${KEYMAP_C_STR} "${KEYBOARD_FOLDER_ABS}/keymap.c" PARENT_SCOPE)
  107. return()
  108. elseif(EXISTS "${KEYBOARD_FOLDER_ABS}/keymaps/${KEYMAP_FOLDER}/keymap.c")
  109. set(${KEYMAP_C_STR} "${KEYBOARD_FOLDER_ABS}/keymaps/${KEYMAP_FOLDER}/keymap.c" PARENT_SCOPE)
  110. return()
  111. endif()
  112. endif()
  113. endif()
  114. # string(JSON COMMUNITY_LAYOUTS ERROR_VARIABLE NO_COMMUNITY_LAYOUTS GET ${QMK_KEYBOARD_INFO_JSON_STRING} community_layouts)
  115. # if(${NO_COMMUNITY_LAYOUTS} STREQUAL "NOTFOUND")
  116. # string(JSON NUM_LAYOUTS LENGTH ${COMMUNITY_LAYOUTS})
  117. # math(EXPR MAX "${NUM_LAYOUTS} - 1")
  118. foreach(LAYOUT ${LAYOUTS})
  119. # foreach(IDX RANGE ${MAX})
  120. # string(JSON LAYOUT GET ${COMMUNITY_LAYOUTS} ${IDX})
  121. if(EXISTS "${CMAKE_SOURCE_DIR}/layouts/community/${LAYOUT}/${KEYMAP_FOLDER}/keymap.c")
  122. set(${KEYMAP_C_STR} "${CMAKE_SOURCE_DIR}/layouts/community/${LAYOUT}/${KEYMAP_FOLDER}/keymap.c" PARENT_SCOPE)
  123. return()
  124. endif()
  125. endforeach()
  126. # endif()
  127. message(FATAL_ERROR "Could not resolve keymap '${KEYMAP_FOLDER}'")
  128. endfunction()
  129. function(resolve_keyboard_includes KEYBOARD_FOLDER_ABS)
  130. if(${IS_KEYBOARDS_FOLDER})
  131. file(RELATIVE_PATH RELATIVE_KEYBOARD_FOLDER ${QMK_KEYBOARDS_FOLDER} ${KEYBOARD_FOLDER_ABS})
  132. while(NOT ${RELATIVE_KEYBOARD_FOLDER} STREQUAL "")
  133. target_include_directories(qmk PUBLIC "${CMAKE_SOURCE_DIR}/keyboards/${RELATIVE_KEYBOARD_FOLDER}")
  134. get_filename_component(RELATIVE_KEYBOARD_FOLDER ${RELATIVE_KEYBOARD_FOLDER} DIRECTORY)
  135. endwhile()
  136. else()
  137. target_include_directories(qmk PUBLIC "${KEYBOARD_FOLDER_ABS}")
  138. endif()
  139. endfunction()