From 4d999378d082cb66d553558ef519da128ad0d83e Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Mon, 3 Apr 2023 13:43:40 -0400 Subject: [PATCH] more absolute keyboard/keymap support --- CMakeLists.txt | 149 +++++++++++++++++++++++----------------- cmake/AddKeyboard.cmake | 6 +- 2 files changed, 89 insertions(+), 66 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ada5c260af9..ace52077e1b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,27 +20,8 @@ else() # build step -set(QMK_KEYBOARD_CURRENT_FOLDER ${QMK_KEYBOARD_FOLDER}) -set(QMK_KEYBOARD_FOLDERS) -set(QMK_KEYBOARD_FOLDER_PARTS) -while(NOT ${QMK_KEYBOARD_CURRENT_FOLDER} STREQUAL "") - get_filename_component(QMK_KEYBOARD_CURRENT_PART ${QMK_KEYBOARD_CURRENT_FOLDER} NAME) - list(PREPEND QMK_KEYBOARD_FOLDER_PARTS ${QMK_KEYBOARD_CURRENT_PART}) - list(PREPEND QMK_KEYBOARD_FOLDERS ${QMK_KEYBOARD_CURRENT_FOLDER}) - get_filename_component(QMK_KEYBOARD_CURRENT_FOLDER ${QMK_KEYBOARD_CURRENT_FOLDER} DIRECTORY) -endwhile() - -# would be nice to also do validation here -include(ValidateJSON) -validate_json(keyboards/${QMK_KEYBOARD_FOLDER}/info.json keyboard QMK_KEYBOARD_INFO_JSON_STRING) - -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) -string(JSON VENDOR_ID GET ${QMK_KEYBOARD_INFO_JSON_STRING} usb vid) -string(JSON PRODUCT_ID GET ${QMK_KEYBOARD_INFO_JSON_STRING} usb pid) -string(JSON DEVICE_VER GET ${QMK_KEYBOARD_INFO_JSON_STRING} usb device_version) +set(TEMP_PATH ${QMK_KEYBOARD_FOLDER}) +cmake_path(IS_RELATIVE TEMP_PATH IS_KEYBOARD_FOLDER_RELATIVE) if(NOT DEFINED QMK_KEYMAP_FOLDER) set(QMK_KEYMAP_FOLDER "default") @@ -49,57 +30,99 @@ endif() set(TEMP_PATH ${QMK_KEYMAP_FOLDER}) cmake_path(IS_RELATIVE TEMP_PATH IS_KEYMAP_FOLDER_RELATIVE) -if(NOT ${IS_KEYMAP_FOLDER_RELATIVE}) - if(EXISTS "${QMK_KEYMAP_FOLDER}/keymap.c") - set(QMK_KEYBOARD_KEYMAP "${QMK_KEYMAP_FOLEDR}/keymap.c") - else() - message(FATAL_ERROR "Could not find keymap.c in keymap folder") - endif() -endif() +if(${IS_KEYBOARD_FOLDER_RELATIVE}) +set(QMK_KEYBOARD_FOLDER_ABS ${CMAKE_SOURCE_DIR}/keyboards/${QMK_KEYBOARD_FOLDER}) + set(QMK_KEYBOARD_CURRENT_FOLDER ${QMK_KEYBOARD_FOLDER}) + set(QMK_KEYBOARD_FOLDERS) + set(QMK_KEYBOARD_FOLDER_PARTS) + while(NOT ${QMK_KEYBOARD_CURRENT_FOLDER} STREQUAL "") + get_filename_component(QMK_KEYBOARD_CURRENT_PART ${QMK_KEYBOARD_CURRENT_FOLDER} NAME) + list(PREPEND QMK_KEYBOARD_FOLDER_PARTS ${QMK_KEYBOARD_CURRENT_PART}) + list(PREPEND QMK_KEYBOARD_FOLDERS ${QMK_KEYBOARD_CURRENT_FOLDER}) + get_filename_component(QMK_KEYBOARD_CURRENT_FOLDER ${QMK_KEYBOARD_CURRENT_FOLDER} DIRECTORY) + endwhile() + + foreach(FOLDER ${QMK_KEYBOARD_FOLDERS}) + include_directories(${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}) + # assuming every keyboard has a config at some level + if(EXISTS ${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/config.h) + list(APPEND QMK_KEYBOARD_CONFIG_HS "${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/config.h") + endif() + if(${IS_KEYMAP_FOLDER_RELATIVE}) + # assuming every keyboard has a default/keymap.c at some level + if(EXISTS ${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/keymaps/${QMK_KEYMAP_FOLDER}/keymap.c) + list(APPEND QMK_KEYBOARD_KEYMAPS "${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/keymaps/${QMK_KEYMAP_FOLDER}/keymap.c") + endif() + endif() + get_filename_component(LAST_PART ${FOLDER} NAME) + # assuming every keyboard has a header.h at some level + if(EXISTS ${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/${LAST_PART}.h) + # use just the filename, since the folder is already in our include path (maybe it should only be the base keyboard folder?) + list(APPEND QMK_KEYBOARD_HEADERS "${LAST_PART}.h") + endif() + # not sure if merging is needed, since info.json is required per level? iirc + # if(EXISTS keyboards/${FOLDER}/info.json) + # file(READ keyboards/${FOLDER}/info.json QMK_KEYBOARD_INFO_JSON_STRING) + # string(JSON KEYBOARD_NAME GET ${QMK_KEYBOARD_INFO_JSON_STRING} keyboard_name) + # string(JSON MANUFACTURER GET ${QMK_KEYBOARD_INFO_JSON_STRING} manufacturer) + # string(JSON QMK_MCU GET ${QMK_KEYBOARD_INFO_JSON_STRING} processor) + # string(JSON VENDOR_ID GET ${QMK_KEYBOARD_INFO_JSON_STRING} usb vid) + # string(JSON PRODUCT_ID GET ${QMK_KEYBOARD_INFO_JSON_STRING} usb pid) + # string(JSON DEVICE_VER GET ${QMK_KEYBOARD_INFO_JSON_STRING} usb device_version) + # endif() + endforeach() -foreach(FOLDER ${QMK_KEYBOARD_FOLDERS}) - include_directories(${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}) - # assuming every keyboard has a config at some level - if(EXISTS ${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/config.h) - list(APPEND QMK_KEYBOARD_CONFIG_HS "${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/config.h") - endif() if(${IS_KEYMAP_FOLDER_RELATIVE}) - # assuming every keyboard has a default/keymap.c at some level - if(EXISTS ${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/keymaps/${QMK_KEYMAP_FOLDER}/keymap.c) - list(APPEND QMK_KEYBOARD_KEYMAPS "${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/keymaps/${QMK_KEYMAP_FOLDER}/keymap.c") + if(NOT DEFINED QMK_KEYBOARD_KEYMAPS) + message(FATAL_ERROR "Keymap not found") + endif() + list(GET QMK_KEYBOARD_KEYMAPS 0 QMK_KEYBOARD_KEYMAP) + else() + if(EXISTS "${QMK_KEYMAP_FOLDER}/keymap.c") + set(QMK_KEYBOARD_KEYMAP "${QMK_KEYMAP_FOLEDR}/keymap.c") + else() + message(FATAL_ERROR "Could not find keymap.c in keymap folder") endif() endif() - get_filename_component(LAST_PART ${FOLDER} NAME) - # assuming every keyboard has a header.h at some level - if(EXISTS ${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/${LAST_PART}.h) - # use just the filename, since the folder is already in our include path (maybe it should only be the base keyboard folder?) - list(APPEND QMK_KEYBOARD_HEADERS "${LAST_PART}.h") - endif() - # not sure if merging is needed, since info.json is required per level? iirc - # if(EXISTS keyboards/${FOLDER}/info.json) - # file(READ keyboards/${FOLDER}/info.json QMK_KEYBOARD_INFO_JSON_STRING) - # string(JSON KEYBOARD_NAME GET ${QMK_KEYBOARD_INFO_JSON_STRING} keyboard_name) - # string(JSON MANUFACTURER GET ${QMK_KEYBOARD_INFO_JSON_STRING} manufacturer) - # string(JSON QMK_MCU GET ${QMK_KEYBOARD_INFO_JSON_STRING} processor) - # string(JSON VENDOR_ID GET ${QMK_KEYBOARD_INFO_JSON_STRING} usb vid) - # string(JSON PRODUCT_ID GET ${QMK_KEYBOARD_INFO_JSON_STRING} usb pid) - # string(JSON DEVICE_VER GET ${QMK_KEYBOARD_INFO_JSON_STRING} usb device_version) - # endif() -endforeach() -if(${IS_KEYMAP_FOLDER_RELATIVE}) - if(NOT DEFINED QMK_KEYBOARD_KEYMAPS) - message(FATAL_ERROR "Keymap not found") + if(NOT DEFINED QMK_KEYBOARD_HEADERS) + message(FATAL_ERROR "Header not found") + endif() + + list(GET QMK_KEYBOARD_HEADERS -1 QMK_KEYBOARD_HEADER) +else(${IS_KEYBOARD_FOLDER_RELATIVE}) + set(QMK_KEYBOARD_FOLDER_ABS ${QMK_KEYBOARD_FOLDER}) + + if(${IS_KEYMAP_FOLDER_RELATIVE}) + if(EXISTS "${QMK_KEYBOARD_FOLDER}/keymaps/${QMK_KEYMAP_FOLDER}/keymap.c") + set(QMK_KEYBOARD_KEYMAP "${QMK_KEYBOARD_FOLDER}/keymaps/{QMK_KEYMAP_FOLDER}/keymap.c") + else() + message(FATAL_ERROR "Could not find keymap in keymap folder '${QMK_KEYMAP_FOLDER}'") + endif() + else() + if(EXISTS "${QMK_KEYMAP_FOLDER}/keymap.c") + set(QMK_KEYBOARD_KEYMAP "{QMK_KEYMAP_FOLDER}/keymap.c") + else() + message(FATAL_ERROR "Could not find keymap in keymap folder '${QMK_KEYMAP_FOLDER}'") + endif() + endif() + + if(NOT DEFINED QMK_KEYBOARD_HEADER) + get_filename_component((LAST_PART ${QMK_KEYBOARD_FOLDER}) NAME) + set(QMK_KEYBOARD_HEADER "${LAST_PART}.h") endif() - list(GET QMK_KEYBOARD_KEYMAPS 0 QMK_KEYBOARD_KEYMAP) endif() -if(NOT DEFINED QMK_KEYBOARD_HEADERS) - message(FATAL_ERROR "Header not found") -endif() +include(ValidateJSON) +validate_json(${QMK_KEYBOARD_FOLDER_ABS}/info.json keyboard QMK_KEYBOARD_INFO_JSON_STRING) -# list(GET QMK_KEYBOARD_FOLDERS 0 QMK_KEYBOARD_BASE_FOLDER) -list(GET QMK_KEYBOARD_HEADERS -1 QMK_KEYBOARD_HEADER) +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) +string(JSON VENDOR_ID GET ${QMK_KEYBOARD_INFO_JSON_STRING} usb vid) +string(JSON PRODUCT_ID GET ${QMK_KEYBOARD_INFO_JSON_STRING} usb pid) +string(JSON DEVICE_VER GET ${QMK_KEYBOARD_INFO_JSON_STRING} usb device_version) project(${QMK_KEYBOARD} LANGUAGES C CXX ASM diff --git a/cmake/AddKeyboard.cmake b/cmake/AddKeyboard.cmake index c8b6d29f74b..05a1028e231 100644 --- a/cmake/AddKeyboard.cmake +++ b/cmake/AddKeyboard.cmake @@ -27,7 +27,7 @@ macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) endif() # find the right toolchain - + # not sure we need to validate here include(ValidateJSON) validate_json(${KEYBOARD_FOLDER_ABS}/info.json keyboard JSON_STRING) @@ -52,10 +52,10 @@ macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) endif() if(${IS_KEYBOARD_FOLDER_RELATIVE}) - string(REPLACE "/" "_" KEYBOARD_NAME ${KEYBOARD_FOLDER}) + string(MAKE_C_IDENTIFIER ${KEYBOARD_FOLDER} KEYBOARD_NAME) else() string(JSON KEYBOARD_NAME GET ${JSON_STRING} keyboard_name) - string(REPLACE " " "_" KEYBOARD_NAME ${KEYBOARD_NAME}) + string(MAKE_C_IDENTIFIER ${KEYBOARD_NAME} KEYBOARD_NAME) endif() ExternalProject_Add(${KEYBOARD_NAME}_${KEYMAP_NAME}