more absolute keyboard/keymap support

This commit is contained in:
Jack Humbert 2023-04-03 13:43:40 -04:00
parent 2ebad0d33f
commit 4d999378d0
2 changed files with 89 additions and 66 deletions

View File

@ -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

View File

@ -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}