include(Utils) function(resolve_keyboard KEYBOARD KEYBOAD_FOLDER_ABS_STR) message(VERBOSE "Resolving ${KEYBOARD}") if(EXISTS "${CMAKE_SOURCE_DIR}/keyboards/${KEYBOARD}") message(VERBOSE "Found in repo: ${KEYBOARD}") set(${KEYBOAD_FOLDER_ABS_STR} "${CMAKE_SOURCE_DIR}/keyboards/${KEYBOARD}" PARENT_SCOPE) return() endif() if(EXISTS "${CMAKE_SOURCE_DIR}/build/keyboard_repository/${KEYBOARD}") message(VERBOSE "Already checked out: ${KEYBOARD}") set(${KEYBOAD_FOLDER_ABS_STR} "${CMAKE_SOURCE_DIR}/build/keyboard_repository/${KEYBOARD}" PARENT_SCOPE) return() endif() file(READ ${CMAKE_SOURCE_DIR}/data/keyboards.json KEYBOARDS_JSON) string(JSON KEYBOARD_SLUG ERROR_VARIABLE JSON_ERROR GET ${KEYBOARDS_JSON} ${KEYBOARD}) if(${JSON_ERROR} STREQUAL "NOTFOUND") message(VERBOSE "Found ${KEYBOARD_SLUG}") if(${KEYBOARD_SLUG} MATCHES "^@([0-9a-zA-Z_]+/[0-9a-zA-Z_]+)") # keyboard slug is mapped to a github repo set(GIT_SLUG ${CMAKE_MATCH_1}) # string(MAKE_C_IDENTIFIER ${KEYBOARD} KEYBOARD_NAME) message(VERBOSE "Cloning ${GIT_SLUG}") find_package(Git QUIET) if(GIT_FOUND) file(MAKE_DIRECTORY "${CMAKE_SOURCE_DIR}/build/keyboard_repository/${KEYBOARD}") execute_process(COMMAND ${GIT_EXECUTABLE} clone "https://github.com/${GIT_SLUG}.git" . WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/build/keyboard_repository/${KEYBOARD}" RESULT_VARIABLE GIT_SUBMOD_RESULT) if(NOT GIT_SUBMOD_RESULT EQUAL "0") message(FATAL_ERROR "git clone failed with ${GIT_SUBMOD_RESULT}") endif() else() message("Git not found - skipping submodule update") endif() set(${KEYBOAD_FOLDER_ABS_STR} "${CMAKE_SOURCE_DIR}/build/keyboard_repository/${KEYBOARD}" PARENT_SCOPE) else() message(FATAL_ERROR "Didn't match") endif() else() message(FATAL_ERROR "Couldn't find") # set(${RESULT_STR} "NOTFOUND" PARENT_SCOPE) endif() endfunction() function(resolve_config_h KEYBOARD_FOLDER_ABS CONFIG_H_STR) set(${CONFIG_H_STR} PARENT_SCOPE) if(${IS_KEYBOARDS_FOLDER}) file(RELATIVE_PATH RELATIVE_KEYBOARD_FOLDER ${QMK_KEYBOARDS_FOLDER} ${KEYBOARD_FOLDER_ABS}) # get the deepest config.h while(NOT ${RELATIVE_KEYBOARD_FOLDER} STREQUAL "") if(EXISTS "${QMK_KEYBOARDS_FOLDER}/${RELATIVE_KEYBOARD_FOLDER}/config.h") parent_list(PREPEND ${CONFIG_H_STR} "${QMK_KEYBOARDS_FOLDER}/${RELATIVE_KEYBOARD_FOLDER}/config.h") # set(${CONFIG_H_STR} "${QMK_KEYBOARDS_FOLDER}/${RELATIVE_KEYBOARD_FOLDER}/config.h" PARENT_SCOPE) # return() endif() get_filename_component(RELATIVE_KEYBOARD_FOLDER ${RELATIVE_KEYBOARD_FOLDER} DIRECTORY) endwhile() # message(FATAL_ERROR "Could not find config.h in ${KEYBOARD_FOLDER_ABS}") else() if(EXISTS "${KEYBOARD_FOLDER_ABS}/config.h") set(${CONFIG_H_STR} "${KEYBOARD_FOLDER_ABS}/config.h" PARENT_SCOPE) else() message(FATAL_ERROR "Could not find config.h in ${KEYBOARD_FOLDER_ABS}") endif() endif() endfunction() function(resolve_keyboard_h KEYBOARD_FOLDER_ABS KEYBOARD_H_STR) if(${IS_KEYBOARDS_FOLDER}) file(RELATIVE_PATH RELATIVE_KEYBOARD_FOLDER ${QMK_KEYBOARDS_FOLDER} ${KEYBOARD_FOLDER_ABS}) # get the deepest header while(NOT ${RELATIVE_KEYBOARD_FOLDER} STREQUAL "") get_filename_component(LAST_PART ${RELATIVE_KEYBOARD_FOLDER} NAME) if(EXISTS "${QMK_KEYBOARDS_FOLDER}/${RELATIVE_KEYBOARD_FOLDER}/${LAST_PART}.h") set(${KEYBOARD_H_STR} "${QMK_KEYBOARDS_FOLDER}/${RELATIVE_KEYBOARD_FOLDER}/${LAST_PART}.h" PARENT_SCOPE) return() endif() get_filename_component(RELATIVE_KEYBOARD_FOLDER ${RELATIVE_KEYBOARD_FOLDER} DIRECTORY) endwhile() message(FATAL_ERROR "Could not find *.h in ${KEYBOARD_FOLDER_ABS}") else() if(EXISTS "${KEYBOARD_FOLDER_ABS}/keyboard.h") set(${KEYBOARD_H_STR} "${KEYBOARD_FOLDER_ABS}/keyboard.h" PARENT_SCOPE) else() message(FATAL_ERROR "Could not find keyboard.h in ${KEYBOARD_FOLDER_ABS}") endif() endif() endfunction() function(resolve_keymap_c KEYBOARD_FOLDER_ABS KEYMAP_FOLDER KEYMAP_C_STR) if(IS_ABSOLUTE ${KEYMAP_FOLDER}) if(EXISTS "${KEYMAP_FOLDER}/keymap.c") set(${KEYMAP_C_STR} "${KEYMAP_FOLDER}/keymap.c" PARENT_SCOPE) return() endif() else() if(${IS_KEYBOARDS_FOLDER}) file(RELATIVE_PATH RELATIVE_KEYBOARD_FOLDER ${QMK_KEYBOARDS_FOLDER} ${KEYBOARD_FOLDER_ABS}) # get the deepest keymap.c while(NOT ${RELATIVE_KEYBOARD_FOLDER} STREQUAL "") if(EXISTS "${QMK_KEYBOARDS_FOLDER}/${RELATIVE_KEYBOARD_FOLDER}/keymaps/${KEYMAP_FOLDER}/keymap.c") set(${KEYMAP_C_STR} "${QMK_KEYBOARDS_FOLDER}/${RELATIVE_KEYBOARD_FOLDER}/keymaps/${KEYMAP_FOLDER}/keymap.c" PARENT_SCOPE) return() endif() get_filename_component(RELATIVE_KEYBOARD_FOLDER ${RELATIVE_KEYBOARD_FOLDER} DIRECTORY) endwhile() else() if(EXISTS "${KEYBOARD_FOLDER_ABS}/keymap.c") set(${KEYMAP_C_STR} "${KEYBOARD_FOLDER_ABS}/keymap.c" PARENT_SCOPE) return() elseif(EXISTS "${KEYBOARD_FOLDER_ABS}/keymaps/${KEYMAP_FOLDER}/keymap.c") set(${KEYMAP_C_STR} "${KEYBOARD_FOLDER_ABS}/keymaps/${KEYMAP_FOLDER}/keymap.c" PARENT_SCOPE) return() endif() endif() endif() # string(JSON COMMUNITY_LAYOUTS ERROR_VARIABLE NO_COMMUNITY_LAYOUTS GET ${QMK_KEYBOARD_INFO_JSON_STRING} community_layouts) # if(${NO_COMMUNITY_LAYOUTS} STREQUAL "NOTFOUND") # string(JSON NUM_LAYOUTS LENGTH ${COMMUNITY_LAYOUTS}) # math(EXPR MAX "${NUM_LAYOUTS} - 1") foreach(LAYOUT ${LAYOUTS}) # foreach(IDX RANGE ${MAX}) # string(JSON LAYOUT GET ${COMMUNITY_LAYOUTS} ${IDX}) if(EXISTS "${CMAKE_SOURCE_DIR}/layouts/community/${LAYOUT}/${KEYMAP_FOLDER}/keymap.c") set(${KEYMAP_C_STR} "${CMAKE_SOURCE_DIR}/layouts/community/${LAYOUT}/${KEYMAP_FOLDER}/keymap.c" PARENT_SCOPE) return() endif() endforeach() # endif() message(FATAL_ERROR "Could not resolve keymap '${KEYMAP_FOLDER}'") endfunction() function(resolve_keyboard_includes KEYBOARD_FOLDER_ABS) if(${IS_KEYBOARDS_FOLDER}) file(RELATIVE_PATH RELATIVE_KEYBOARD_FOLDER ${QMK_KEYBOARDS_FOLDER} ${KEYBOARD_FOLDER_ABS}) while(NOT ${RELATIVE_KEYBOARD_FOLDER} STREQUAL "") target_include_directories(qmk PUBLIC "${CMAKE_SOURCE_DIR}/keyboards/${RELATIVE_KEYBOARD_FOLDER}") get_filename_component(RELATIVE_KEYBOARD_FOLDER ${RELATIVE_KEYBOARD_FOLDER} DIRECTORY) endwhile() else() target_include_directories(qmk PUBLIC "${KEYBOARD_FOLDER_ABS}") endif() endfunction()