From ca8596e4a819c94a0ae122baf5dd14f453cb8c8e Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 1 Apr 2023 18:03:54 -0400 Subject: [PATCH 01/26] compiling basic AVR --- .gitignore | 2 +- .vscode/cmake-kits.json | 9 ++ CMakeLists.txt | 21 +++ keyboards/mntre/CMakeLists.txt | 11 ++ platforms/CMakeLists.txt | 3 + platforms/avr/CMakeLists.txt | 11 ++ platforms/avr/toolchain.cmake | 201 ++++++++++++++++++++++++++ platforms/toolchain.cmake | 54 +++++++ quantum/CMakeLists.txt | 35 +++++ tmk_core/protocol/CMakeLists.txt | 13 ++ tmk_core/protocol/lufa/CMakeLists.txt | 85 +++++++++++ 11 files changed, 444 insertions(+), 1 deletion(-) create mode 100644 .vscode/cmake-kits.json create mode 100644 CMakeLists.txt create mode 100644 keyboards/mntre/CMakeLists.txt create mode 100644 platforms/CMakeLists.txt create mode 100644 platforms/avr/CMakeLists.txt create mode 100644 platforms/avr/toolchain.cmake create mode 100644 platforms/toolchain.cmake create mode 100644 quantum/CMakeLists.txt create mode 100644 tmk_core/protocol/CMakeLists.txt create mode 100644 tmk_core/protocol/lufa/CMakeLists.txt diff --git a/.gitignore b/.gitignore index e36b9ae130..4909f67406 100644 --- a/.gitignore +++ b/.gitignore @@ -52,7 +52,7 @@ quantum/version.h .history/ build/ cmake-build-debug -CMakeLists.txt +# CMakeLists.txt *.pdf # Let these ones be user specific, since we have so many different configurations diff --git a/.vscode/cmake-kits.json b/.vscode/cmake-kits.json new file mode 100644 index 0000000000..ca0bc0126c --- /dev/null +++ b/.vscode/cmake-kits.json @@ -0,0 +1,9 @@ +[ + { + "name": "AVR GCC", + "compilers": { + "CC": "C:\\QMK_MSYS\\mingw64\\bin\\avr-gcc.exe", + "CXX": "C:\\QMK_MSYS\\mingw64\\bin\\avr-g++.exe" + } + } +] \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000000..4c68bfda32 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.3) + +# if(NOT DEFINED QMK_ROOT) + +project(qmk_firmware) + +include(ExternalProject) +ExternalProject_Add(mntre + SOURCE_DIR ${CMAKE_SOURCE_DIR}/keyboards/mntre + TMP_DIR ${CMAKE_SOURCE_DIR}/build + CMAKE_GENERATOR "MinGW Makefiles" + CMAKE_ARGS + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/platforms/avr/toolchain.cmake + -DQMK_ROOT=${CMAKE_CURRENT_SOURCE_DIR} +) + +# else() + +# add_subdirectory() + +# endif() \ No newline at end of file diff --git a/keyboards/mntre/CMakeLists.txt b/keyboards/mntre/CMakeLists.txt new file mode 100644 index 0000000000..087a0cfac3 --- /dev/null +++ b/keyboards/mntre/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.3) + +project(mntre C CXX ASM) + +add_qmk_executable(mntre + mntre.c +) +# set(QMK_INFO_JSON ${CMAKE_CURRENT_SOURCE_DIR}/info.json PARENT_SCOPE) +# add_compile_definitions(QMK_KEYMAP_CONFIG_H="${CMAKE_CURRENT_SOURCE_DIR}/config.h") + +# avr_target_link_libraries(mntre qmk) \ No newline at end of file diff --git a/platforms/CMakeLists.txt b/platforms/CMakeLists.txt new file mode 100644 index 0000000000..3f57a6698e --- /dev/null +++ b/platforms/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library(platforms suspend.c synchronization_util.c timer.c) +target_include_directories(platforms PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(platforms PUBLIC quantum) \ No newline at end of file diff --git a/platforms/avr/CMakeLists.txt b/platforms/avr/CMakeLists.txt new file mode 100644 index 0000000000..dd8f58dadb --- /dev/null +++ b/platforms/avr/CMakeLists.txt @@ -0,0 +1,11 @@ +add_library(platforms_avr + hardware_id.c + platform.c + suspend.c + timer.c + printf.c + xprintf.S + bootloaders/bootloadhid.c +) +target_include_directories(platforms_avr PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(platforms_avr PUBLIC platforms quantum) \ No newline at end of file diff --git a/platforms/avr/toolchain.cmake b/platforms/avr/toolchain.cmake new file mode 100644 index 0000000000..8956190320 --- /dev/null +++ b/platforms/avr/toolchain.cmake @@ -0,0 +1,201 @@ +# +# AVR GCC Toolchain file +# +# @author Natesh Narain +# @since Feb 06 2016 + +set(TRIPLE "avr") + +# find the toolchain root directory + +if(UNIX) + + set(OS_SUFFIX "") + find_path(TOOLCHAIN_ROOT + NAMES + ${TRIPLE}-gcc${OS_SUFFIX} + + PATHS + /usr/bin/ + /usr/local/bin + /bin/ + + $ENV{AVR_ROOT} + ) + +elseif(WIN32) + + set(OS_SUFFIX ".exe") + find_path(TOOLCHAIN_ROOT + NAMES + ${TRIPLE}-gcc${OS_SUFFIX} + + PATHS + "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" + $ENV{AVR_ROOT} + ) + +else(UNIX) + message(FATAL_ERROR "toolchain not supported on this OS") +endif(UNIX) + +if(NOT TOOLCHAIN_ROOT) + message(FATAL_ERROR "Toolchain root could not be found!!!") +endif(NOT TOOLCHAIN_ROOT) + +# setup the AVR compiler variables + +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR avr) +set(CMAKE_CROSS_COMPILING 1) + +set(CMAKE_MAKE_PROGRAM "${TOOLCHAIN_ROOT}/make.exe" CACHE PATH "make" FORCE) +set(CMAKE_C_COMPILER "${TOOLCHAIN_ROOT}/${TRIPLE}-gcc${OS_SUFFIX}" CACHE PATH "gcc" FORCE) +set(CMAKE_CXX_COMPILER "${TOOLCHAIN_ROOT}/${TRIPLE}-g++${OS_SUFFIX}" CACHE PATH "g++" FORCE) +set(CMAKE_AR "${TOOLCHAIN_ROOT}/${TRIPLE}-ar${OS_SUFFIX}" CACHE PATH "ar" FORCE) +set(CMAKE_AS "${TOOLCHAIN_ROOT}/${TRIPLE}-as${OS_SUFFIX}" CACHE PATH "as" FORCE) +set(CMAKE_LINKER "${TOOLCHAIN_ROOT}/${TRIPLE}-ld${OS_SUFFIX}" CACHE PATH "linker" FORCE) +set(CMAKE_NM "${TOOLCHAIN_ROOT}/${TRIPLE}-nm${OS_SUFFIX}" CACHE PATH "nm" FORCE) +set(CMAKE_OBJCOPY "${TOOLCHAIN_ROOT}/${TRIPLE}-objcopy${OS_SUFFIX}" CACHE PATH "objcopy" FORCE) +set(CMAKE_OBJDUMP "${TOOLCHAIN_ROOT}/${TRIPLE}-objdump${OS_SUFFIX}" CACHE PATH "objdump" FORCE) +set(CMAKE_STRIP "${TOOLCHAIN_ROOT}/${TRIPLE}-strip${OS_SUFFIX}" CACHE PATH "strip" FORCE) +set(CMAKE_RANLIB "${TOOLCHAIN_ROOT}/${TRIPLE}-ranlib${OS_SUFFIX}" CACHE PATH "ranlib" FORCE) +set(AVR_SIZE "${TOOLCHAIN_ROOT}/${TRIPLE}-size${OS_SUFFIX}" CACHE PATH "size" FORCE) + +# set(CMAKE_EXE_LINKER_FLAGS "-L /usr/lib/gcc/avr/4.8.2") + +# avr uploader config +find_program(AVR_UPLOAD + NAME + avrdude + + PATHS + /usr/bin/ + $ENV{AVR_ROOT} +) + +# setup the avr exectable macro + +# set(AVR_LINKER_LIBS "-lc -lm -lgcc -Wl,-lprintf_flt -Wl,-u,vfprintf") + +macro(add_qmk_executable target_name) + + add_compile_options( + $<$:-std=gnu11> + $<$:-std=gnu++14> + # -flto + -Os + -Wall + -Wstrict-prototypes + -fcommon + # -g + --param=min-pagesize=0 + -funsigned-char + -funsigned-bitfields + -ffunction-sections + -fdata-sections + -fpack-struct + -fshort-enums + -mcall-prologues + -fno-builtin-printf + $<$:-fno-inline-small-functions> + $<$:-fno-strict-aliasing> + $<$:-fno-exceptions> + ) + + add_compile_definitions( + F_CPU=16000000 + F_USB=16000000UL + __AVR_ATmega32U4__ + # LTO_ENABLE + ) + + add_link_options(-Wl,--gc-sections,-Map=${map_file}) + + include(${QMK_ROOT}/platforms/toolchain.cmake) + add_qmk_executable_common(${target_name}) + + add_subdirectory(${QMK_ROOT}/platforms/avr platforms/avr) + add_subdirectory(${QMK_ROOT}/tmk_core/protocol/lufa tmk_core/protocol/lufa) + + include_directories("C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/avr/include") + + set(elf_file ${target_name}-${QMK_MCU}.elf) + set(map_file ${target_name}-${QMK_MCU}.map) + set(hex_file ${target_name}-${QMK_MCU}.hex) + set(lst_file ${target_name}-${QMK_MCU}.lst) + + # create elf file + add_executable(${elf_file} + ${ARGN} + ) + + target_link_libraries(${elf_file} + PUBLIC + quantum + tmk_core_protocol + tmk_core_protocol_lufa + platforms + platforms_avr + ) + + # set_target_properties( + # ${elf_file} + + # PROPERTIES + # COMPILE_FLAGS "-mmcu=${QMK_MCU} -g -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics" + # LINK_FLAGS "-mmcu=${QMK_MCU} -Wl,-Map,${map_file}" + # ) + + # generate the lst file + add_custom_command( + OUTPUT ${lst_file} + + COMMAND + ${CMAKE_OBJDUMP} -h -S ${elf_file} > ${lst_file} + + DEPENDS ${elf_file} + ) + + # create hex file + add_custom_command( + OUTPUT ${hex_file} + + COMMAND + ${CMAKE_OBJCOPY} -j .text -j .data -O ihex ${elf_file} ${hex_file} + + DEPENDS ${elf_file} + ) + + add_custom_command( + OUTPUT "print-size-${elf_file}" + + COMMAND + ${AVR_SIZE} ${elf_file} + + DEPENDS ${elf_file} + ) + + add_custom_command( + OUTPUT "print-size-${hex_file}" + + COMMAND + ${AVR_SIZE} ${hex_file} + + DEPENDS ${hex_file} + ) + + # build the intel hex file for the device + add_custom_target( + ${target_name} + ALL + DEPENDS ${hex_file} ${lst_file} "print-size-${elf_file}" "print-size-${hex_file}" + ) + + set_target_properties( + ${target_name} + + PROPERTIES + OUTPUT_NAME ${elf_file} + ) +endmacro(add_qmk_executable) \ No newline at end of file diff --git a/platforms/toolchain.cmake b/platforms/toolchain.cmake new file mode 100644 index 0000000000..26e8758f1b --- /dev/null +++ b/platforms/toolchain.cmake @@ -0,0 +1,54 @@ +macro(add_qmk_executable_common target_name) + + file(READ ${CMAKE_SOURCE_DIR}/info.json JSON_STRING) + + string(JSON KEYBOARD_NAME GET ${JSON_STRING} keyboard_name) + string(JSON MANUFACTURER GET ${JSON_STRING} manufacturer) + string(JSON QMK_MCU GET ${JSON_STRING} processor) + string(JSON VENDOR_ID GET ${JSON_STRING} usb vid) + string(JSON PRODUCT_ID GET ${JSON_STRING} usb pid) + string(JSON DEVICE_VER GET ${JSON_STRING} usb device_version) + + string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" + VERSION_MATCH ${DEVICE_VER}) + set(VERSION_MAJOR ${CMAKE_MATCH_1}) + set(VERSION_MINOR ${CMAKE_MATCH_2}) + set(VERSION_PATCH ${CMAKE_MATCH_3}) + math(EXPR VERSION_C_EVAL "${VERSION_MAJOR} * 10000 + ${VERSION_MINOR} * 100 + ${VERSION_PATCH}" OUTPUT_FORMAT HEXADECIMAL) + + # include_directories(${QMK_ROOT}/quantum) + # include_directories(${QMK_ROOT}/quantum/logging) + # include_directories(${QMK_ROOT}/quantum/keymap_extras) + # include_directories(${QMK_ROOT}/quantum/process_keycode) + # include_directories(${QMK_ROOT}/quantum/sequencer) + # include_directories(${QMK_ROOT}/quantum/bootmagic) + # include_directories(${QMK_ROOT}/platforms) + include_directories(${CMAKE_SOURCE_DIR}) + + add_compile_options( + -include ${CMAKE_SOURCE_DIR}/config.h + -mmcu=${QMK_MCU} + ) + + add_link_options( + -mmcu=${QMK_MCU} + ) + + add_compile_definitions( + QMK_KEYBOARD_H="${target_name}.h" + KEYMAP_C="${CMAKE_SOURCE_DIR}/keymaps/default/keymap.c" + MATRIX_ROWS=6 + MATRIX_COLS=15 + VENDOR_ID=${VENDOR_ID} + PRODUCT_ID=${PRODUCT_ID} + DEVICE_VER=${VERSION_C_EVAL} + MANUFACTURER="${MANUFACTURER}" + PRODUCT="${KEYBOARD_NAME}" + ) + + # add_library(qmk) + + add_subdirectory(${QMK_ROOT}/quantum quantum) + add_subdirectory(${QMK_ROOT}/platforms platforms) + add_subdirectory(${QMK_ROOT}/tmk_core/protocol tmk_core/protocol) +endmacro(add_qmk_executable_common) \ No newline at end of file diff --git a/quantum/CMakeLists.txt b/quantum/CMakeLists.txt new file mode 100644 index 0000000000..e43fbc79d9 --- /dev/null +++ b/quantum/CMakeLists.txt @@ -0,0 +1,35 @@ +add_library(quantum + main.c + keymap_introspection.c + quantum.c + bitwise.c + led.c + action.c + action_layer.c + action_tapping.c + action_util.c + eeconfig.c + keyboard.c + keymap_common.c + keycode_config.c + sync_timer.c + logging/debug.c + logging/sendchar.c + matrix_common.c + matrix.c + debounce/sym_defer_g.c + bootmagic/magic.c +) +target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/logging) +target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/keymap_extras) +target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/process_keycode) +target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/sequencer) +target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bootmagic) +target_link_libraries(quantum PUBLIC platforms) +target_link_libraries(quantum PUBLIC platforms_avr) +target_link_libraries(quantum PUBLIC tmk_core_protocol) + +# if no printf +# target_sources(quantum PRIVATE ${QMK_ROOT}/lib/printf/src/printf/printf.c) +# target_include_directories(quantum PUBLIC ${QMK_ROOT}/lib/printf/src/) \ No newline at end of file diff --git a/tmk_core/protocol/CMakeLists.txt b/tmk_core/protocol/CMakeLists.txt new file mode 100644 index 0000000000..96384d148e --- /dev/null +++ b/tmk_core/protocol/CMakeLists.txt @@ -0,0 +1,13 @@ +add_library(tmk_core_protocol + host.c + report.c + usb_device_state.c + usb_util.c +) +add_compile_definitions( + # MOUSE_ENABLED + # EXTRAKEY_ENABLE + # NKRO_ENABLE +) +target_include_directories(tmk_core_protocol PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(tmk_core_protocol PUBLIC quantum) \ No newline at end of file diff --git a/tmk_core/protocol/lufa/CMakeLists.txt b/tmk_core/protocol/lufa/CMakeLists.txt new file mode 100644 index 0000000000..180d5df619 --- /dev/null +++ b/tmk_core/protocol/lufa/CMakeLists.txt @@ -0,0 +1,85 @@ +# set(LUFA_PATH ${QMK_ROOT}/lib/lufa) +set(LUFA_PATH ${QMK_ROOT}/lib/lufa) +set(ARCH AVR8) +set(USE_STATIC_OPTIONS "(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)") + +add_compile_definitions( + PROTOCOL_LUFA + ARCH=ARCH_${ARCH} + BOARD=BOARD_NONE + + USB_DEVICE_ONLY + USE_FLASH_DESCRIPTORS + USE_STATIC_OPTIONS=${USE_STATIC_OPTIONS} + FIXED_CONTROL_ENDPOINT_SIZE=8 + FIXED_NUM_CONFIGURATIONS=1 +) + +add_library(tmk_core_protocol_lufa + lufa.c + ../usb_descriptor.c + usb_util.c +) + +target_include_directories(tmk_core_protocol_lufa PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(tmk_core_protocol_lufa PUBLIC ${LUFA_PATH}) + +target_link_libraries(tmk_core_protocol_lufa PUBLIC quantum) + +set(LUFA_ROOT_PATH ${QMK_ROOT}/lib/lufa/LUFA) + +target_sources(tmk_core_protocol_lufa +PUBLIC + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/USBController_${ARCH}.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/USBInterrupt_${ARCH}.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/ConfigDescriptors.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/Events.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/USBTask.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Class/Common/HIDParser.c + + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Host_${ARCH}.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Pipe_${ARCH}.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/PipeStream_${ARCH}.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/HostStandardReq.c + + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Device_${ARCH}.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Endpoint_${ARCH}.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/EndpointStream_${ARCH}.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/DeviceStandardReq.c + + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/USBController_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/USBInterrupt_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/ConfigDescriptors.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/Events.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/USBTask.c + ${LUFA_ROOT_PATH}/Drivers/USB/Class/Common/HIDParser.c + + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Host_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Pipe_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/PipeStream_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/HostStandardReq.c + + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Device_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Endpoint_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/EndpointStream_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/DeviceStandardReq.c + +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/AudioClassDevice.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/CCIDClassDevice.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/CDCClassDevice.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/HIDClassDevice.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/MassStorageClassDevice.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/MIDIClassDevice.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/PrinterClassDevice.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/RNDISClassDevice.c + +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/AudioClassHost.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/CDCClassHost.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/HIDClassHost.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/MassStorageClassHost.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/MIDIClassHost.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/PrinterClassHost.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/RNDISClassHost.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/StillImageClassHost.c +) \ No newline at end of file From 6fe0cd47ca3f51fb17fcc6c2b0844c65c1732eff Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 1 Apr 2023 22:04:00 -0400 Subject: [PATCH 02/26] multi folder targets --- CMakeLists.txt | 141 ++++++++++++++++++++++++-- keyboards/mntre/CMakeLists.txt | 12 +-- platforms/CMakeLists.txt | 4 +- platforms/avr/toolchain.cmake | 84 +++++++-------- platforms/toolchain.cmake | 54 ---------- quantum/CMakeLists.txt | 9 +- tmk_core/protocol/CMakeLists.txt | 6 +- tmk_core/protocol/lufa/CMakeLists.txt | 5 +- 8 files changed, 184 insertions(+), 131 deletions(-) delete mode 100644 platforms/toolchain.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c68bfda32..1e55e89f92 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,21 +1,140 @@ cmake_minimum_required(VERSION 3.3) -# if(NOT DEFINED QMK_ROOT) +macro(add_qmk_executable _) +endmacro(add_qmk_executable) + +if(NOT DEFINED QMK_KEYBOARD) project(qmk_firmware) include(ExternalProject) -ExternalProject_Add(mntre - SOURCE_DIR ${CMAKE_SOURCE_DIR}/keyboards/mntre - TMP_DIR ${CMAKE_SOURCE_DIR}/build - CMAKE_GENERATOR "MinGW Makefiles" - CMAKE_ARGS - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/platforms/avr/toolchain.cmake - -DQMK_ROOT=${CMAKE_CURRENT_SOURCE_DIR} + +macro(add_keyboard KEYBOARD_CMAKE) + get_filename_component(KEYBOARD_FULL_DIRECTORY "${KEYBOARD_CMAKE}" DIRECTORY) + file(RELATIVE_PATH KEYBOARD_FOLDER "${CMAKE_SOURCE_DIR}/keyboards" "${KEYBOARD_FULL_DIRECTORY}") + string(REPLACE "/" "." KEYBOARD_NAME ${KEYBOARD_FOLDER}) + ExternalProject_Add(${KEYBOARD_NAME} + SOURCE_DIR ${CMAKE_SOURCE_DIR} + TMP_DIR ${CMAKE_SOURCE_DIR}/build + INSTALL_COMMAND cmake -E echo "No install needed" + CMAKE_GENERATOR "Unix Makefiles" + CMAKE_ARGS + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/platforms/avr/toolchain.cmake + -DQMK_KEYBOARD=${KEYBOARD_NAME} + -DQMK_KEYBOARD_FOLDER=${KEYBOARD_FOLDER} + ) +endmacro(add_keyboard) + +if(DEFINED QMK_KEYBOARD_FOLDER) + add_keyboard(${CMAKE_SOURCE_DIR}/keyboards/${QMK_KEYBOARD_FOLDER}/CMakeFiles.txt) +endif() + +file(GLOB_RECURSE KEYBOARDS keyboards/**/CMakeLists.txt) + +foreach(KEYBOARD_CMAKE ${KEYBOARDS}) + add_keyboard(${KEYBOARD_CMAKE}) +endforeach() + +else() + +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() + +file(READ keyboards/${QMK_KEYBOARD_FOLDER}/info.json JSON_STRING) +string(JSON KEYBOARD_NAME GET ${JSON_STRING} keyboard_name) +string(JSON MANUFACTURER GET ${JSON_STRING} manufacturer) +string(JSON QMK_MCU GET ${JSON_STRING} processor) +string(JSON VENDOR_ID GET ${JSON_STRING} usb vid) +string(JSON PRODUCT_ID GET ${JSON_STRING} usb pid) +string(JSON DEVICE_VER GET ${JSON_STRING} usb device_version) + +foreach(FOLDER ${QMK_KEYBOARD_FOLDERS}) + include_directories(${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}) + if(EXISTS ${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/config.h) + list(APPEND QMK_KEYBOARD_CONFIG_HS "${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/config.h") + endif() + if(EXISTS ${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/keymaps/default/keymap.c) + list(APPEND QMK_KEYBOARD_KEYMAPS "${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/keymaps/default/keymap.c") + endif() + # not sure if merging is needed, since info.json is required iirc + # if(EXISTS keyboards/${FOLDER}/info.json) + # file(READ keyboards/${FOLDER}/info.json JSON_STRING) + # string(JSON KEYBOARD_NAME GET ${JSON_STRING} keyboard_name) + # string(JSON MANUFACTURER GET ${JSON_STRING} manufacturer) + # string(JSON QMK_MCU GET ${JSON_STRING} processor) + # string(JSON VENDOR_ID GET ${JSON_STRING} usb vid) + # string(JSON PRODUCT_ID GET ${JSON_STRING} usb pid) + # string(JSON DEVICE_VER GET ${JSON_STRING} usb device_version) + # endif() +endforeach() + +if(NOT DEFINED QMK_KEYBOARD_KEYMAPS) + message(FATAL_ERROR "Keymap not found") +endif() + +list(GET QMK_KEYBOARD_FOLDERS 0 QMK_KEYBOARD_BASE_FOLDER) +list(GET QMK_KEYBOARD_KEYMAPS 0 QMK_KEYBOARD_KEYMAP) +list(GET QMK_KEYBOARD_FOLDER_PARTS -1 QMK_KEYBOARD_FOLDER_LAST_PART) + +project(${QMK_KEYBOARD} + LANGUAGES C CXX ASM + VERSION ${DEVICE_VER}) + +string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" VERSION_MATCH ${DEVICE_VER}) +set(VERSION_MAJOR ${CMAKE_MATCH_1}) +set(VERSION_MINOR ${CMAKE_MATCH_2}) +set(VERSION_PATCH ${CMAKE_MATCH_3}) +math(EXPR VERSION_C_EVAL "${VERSION_MAJOR} * 10000 + ${VERSION_MINOR} * 100 + ${VERSION_PATCH}" OUTPUT_FORMAT HEXADECIMAL) + + +add_compile_options( + -include ${QMK_KEYBOARD_CONFIG_HS} + -mmcu=${QMK_MCU} ) -# else() +add_link_options( + -mmcu=${QMK_MCU} +) -# add_subdirectory() +add_compile_definitions( + QMK_KEYBOARD_H="${QMK_KEYBOARD_FOLDER_LAST_PART}.h" + KEYMAP_C="${QMK_KEYBOARD_KEYMAP}" + MATRIX_ROWS=6 + MATRIX_COLS=15 + VENDOR_ID=${VENDOR_ID} + PRODUCT_ID=${PRODUCT_ID} + DEVICE_VER=${VERSION_C_EVAL} + MANUFACTURER="${MANUFACTURER}" + PRODUCT="${KEYBOARD_NAME}" +) -# endif() \ No newline at end of file +add_subdirectory(quantum) +add_subdirectory(platforms) +add_subdirectory(tmk_core/protocol) + +# option(OLED_ENABLE "" TRUE) +# if(${OLED_ENABLE}) +# target_sources(quantum PUBLIC +# ${CMAKE_SOURCE_DIR}/drivers/oled/ssd1306_sh1106.c +# ${CMAKE_SOURCE_DIR}/platforms/${CMAKE_SYSTEM_PROCESSOR}/drivers/i2c_master.c) +# add_compile_definitions(OLED_ENABLE) +# target_include_directories(quantum PUBLIC ${CMAKE_SOURCE_DIR}/drivers) +# target_include_directories(quantum PUBLIC ${CMAKE_SOURCE_DIR}/drivers/oled) +# target_include_directories(quantum PUBLIC ${CMAKE_SOURCE_DIR}/platforms/${CMAKE_SYSTEM_PROCESSOR}/drivers) +# endif() + +if(EXISTS keyboards/${QMK_KEYBOARD_FOLDER}/CMakeLists.txt) + add_subdirectory(keyboards/${QMK_KEYBOARD_FOLDER}) +else() + file(GLOB KEYBOARD_SRC "keyboards/${QMK_KEYBOARD_FOLDER}/*.c") + add_qmk_executable(${QMK_KEYBOARD} ${KEYBOARD_SRC}) +endif() + +endif() \ No newline at end of file diff --git a/keyboards/mntre/CMakeLists.txt b/keyboards/mntre/CMakeLists.txt index 087a0cfac3..190aac9a75 100644 --- a/keyboards/mntre/CMakeLists.txt +++ b/keyboards/mntre/CMakeLists.txt @@ -1,11 +1 @@ -cmake_minimum_required(VERSION 3.3) - -project(mntre C CXX ASM) - -add_qmk_executable(mntre - mntre.c -) -# set(QMK_INFO_JSON ${CMAKE_CURRENT_SOURCE_DIR}/info.json PARENT_SCOPE) -# add_compile_definitions(QMK_KEYMAP_CONFIG_H="${CMAKE_CURRENT_SOURCE_DIR}/config.h") - -# avr_target_link_libraries(mntre qmk) \ No newline at end of file +add_qmk_executable(mntre mntre.c) \ No newline at end of file diff --git a/platforms/CMakeLists.txt b/platforms/CMakeLists.txt index 3f57a6698e..260f9355c1 100644 --- a/platforms/CMakeLists.txt +++ b/platforms/CMakeLists.txt @@ -1,3 +1,5 @@ add_library(platforms suspend.c synchronization_util.c timer.c) target_include_directories(platforms PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(platforms PUBLIC quantum) \ No newline at end of file +target_link_libraries(platforms PUBLIC quantum) + +add_subdirectory(${CMAKE_SYSTEM_PROCESSOR}) \ No newline at end of file diff --git a/platforms/avr/toolchain.cmake b/platforms/avr/toolchain.cmake index 8956190320..ffbc343ba8 100644 --- a/platforms/avr/toolchain.cmake +++ b/platforms/avr/toolchain.cmake @@ -9,32 +9,26 @@ set(TRIPLE "avr") # find the toolchain root directory if(UNIX) - +find_program() set(OS_SUFFIX "") find_path(TOOLCHAIN_ROOT NAMES ${TRIPLE}-gcc${OS_SUFFIX} - PATHS /usr/bin/ /usr/local/bin /bin/ - $ENV{AVR_ROOT} ) - elseif(WIN32) - set(OS_SUFFIX ".exe") find_path(TOOLCHAIN_ROOT NAMES ${TRIPLE}-gcc${OS_SUFFIX} - PATHS "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" $ENV{AVR_ROOT} ) - else(UNIX) message(FATAL_ERROR "toolchain not supported on this OS") endif(UNIX) @@ -68,7 +62,6 @@ set(AVR_SIZE "${TOOLCHAIN_ROOT}/${TRIPLE}-size${OS_SUFFIX}" CACHE P find_program(AVR_UPLOAD NAME avrdude - PATHS /usr/bin/ $ENV{AVR_ROOT} @@ -78,53 +71,50 @@ find_program(AVR_UPLOAD # set(AVR_LINKER_LIBS "-lc -lm -lgcc -Wl,-lprintf_flt -Wl,-u,vfprintf") +add_compile_options( + $<$:-std=gnu11> + $<$:-std=gnu++14> + # -flto + -Os + -Wall + -Wstrict-prototypes + -fcommon + # -g + --param=min-pagesize=0 + -funsigned-char + -funsigned-bitfields + -ffunction-sections + -fdata-sections + -fpack-struct + -fshort-enums + -mcall-prologues + -fno-builtin-printf + $<$:-fno-inline-small-functions> + $<$:-fno-strict-aliasing> + $<$:-fno-exceptions> +) + +add_compile_definitions( + F_CPU=16000000 + F_USB=16000000UL + __AVR_ATmega32U4__ + # LTO_ENABLE +) + +include_directories("C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/avr/include") + macro(add_qmk_executable target_name) - add_compile_options( - $<$:-std=gnu11> - $<$:-std=gnu++14> - # -flto - -Os - -Wall - -Wstrict-prototypes - -fcommon - # -g - --param=min-pagesize=0 - -funsigned-char - -funsigned-bitfields - -ffunction-sections - -fdata-sections - -fpack-struct - -fshort-enums - -mcall-prologues - -fno-builtin-printf - $<$:-fno-inline-small-functions> - $<$:-fno-strict-aliasing> - $<$:-fno-exceptions> - ) - - add_compile_definitions( - F_CPU=16000000 - F_USB=16000000UL - __AVR_ATmega32U4__ - # LTO_ENABLE - ) - - add_link_options(-Wl,--gc-sections,-Map=${map_file}) - - include(${QMK_ROOT}/platforms/toolchain.cmake) - add_qmk_executable_common(${target_name}) - - add_subdirectory(${QMK_ROOT}/platforms/avr platforms/avr) - add_subdirectory(${QMK_ROOT}/tmk_core/protocol/lufa tmk_core/protocol/lufa) - - include_directories("C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/avr/include") + # add_subdirectory(${CMAKE_SOURCE_DIR}/platforms/avr platforms/avr) + # add_subdirectory(${CMAKE_SOURCE_DIR}/tmk_core/protocol/lufa tmk_core/protocol/lufa) set(elf_file ${target_name}-${QMK_MCU}.elf) set(map_file ${target_name}-${QMK_MCU}.map) set(hex_file ${target_name}-${QMK_MCU}.hex) set(lst_file ${target_name}-${QMK_MCU}.lst) + add_link_options(-Wl,--gc-sections,-Map=${map_file}) + # create elf file add_executable(${elf_file} ${ARGN} diff --git a/platforms/toolchain.cmake b/platforms/toolchain.cmake deleted file mode 100644 index 26e8758f1b..0000000000 --- a/platforms/toolchain.cmake +++ /dev/null @@ -1,54 +0,0 @@ -macro(add_qmk_executable_common target_name) - - file(READ ${CMAKE_SOURCE_DIR}/info.json JSON_STRING) - - string(JSON KEYBOARD_NAME GET ${JSON_STRING} keyboard_name) - string(JSON MANUFACTURER GET ${JSON_STRING} manufacturer) - string(JSON QMK_MCU GET ${JSON_STRING} processor) - string(JSON VENDOR_ID GET ${JSON_STRING} usb vid) - string(JSON PRODUCT_ID GET ${JSON_STRING} usb pid) - string(JSON DEVICE_VER GET ${JSON_STRING} usb device_version) - - string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" - VERSION_MATCH ${DEVICE_VER}) - set(VERSION_MAJOR ${CMAKE_MATCH_1}) - set(VERSION_MINOR ${CMAKE_MATCH_2}) - set(VERSION_PATCH ${CMAKE_MATCH_3}) - math(EXPR VERSION_C_EVAL "${VERSION_MAJOR} * 10000 + ${VERSION_MINOR} * 100 + ${VERSION_PATCH}" OUTPUT_FORMAT HEXADECIMAL) - - # include_directories(${QMK_ROOT}/quantum) - # include_directories(${QMK_ROOT}/quantum/logging) - # include_directories(${QMK_ROOT}/quantum/keymap_extras) - # include_directories(${QMK_ROOT}/quantum/process_keycode) - # include_directories(${QMK_ROOT}/quantum/sequencer) - # include_directories(${QMK_ROOT}/quantum/bootmagic) - # include_directories(${QMK_ROOT}/platforms) - include_directories(${CMAKE_SOURCE_DIR}) - - add_compile_options( - -include ${CMAKE_SOURCE_DIR}/config.h - -mmcu=${QMK_MCU} - ) - - add_link_options( - -mmcu=${QMK_MCU} - ) - - add_compile_definitions( - QMK_KEYBOARD_H="${target_name}.h" - KEYMAP_C="${CMAKE_SOURCE_DIR}/keymaps/default/keymap.c" - MATRIX_ROWS=6 - MATRIX_COLS=15 - VENDOR_ID=${VENDOR_ID} - PRODUCT_ID=${PRODUCT_ID} - DEVICE_VER=${VERSION_C_EVAL} - MANUFACTURER="${MANUFACTURER}" - PRODUCT="${KEYBOARD_NAME}" - ) - - # add_library(qmk) - - add_subdirectory(${QMK_ROOT}/quantum quantum) - add_subdirectory(${QMK_ROOT}/platforms platforms) - add_subdirectory(${QMK_ROOT}/tmk_core/protocol tmk_core/protocol) -endmacro(add_qmk_executable_common) \ No newline at end of file diff --git a/quantum/CMakeLists.txt b/quantum/CMakeLists.txt index e43fbc79d9..7321e7003e 100644 --- a/quantum/CMakeLists.txt +++ b/quantum/CMakeLists.txt @@ -26,10 +26,13 @@ target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/keymap_ext target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/process_keycode) target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/sequencer) target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bootmagic) + target_link_libraries(quantum PUBLIC platforms) -target_link_libraries(quantum PUBLIC platforms_avr) +if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "avr") + target_link_libraries(quantum PUBLIC platforms_avr) +endif() target_link_libraries(quantum PUBLIC tmk_core_protocol) # if no printf -# target_sources(quantum PRIVATE ${QMK_ROOT}/lib/printf/src/printf/printf.c) -# target_include_directories(quantum PUBLIC ${QMK_ROOT}/lib/printf/src/) \ No newline at end of file +# target_sources(quantum PRIVATE ${CMAKE_SOURCE_DIR}/lib/printf/src/printf/printf.c) +# target_include_directories(quantum PUBLIC ${CMAKE_SOURCE_DIR}/lib/printf/src/printf) \ No newline at end of file diff --git a/tmk_core/protocol/CMakeLists.txt b/tmk_core/protocol/CMakeLists.txt index 96384d148e..3e341e3a8c 100644 --- a/tmk_core/protocol/CMakeLists.txt +++ b/tmk_core/protocol/CMakeLists.txt @@ -10,4 +10,8 @@ add_compile_definitions( # NKRO_ENABLE ) target_include_directories(tmk_core_protocol PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(tmk_core_protocol PUBLIC quantum) \ No newline at end of file +target_link_libraries(tmk_core_protocol PUBLIC quantum) + +if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "avr") + add_subdirectory(lufa) +endif() \ No newline at end of file diff --git a/tmk_core/protocol/lufa/CMakeLists.txt b/tmk_core/protocol/lufa/CMakeLists.txt index 180d5df619..170b4d04f4 100644 --- a/tmk_core/protocol/lufa/CMakeLists.txt +++ b/tmk_core/protocol/lufa/CMakeLists.txt @@ -1,5 +1,4 @@ -# set(LUFA_PATH ${QMK_ROOT}/lib/lufa) -set(LUFA_PATH ${QMK_ROOT}/lib/lufa) +set(LUFA_PATH ${CMAKE_SOURCE_DIR}/lib/lufa) set(ARCH AVR8) set(USE_STATIC_OPTIONS "(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)") @@ -26,7 +25,7 @@ target_include_directories(tmk_core_protocol_lufa PUBLIC ${LUFA_PATH}) target_link_libraries(tmk_core_protocol_lufa PUBLIC quantum) -set(LUFA_ROOT_PATH ${QMK_ROOT}/lib/lufa/LUFA) +set(LUFA_ROOT_PATH ${CMAKE_SOURCE_DIR}/lib/lufa/LUFA) target_sources(tmk_core_protocol_lufa PUBLIC From b45dbcd4c1b965fbbaf79abf2d90d3ae08042837 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 1 Apr 2023 23:10:44 -0400 Subject: [PATCH 03/26] fix linux compiling --- platforms/avr/toolchain.cmake | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/platforms/avr/toolchain.cmake b/platforms/avr/toolchain.cmake index ffbc343ba8..e7589b72a6 100644 --- a/platforms/avr/toolchain.cmake +++ b/platforms/avr/toolchain.cmake @@ -9,7 +9,6 @@ set(TRIPLE "avr") # find the toolchain root directory if(UNIX) -find_program() set(OS_SUFFIX "") find_path(TOOLCHAIN_ROOT NAMES @@ -43,7 +42,7 @@ set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR avr) set(CMAKE_CROSS_COMPILING 1) -set(CMAKE_MAKE_PROGRAM "${TOOLCHAIN_ROOT}/make.exe" CACHE PATH "make" FORCE) +set(CMAKE_MAKE_PROGRAM "${TOOLCHAIN_ROOT}/make${OS_SUFFIX}" CACHE PATH "make" FORCE) set(CMAKE_C_COMPILER "${TOOLCHAIN_ROOT}/${TRIPLE}-gcc${OS_SUFFIX}" CACHE PATH "gcc" FORCE) set(CMAKE_CXX_COMPILER "${TOOLCHAIN_ROOT}/${TRIPLE}-g++${OS_SUFFIX}" CACHE PATH "g++" FORCE) set(CMAKE_AR "${TOOLCHAIN_ROOT}/${TRIPLE}-ar${OS_SUFFIX}" CACHE PATH "ar" FORCE) @@ -80,7 +79,7 @@ add_compile_options( -Wstrict-prototypes -fcommon # -g - --param=min-pagesize=0 + $<$:--param=min-pagesize=0> -funsigned-char -funsigned-bitfields -ffunction-sections @@ -188,4 +187,4 @@ macro(add_qmk_executable target_name) PROPERTIES OUTPUT_NAME ${elf_file} ) -endmacro(add_qmk_executable) \ No newline at end of file +endmacro(add_qmk_executable) From 26756d05a24c66b2f77efc3548ec776b969f5b7f Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 1 Apr 2023 23:24:46 -0400 Subject: [PATCH 04/26] look for make independently, osx compiling --- platforms/avr/toolchain.cmake | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/platforms/avr/toolchain.cmake b/platforms/avr/toolchain.cmake index e7589b72a6..a685334b05 100644 --- a/platforms/avr/toolchain.cmake +++ b/platforms/avr/toolchain.cmake @@ -19,6 +19,15 @@ if(UNIX) /bin/ $ENV{AVR_ROOT} ) + find_path(MAKE_ROOT + NAMES + make${OS_SUFFIX} + PATHS + /usr/bin/ + /usr/local/bin + /bin/ + $ENV{AVR_ROOT} + ) elseif(WIN32) set(OS_SUFFIX ".exe") find_path(TOOLCHAIN_ROOT @@ -28,6 +37,14 @@ elseif(WIN32) "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" $ENV{AVR_ROOT} ) + set(OS_SUFFIX ".exe") + find_path(make_ROOT + NAMES + make${OS_SUFFIX} + PATHS + "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" + $ENV{AVR_ROOT} + ) else(UNIX) message(FATAL_ERROR "toolchain not supported on this OS") endif(UNIX) @@ -42,7 +59,7 @@ set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR avr) set(CMAKE_CROSS_COMPILING 1) -set(CMAKE_MAKE_PROGRAM "${TOOLCHAIN_ROOT}/make${OS_SUFFIX}" CACHE PATH "make" FORCE) +set(CMAKE_MAKE_PROGRAM "${MAKE_ROOT}/make${OS_SUFFIX}" CACHE PATH "make" FORCE) set(CMAKE_C_COMPILER "${TOOLCHAIN_ROOT}/${TRIPLE}-gcc${OS_SUFFIX}" CACHE PATH "gcc" FORCE) set(CMAKE_CXX_COMPILER "${TOOLCHAIN_ROOT}/${TRIPLE}-g++${OS_SUFFIX}" CACHE PATH "g++" FORCE) set(CMAKE_AR "${TOOLCHAIN_ROOT}/${TRIPLE}-ar${OS_SUFFIX}" CACHE PATH "ar" FORCE) From d32724c08f13bc471481f3329ad43a246e797013 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 1 Apr 2023 23:39:13 -0400 Subject: [PATCH 05/26] refix windows compiling --- platforms/avr/toolchain.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/avr/toolchain.cmake b/platforms/avr/toolchain.cmake index a685334b05..9a6e31b70e 100644 --- a/platforms/avr/toolchain.cmake +++ b/platforms/avr/toolchain.cmake @@ -38,7 +38,7 @@ elseif(WIN32) $ENV{AVR_ROOT} ) set(OS_SUFFIX ".exe") - find_path(make_ROOT + find_path(MAKE_ROOT NAMES make${OS_SUFFIX} PATHS From 2031d063b56a6b1efce2a9e4f8128618fad04659 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sun, 2 Apr 2023 11:20:49 -0400 Subject: [PATCH 06/26] split up functions/scripts a bit. downloads avr-gcc --- .gitignore | 3 + CMakeLists.txt | 94 +++++++++++---------------- cmake/AddKeyboard.cmake | 46 +++++++++++++ cmake/FindLufa.cmake | 23 +++++++ cmake/FindToolchain.cmake | 62 ++++++++++++++++++ cmake/GetAVR-GCC.cmake | 24 +++++++ cmake/UpdateSubmodule.cmake | 22 +++++++ cmake/features/backlight.cmake | 28 ++++++++ cmake/features/oled.cmake | 13 ++++ keyboards/CMakeLists.txt | 12 ++++ platforms/avr/toolchain.cmake | 44 +------------ tmk_core/protocol/lufa/CMakeLists.txt | 65 ++---------------- 12 files changed, 277 insertions(+), 159 deletions(-) create mode 100644 cmake/AddKeyboard.cmake create mode 100644 cmake/FindLufa.cmake create mode 100644 cmake/FindToolchain.cmake create mode 100644 cmake/GetAVR-GCC.cmake create mode 100644 cmake/UpdateSubmodule.cmake create mode 100644 cmake/features/backlight.cmake create mode 100644 cmake/features/oled.cmake create mode 100644 keyboards/CMakeLists.txt diff --git a/.gitignore b/.gitignore index 4909f67406..09108487a4 100644 --- a/.gitignore +++ b/.gitignore @@ -55,6 +55,9 @@ cmake-build-debug # CMakeLists.txt *.pdf +# cmake toolchain downloads +toolchains + # Let these ones be user specific, since we have so many different configurations *.code-workspace .stfolder diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e55e89f92..94b423f9fb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,9 @@ cmake_minimum_required(VERSION 3.3) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") + +include(UpdateSubmodule) + macro(add_qmk_executable _) endmacro(add_qmk_executable) @@ -7,33 +11,7 @@ if(NOT DEFINED QMK_KEYBOARD) project(qmk_firmware) -include(ExternalProject) - -macro(add_keyboard KEYBOARD_CMAKE) - get_filename_component(KEYBOARD_FULL_DIRECTORY "${KEYBOARD_CMAKE}" DIRECTORY) - file(RELATIVE_PATH KEYBOARD_FOLDER "${CMAKE_SOURCE_DIR}/keyboards" "${KEYBOARD_FULL_DIRECTORY}") - string(REPLACE "/" "." KEYBOARD_NAME ${KEYBOARD_FOLDER}) - ExternalProject_Add(${KEYBOARD_NAME} - SOURCE_DIR ${CMAKE_SOURCE_DIR} - TMP_DIR ${CMAKE_SOURCE_DIR}/build - INSTALL_COMMAND cmake -E echo "No install needed" - CMAKE_GENERATOR "Unix Makefiles" - CMAKE_ARGS - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/platforms/avr/toolchain.cmake - -DQMK_KEYBOARD=${KEYBOARD_NAME} - -DQMK_KEYBOARD_FOLDER=${KEYBOARD_FOLDER} - ) -endmacro(add_keyboard) - -if(DEFINED QMK_KEYBOARD_FOLDER) - add_keyboard(${CMAKE_SOURCE_DIR}/keyboards/${QMK_KEYBOARD_FOLDER}/CMakeFiles.txt) -endif() - -file(GLOB_RECURSE KEYBOARDS keyboards/**/CMakeLists.txt) - -foreach(KEYBOARD_CMAKE ${KEYBOARDS}) - add_keyboard(${KEYBOARD_CMAKE}) -endforeach() +add_subdirectory(keyboards) else() @@ -47,31 +25,40 @@ while(NOT ${QMK_KEYBOARD_CURRENT_FOLDER} STREQUAL "") get_filename_component(QMK_KEYBOARD_CURRENT_FOLDER ${QMK_KEYBOARD_CURRENT_FOLDER} DIRECTORY) endwhile() -file(READ keyboards/${QMK_KEYBOARD_FOLDER}/info.json JSON_STRING) -string(JSON KEYBOARD_NAME GET ${JSON_STRING} keyboard_name) -string(JSON MANUFACTURER GET ${JSON_STRING} manufacturer) -string(JSON QMK_MCU GET ${JSON_STRING} processor) -string(JSON VENDOR_ID GET ${JSON_STRING} usb vid) -string(JSON PRODUCT_ID GET ${JSON_STRING} usb pid) -string(JSON DEVICE_VER GET ${JSON_STRING} usb device_version) +# would be nice to also do validation here +file(READ keyboards/${QMK_KEYBOARD_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) 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() + # assuming every keyboard has a default/keymap.c at some level if(EXISTS ${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/keymaps/default/keymap.c) list(APPEND QMK_KEYBOARD_KEYMAPS "${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/keymaps/default/keymap.c") endif() - # not sure if merging is needed, since info.json is required iirc + 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 JSON_STRING) - # string(JSON KEYBOARD_NAME GET ${JSON_STRING} keyboard_name) - # string(JSON MANUFACTURER GET ${JSON_STRING} manufacturer) - # string(JSON QMK_MCU GET ${JSON_STRING} processor) - # string(JSON VENDOR_ID GET ${JSON_STRING} usb vid) - # string(JSON PRODUCT_ID GET ${JSON_STRING} usb pid) - # string(JSON DEVICE_VER GET ${JSON_STRING} usb device_version) + # 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() @@ -79,9 +66,13 @@ if(NOT DEFINED QMK_KEYBOARD_KEYMAPS) message(FATAL_ERROR "Keymap not found") endif() -list(GET QMK_KEYBOARD_FOLDERS 0 QMK_KEYBOARD_BASE_FOLDER) +if(NOT DEFINED QMK_KEYBOARD_HEADERS) + message(FATAL_ERROR "Header not found") +endif() + +# list(GET QMK_KEYBOARD_FOLDERS 0 QMK_KEYBOARD_BASE_FOLDER) list(GET QMK_KEYBOARD_KEYMAPS 0 QMK_KEYBOARD_KEYMAP) -list(GET QMK_KEYBOARD_FOLDER_PARTS -1 QMK_KEYBOARD_FOLDER_LAST_PART) +list(GET QMK_KEYBOARD_HEADERS 0 QMK_KEYBOARD_HEADER) project(${QMK_KEYBOARD} LANGUAGES C CXX ASM @@ -93,7 +84,6 @@ set(VERSION_MINOR ${CMAKE_MATCH_2}) set(VERSION_PATCH ${CMAKE_MATCH_3}) math(EXPR VERSION_C_EVAL "${VERSION_MAJOR} * 10000 + ${VERSION_MINOR} * 100 + ${VERSION_PATCH}" OUTPUT_FORMAT HEXADECIMAL) - add_compile_options( -include ${QMK_KEYBOARD_CONFIG_HS} -mmcu=${QMK_MCU} @@ -104,7 +94,7 @@ add_link_options( ) add_compile_definitions( - QMK_KEYBOARD_H="${QMK_KEYBOARD_FOLDER_LAST_PART}.h" + QMK_KEYBOARD_H="${QMK_KEYBOARD_HEADER}" KEYMAP_C="${QMK_KEYBOARD_KEYMAP}" MATRIX_ROWS=6 MATRIX_COLS=15 @@ -119,16 +109,8 @@ add_subdirectory(quantum) add_subdirectory(platforms) add_subdirectory(tmk_core/protocol) -# option(OLED_ENABLE "" TRUE) -# if(${OLED_ENABLE}) -# target_sources(quantum PUBLIC -# ${CMAKE_SOURCE_DIR}/drivers/oled/ssd1306_sh1106.c -# ${CMAKE_SOURCE_DIR}/platforms/${CMAKE_SYSTEM_PROCESSOR}/drivers/i2c_master.c) -# add_compile_definitions(OLED_ENABLE) -# target_include_directories(quantum PUBLIC ${CMAKE_SOURCE_DIR}/drivers) -# target_include_directories(quantum PUBLIC ${CMAKE_SOURCE_DIR}/drivers/oled) -# target_include_directories(quantum PUBLIC ${CMAKE_SOURCE_DIR}/platforms/${CMAKE_SYSTEM_PROCESSOR}/drivers) -# endif() +include(features/oled) +include(features/backlight) if(EXISTS keyboards/${QMK_KEYBOARD_FOLDER}/CMakeLists.txt) add_subdirectory(keyboards/${QMK_KEYBOARD_FOLDER}) diff --git a/cmake/AddKeyboard.cmake b/cmake/AddKeyboard.cmake new file mode 100644 index 0000000000..6b8c7ed474 --- /dev/null +++ b/cmake/AddKeyboard.cmake @@ -0,0 +1,46 @@ +macro(add_keyboard KEYBOARD_CMAKE) + get_filename_component(KEYBOARD_FULL_DIRECTORY "${KEYBOARD_CMAKE}" DIRECTORY) + + # find the right toolchain + file(READ ${KEYBOARD_FULL_DIRECTORY}/info.json JSON_STRING) + string(JSON PROCESSOR GET ${JSON_STRING} processor) + if(${PROCESSOR} MATCHES "^at.*") + set(PLATFORM "avr") + # find_package(avr-gcc) + elseif( + ${PROCESSOR} MATCHES "^STM.*" OR + ${PROCESSOR} MATCHES "^WB32.*" OR + ${PROCESSOR} MATCHES "^MK.*" OR + ${PROCESSOR} MATCHES "RP2040" OR + ${PROCESSOR} MATCHES "^GD32.*") + set(PLATFORM "chibios") + endif() + if(NOT DEFINED PLATFORM) + message(FATAL_ERROR "Could not find platform for ${KEYBOARD_FULL_DIRECTORY}") + endif() + + include(FindToolChain) + find_toolchain() + + file(RELATIVE_PATH KEYBOARD_FOLDER "${CMAKE_SOURCE_DIR}/keyboards" "${KEYBOARD_FULL_DIRECTORY}") + string(REPLACE "/" "." KEYBOARD_NAME ${KEYBOARD_FOLDER}) + ExternalProject_Add(${KEYBOARD_NAME} + SOURCE_DIR ${CMAKE_SOURCE_DIR} + PREFIX ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER} + TMP_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/tmp + DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Download + BINARY_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Build + STAMP_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Stamp + LOG_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Log + INSTALL_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Install + INSTALL_COMMAND cmake -E echo "No install needed" + # this seems to work well for all systems so far - not sure if it'd be useful to customize + CMAKE_GENERATOR "Unix Makefiles" + CMAKE_ARGS + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_SOURCE_DIR}/platforms/${PLATFORM}/toolchain.cmake + -DTOOLCHAIN_ROOT=${TOOLCHAIN_ROOT} + -DMAKE_ROOT=${MAKE_ROOT} + -DQMK_KEYBOARD=${KEYBOARD_NAME} + -DQMK_KEYBOARD_FOLDER=${KEYBOARD_FOLDER} + ) +endmacro(add_keyboard) \ No newline at end of file diff --git a/cmake/FindLufa.cmake b/cmake/FindLufa.cmake new file mode 100644 index 0000000000..80f04e24ce --- /dev/null +++ b/cmake/FindLufa.cmake @@ -0,0 +1,23 @@ +include(UpdateSubmodule) +update_submodule(lib/lufa) +set(LUFA_PATH ${CMAKE_SOURCE_DIR}/lib/lufa) +set(LUFA_ROOT_PATH ${LUFA_PATH}/LUFA) +add_library(lufa + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/USBController_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/USBInterrupt_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/ConfigDescriptors.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/Events.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/USBTask.c + ${LUFA_ROOT_PATH}/Drivers/USB/Class/Common/HIDParser.c + + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Host_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Pipe_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/PipeStream_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/HostStandardReq.c + + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Device_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Endpoint_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/EndpointStream_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/DeviceStandardReq.c +) +target_include_directories(lufa PUBLIC ${LUFA_PATH}) \ No newline at end of file diff --git a/cmake/FindToolchain.cmake b/cmake/FindToolchain.cmake new file mode 100644 index 0000000000..cc1d426dca --- /dev/null +++ b/cmake/FindToolchain.cmake @@ -0,0 +1,62 @@ +macro(find_gcc TRIPLE) +if(UNIX) + set(OS_SUFFIX "") + find_path(TOOLCHAIN_ROOT + NAMES + ${TRIPLE}-gcc${OS_SUFFIX} + PATHS + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc/avr-gcc-12.1.0-x64-linux/bin/" + /usr/bin/ + /usr/local/bin + /bin/ + $ENV{AVR_ROOT} + ) + find_path(MAKE_ROOT + NAMES + make${OS_SUFFIX} + PATHS + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc/avr-gcc-12.1.0-x64-linux/bin/" + /usr/bin/ + /usr/local/bin + /bin/ + $ENV{AVR_ROOT} + ) +elseif(WIN32) + set(OS_SUFFIX ".exe") + find_path(TOOLCHAIN_ROOT + NAMES + ${TRIPLE}-gcc${OS_SUFFIX} + PATHS + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc/avr-gcc-12.1.0-x64-windows/bin/" + "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" + $ENV{AVR_ROOT} + ) + find_path(MAKE_ROOT + NAMES + make${OS_SUFFIX} + PATHS + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc/avr-gcc-12.1.0-x64-windows/bin/" + "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" + $ENV{AVR_ROOT} + ) +else(UNIX) + message(FATAL_ERROR "toolchain not supported on this OS") +endif(UNIX) +endmacro(find_gcc) + +macro(find_toolchain) +find_gcc(avr) + +if(NOT TOOLCHAIN_ROOT) + include(GetAVR-GCC) + find_gcc(avr) +endif(NOT TOOLCHAIN_ROOT) + +if(NOT TOOLCHAIN_ROOT) + message(FATAL_ERROR "Toolchain root could not be found!!!") +endif(NOT TOOLCHAIN_ROOT) + +message("Found toolchain: ${TOOLCHAIN_ROOT}") +message("Found make: ${MAKE_ROOT}") + +endmacro() \ No newline at end of file diff --git a/cmake/GetAVR-GCC.cmake b/cmake/GetAVR-GCC.cmake new file mode 100644 index 0000000000..f7edc7d6c0 --- /dev/null +++ b/cmake/GetAVR-GCC.cmake @@ -0,0 +1,24 @@ +message("Downloading avr-gcc") +if(WIN32) +file(DOWNLOAD + https://github.com/ZakKemble/avr-gcc-build/releases/download/v12.1.0-1/avr-gcc-12.1.0-x64-windows.zip + ${CMAKE_SOURCE_DIR}/toolchains/downloads/avr-gcc-x64-windows.zip + EXPECTED_HASH SHA256=e921a964fdeaedbe963352d0f26c6520a0a3eb8effc6ff232f3824b06c4ea0e2 + SHOW_PROGRESS TRUE +) +file(ARCHIVE_EXTRACT + INPUT ${CMAKE_SOURCE_DIR}/toolchains/downloads/avr-gcc-x64-windows.zip + DESTINATION ${CMAKE_SOURCE_DIR}/toolchains/ +) +elseif(UNIX) +file(DOWNLOAD + https://github.com/ZakKemble/avr-gcc-build/releases/download/v12.1.0-1/avr-gcc-12.1.0-x64-linux.tar.bz2 + ${CMAKE_SOURCE_DIR}/toolchains/downloads/avr-gcc-x64-linux.tar.bz2 + EXPECTED_HASH SHA256=feb034f4b85237032da8bac1f03765af5ebc4a8939b69bed57ff31bc482ca1a6 + SHOW_PROGRESS TRUE +) +file(ARCHIVE_EXTRACT + INPUT ${CMAKE_SOURCE_DIR}/toolchains/downloads/avr-gcc-x64-linux.tar.bz2 + DESTINATION ${CMAKE_SOURCE_DIR}/toolchains/ +) +endif() \ No newline at end of file diff --git a/cmake/UpdateSubmodule.cmake b/cmake/UpdateSubmodule.cmake new file mode 100644 index 0000000000..dede02c885 --- /dev/null +++ b/cmake/UpdateSubmodule.cmake @@ -0,0 +1,22 @@ +# can be passed a relative path (to CMAKE_SOURCE_DIR) to update/checkout that submodule +macro(update_submodule SUBMODULE) + find_package(Git QUIET) + if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git") + option(GIT_SUBMODULE "Check submodules during build" ON) + if(GIT_SUBMODULE) + message(STATUS "Updating submoudle ${SUBMODULE}") + execute_process(COMMAND ${GIT_EXECUTABLE} submodule update ${SUBMODULE} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + RESULT_VARIABLE GIT_SUBMOD_RESULT) + if(NOT GIT_SUBMOD_RESULT EQUAL "0") + message(FATAL_ERROR "git submodule update ${SUBMODULE} failed with ${GIT_SUBMOD_RESULT}, please checkout submodules") + endif() + endif() + else() + message("Git not found - skipping submodule update") + endif() + + if(NOT EXISTS "${CMAKE_SOURCE_DIR}/${SUBMODULE}/.git") + message(FATAL_ERROR "The submodule was not downloaded! GIT_SUBMODULE was turned off or failed. Please update submodules and try again.") + endif() +endmacro() \ No newline at end of file diff --git a/cmake/features/backlight.cmake b/cmake/features/backlight.cmake new file mode 100644 index 0000000000..b4545d7786 --- /dev/null +++ b/cmake/features/backlight.cmake @@ -0,0 +1,28 @@ +option(BACKLIGHT_ENABLE "" TRUE) +set(BACKLIGHT_DRIVER "pwm" CACHE STRING "Backlight driver") +set_property(CACHE BACKLIGHT_DRIVER PROPERTY STRINGS pwm timer software custom) + +if(${BACKLIGHT_ENABLE}) + add_library(backlight + quantum/backlight/backlight.c + quantum/process_keycode/process_backlight.c + ) + string(JSON BACKLIGHT_PIN GET ${QMK_KEYBOARD_INFO_JSON_STRING} backlight pin) + add_compile_definitions( + BACKLIGHT_ENABLE + BACKLIGHT_PIN=${BACKLIGHT_PIN} + ) + if(${BACKLIGHT_DRIVER} STREQUAL "custom") + add_compile_definitions(BACKLIGHT_CUSTOM_DRIVER) + else() + target_sources(backlight PRIVATE quantum/backlight/backlight_driver_common.c) + if(${BACKLIGHT_DRIVER} STREQUAL "pwm") + target_sources(backlight PRIVATE quantum/backlight/backlight_${CMAKE_SYSTEM_PROCESSOR}.c) + else() + target_sources(backlight PRIVATE quantum/backlight/backlight_${BACKLIGHT_DRIVER}.c) + endif() + endif() + target_include_directories(backlight PUBLIC quantum/backlight) + target_include_directories(quantum PUBLIC quantum/backlight) + target_link_libraries(backlight PUBLIC quantum) +endif() diff --git a/cmake/features/oled.cmake b/cmake/features/oled.cmake new file mode 100644 index 0000000000..e84b72d233 --- /dev/null +++ b/cmake/features/oled.cmake @@ -0,0 +1,13 @@ +option(OLED_ENABLE "" TRUE) +if(${OLED_ENABLE}) + add_library(oled + drivers/oled/ssd1306_sh1106.c + platforms/${CMAKE_SYSTEM_PROCESSOR}/drivers/i2c_master.c) + add_compile_definitions(OLED_ENABLE) + target_include_directories(oled PUBLIC drivers) + target_include_directories(quantum PUBLIC drivers/oled) + target_include_directories(oled PUBLIC drivers/oled) + target_include_directories(oled PUBLIC platforms/${CMAKE_SYSTEM_PROCESSOR}/drivers) + target_link_libraries(oled PUBLIC quantum) + target_link_libraries(oled PUBLIC platform_avr) +endif() diff --git a/keyboards/CMakeLists.txt b/keyboards/CMakeLists.txt new file mode 100644 index 0000000000..5c1cbdf5dc --- /dev/null +++ b/keyboards/CMakeLists.txt @@ -0,0 +1,12 @@ +include(ExternalProject) +include(AddKeyboard) + +if(DEFINED QMK_KEYBOARD_FOLDER) + add_keyboard(${CMAKE_SOURCE_DIR}/keyboards/${QMK_KEYBOARD_FOLDER}/CMakeFiles.txt) +endif() + +file(GLOB_RECURSE KEYBOARDS **/CMakeLists.txt) + +foreach(KEYBOARD_CMAKE ${KEYBOARDS}) + add_keyboard(${KEYBOARD_CMAKE}) +endforeach() \ No newline at end of file diff --git a/platforms/avr/toolchain.cmake b/platforms/avr/toolchain.cmake index 9a6e31b70e..cf2499002c 100644 --- a/platforms/avr/toolchain.cmake +++ b/platforms/avr/toolchain.cmake @@ -6,52 +6,12 @@ set(TRIPLE "avr") -# find the toolchain root directory - if(UNIX) set(OS_SUFFIX "") - find_path(TOOLCHAIN_ROOT - NAMES - ${TRIPLE}-gcc${OS_SUFFIX} - PATHS - /usr/bin/ - /usr/local/bin - /bin/ - $ENV{AVR_ROOT} - ) - find_path(MAKE_ROOT - NAMES - make${OS_SUFFIX} - PATHS - /usr/bin/ - /usr/local/bin - /bin/ - $ENV{AVR_ROOT} - ) elseif(WIN32) set(OS_SUFFIX ".exe") - find_path(TOOLCHAIN_ROOT - NAMES - ${TRIPLE}-gcc${OS_SUFFIX} - PATHS - "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" - $ENV{AVR_ROOT} - ) - set(OS_SUFFIX ".exe") - find_path(MAKE_ROOT - NAMES - make${OS_SUFFIX} - PATHS - "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" - $ENV{AVR_ROOT} - ) -else(UNIX) - message(FATAL_ERROR "toolchain not supported on this OS") -endif(UNIX) +endif() -if(NOT TOOLCHAIN_ROOT) - message(FATAL_ERROR "Toolchain root could not be found!!!") -endif(NOT TOOLCHAIN_ROOT) # setup the AVR compiler variables @@ -117,7 +77,7 @@ add_compile_definitions( # LTO_ENABLE ) -include_directories("C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/avr/include") +# include_directories("C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/avr/include") macro(add_qmk_executable target_name) diff --git a/tmk_core/protocol/lufa/CMakeLists.txt b/tmk_core/protocol/lufa/CMakeLists.txt index 170b4d04f4..84b67e8353 100644 --- a/tmk_core/protocol/lufa/CMakeLists.txt +++ b/tmk_core/protocol/lufa/CMakeLists.txt @@ -1,4 +1,3 @@ -set(LUFA_PATH ${CMAKE_SOURCE_DIR}/lib/lufa) set(ARCH AVR8) set(USE_STATIC_OPTIONS "(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)") @@ -20,65 +19,9 @@ add_library(tmk_core_protocol_lufa usb_util.c ) +find_package(lufa REQUIRED) + target_include_directories(tmk_core_protocol_lufa PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(tmk_core_protocol_lufa PUBLIC ${LUFA_PATH}) -target_link_libraries(tmk_core_protocol_lufa PUBLIC quantum) - -set(LUFA_ROOT_PATH ${CMAKE_SOURCE_DIR}/lib/lufa/LUFA) - -target_sources(tmk_core_protocol_lufa -PUBLIC - # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/USBController_${ARCH}.c - # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/USBInterrupt_${ARCH}.c - # ${LUFA_ROOT_PATH}/Drivers/USB/Core/ConfigDescriptors.c - # ${LUFA_ROOT_PATH}/Drivers/USB/Core/Events.c - # ${LUFA_ROOT_PATH}/Drivers/USB/Core/USBTask.c - # ${LUFA_ROOT_PATH}/Drivers/USB/Class/Common/HIDParser.c - - # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Host_${ARCH}.c - # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Pipe_${ARCH}.c - # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/PipeStream_${ARCH}.c - # ${LUFA_ROOT_PATH}/Drivers/USB/Core/HostStandardReq.c - - # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Device_${ARCH}.c - # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Endpoint_${ARCH}.c - # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/EndpointStream_${ARCH}.c - # ${LUFA_ROOT_PATH}/Drivers/USB/Core/DeviceStandardReq.c - - ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/USBController_${ARCH}.c - ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/USBInterrupt_${ARCH}.c - ${LUFA_ROOT_PATH}/Drivers/USB/Core/ConfigDescriptors.c - ${LUFA_ROOT_PATH}/Drivers/USB/Core/Events.c - ${LUFA_ROOT_PATH}/Drivers/USB/Core/USBTask.c - ${LUFA_ROOT_PATH}/Drivers/USB/Class/Common/HIDParser.c - - ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Host_${ARCH}.c - ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Pipe_${ARCH}.c - ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/PipeStream_${ARCH}.c - ${LUFA_ROOT_PATH}/Drivers/USB/Core/HostStandardReq.c - - ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Device_${ARCH}.c - ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Endpoint_${ARCH}.c - ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/EndpointStream_${ARCH}.c - ${LUFA_ROOT_PATH}/Drivers/USB/Core/DeviceStandardReq.c - -# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/AudioClassDevice.c -# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/CCIDClassDevice.c -# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/CDCClassDevice.c -# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/HIDClassDevice.c -# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/MassStorageClassDevice.c -# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/MIDIClassDevice.c -# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/PrinterClassDevice.c -# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/RNDISClassDevice.c - -# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c -# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/AudioClassHost.c -# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/CDCClassHost.c -# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/HIDClassHost.c -# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/MassStorageClassHost.c -# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/MIDIClassHost.c -# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/PrinterClassHost.c -# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/RNDISClassHost.c -# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/StillImageClassHost.c -) \ No newline at end of file +target_link_libraries(tmk_core_protocol_lufa PUBLIC lufa) +target_link_libraries(tmk_core_protocol_lufa PUBLIC quantum) \ No newline at end of file From 4aea69ba2147976c6dead40b494ab686cff642b0 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sun, 2 Apr 2023 16:38:37 -0400 Subject: [PATCH 07/26] start arm stuff, better keyboard folder path management --- CMakeLists.txt | 9 +- cmake/AddKeyboard.cmake | 37 +++-- cmake/FindARMToolchain.cmake | 63 ++++++++ cmake/FindAVRToolchain.cmake | 62 ++++++++ cmake/FindToolchain.cmake | 36 +++-- cmake/GetARMToolchain.cmake | 24 +++ ...GetAVR-GCC.cmake => GetAVRToolchain.cmake} | 4 +- keyboards/CMakeLists.txt | 6 +- keyboards/planck/rev6/CMakeLists.txt | 1 + platforms/avr/toolchain.cmake | 3 +- platforms/chibios/toolchain.cmake | 138 ++++++++++++++++++ 11 files changed, 351 insertions(+), 32 deletions(-) create mode 100644 cmake/FindARMToolchain.cmake create mode 100644 cmake/FindAVRToolchain.cmake create mode 100644 cmake/GetARMToolchain.cmake rename cmake/{GetAVR-GCC.cmake => GetAVRToolchain.cmake} (95%) create mode 100644 keyboards/planck/rev6/CMakeLists.txt create mode 100644 platforms/chibios/toolchain.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 94b423f9fb..ebe0584728 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,20 +1,25 @@ -cmake_minimum_required(VERSION 3.3) +cmake_minimum_required(VERSION 3.20) list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") include(UpdateSubmodule) +# early declaration of macro defined in toolchain macro(add_qmk_executable _) endmacro(add_qmk_executable) if(NOT DEFINED QMK_KEYBOARD) +# configure step - populate targets + project(qmk_firmware) add_subdirectory(keyboards) else() +# build step + set(QMK_KEYBOARD_CURRENT_FOLDER ${QMK_KEYBOARD_FOLDER}) set(QMK_KEYBOARD_FOLDERS) set(QMK_KEYBOARD_FOLDER_PARTS) @@ -72,7 +77,7 @@ endif() # list(GET QMK_KEYBOARD_FOLDERS 0 QMK_KEYBOARD_BASE_FOLDER) list(GET QMK_KEYBOARD_KEYMAPS 0 QMK_KEYBOARD_KEYMAP) -list(GET QMK_KEYBOARD_HEADERS 0 QMK_KEYBOARD_HEADER) +list(GET QMK_KEYBOARD_HEADERS -1 QMK_KEYBOARD_HEADER) project(${QMK_KEYBOARD} LANGUAGES C CXX ASM diff --git a/cmake/AddKeyboard.cmake b/cmake/AddKeyboard.cmake index 6b8c7ed474..d7267bf011 100644 --- a/cmake/AddKeyboard.cmake +++ b/cmake/AddKeyboard.cmake @@ -1,12 +1,27 @@ -macro(add_keyboard KEYBOARD_CMAKE) - get_filename_component(KEYBOARD_FULL_DIRECTORY "${KEYBOARD_CMAKE}" DIRECTORY) +macro(add_keyboard KEYBOARD_FOLDER) + # not entirely sure why this is necessary + set(TEMP_PATH ${KEYBOARD_FOLDER}) + cmake_path(IS_RELATIVE TEMP_PATH IS_FOLDER_RELATIVE) + if(${IS_FOLDER_RELATIVE}) + set(KEYBOARD_FOLDER_ABS ${CMAKE_SOURCE_DIR}/keyboards/${KEYBOARD_FOLDER}) + if(NOT EXISTS ${KEYBOARD_FOLDER_ABS}) + message(FATAL_ERROR "Keyboard does not exist in QMK - try using an absolute path to the keyboard folder") + endif() + else() + set(KEYBOARD_FOLDER_ABS ${KEYBOARD_FOLDER}) + if(NOT EXISTS ${KEYBOARD_FOLDER_ABS}) + message(FATAL_ERROR "Absolute path to keyboard does not exist") + endif() + endif() # find the right toolchain - file(READ ${KEYBOARD_FULL_DIRECTORY}/info.json JSON_STRING) + message(STATUS "Reading config from ${KEYBOARD_FOLDER_ABS}/info.json") + file(READ ${KEYBOARD_FOLDER_ABS}/info.json JSON_STRING) string(JSON PROCESSOR GET ${JSON_STRING} processor) if(${PROCESSOR} MATCHES "^at.*") set(PLATFORM "avr") - # find_package(avr-gcc) + include(FindAVRToolchain) + find_avr_toolchain() elseif( ${PROCESSOR} MATCHES "^STM.*" OR ${PROCESSOR} MATCHES "^WB32.*" OR @@ -14,16 +29,20 @@ macro(add_keyboard KEYBOARD_CMAKE) ${PROCESSOR} MATCHES "RP2040" OR ${PROCESSOR} MATCHES "^GD32.*") set(PLATFORM "chibios") + include(FindARMToolchain) + find_arm_toolchain() endif() if(NOT DEFINED PLATFORM) - message(FATAL_ERROR "Could not find platform for ${KEYBOARD_FULL_DIRECTORY}") + message(FATAL_ERROR "Could not find platform for ${KEYBOARD_FOLDER}") endif() - include(FindToolChain) - find_toolchain() + if(${IS_FOLDER_RELATIVE}) + string(REPLACE "/" "_" KEYBOARD_NAME ${KEYBOARD_FOLDER}) + else() + string(JSON KEYBOARD_NAME GET ${JSON_STRING} keyboard_name) + string(REPLACE " " "_" KEYBOARD_NAME ${KEYBOARD_NAME}) + endif() - file(RELATIVE_PATH KEYBOARD_FOLDER "${CMAKE_SOURCE_DIR}/keyboards" "${KEYBOARD_FULL_DIRECTORY}") - string(REPLACE "/" "." KEYBOARD_NAME ${KEYBOARD_FOLDER}) ExternalProject_Add(${KEYBOARD_NAME} SOURCE_DIR ${CMAKE_SOURCE_DIR} PREFIX ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER} diff --git a/cmake/FindARMToolchain.cmake b/cmake/FindARMToolchain.cmake new file mode 100644 index 0000000000..2de22a273d --- /dev/null +++ b/cmake/FindARMToolchain.cmake @@ -0,0 +1,63 @@ +macro(find_gcc TRIPLE) +if(UNIX) + set(OS_SUFFIX "") + find_path(ARM_TOOLCHAIN_ROOT + NAMES + ${TRIPLE}-gcc${OS_SUFFIX} + PATHS + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc/avr-gcc-12.1.0-x64-linux/bin/" + /usr/bin/ + /usr/local/bin + /bin/ + $ENV{AVR_ROOT} + ) + find_path(MAKE_ROOT + NAMES + make${OS_SUFFIX} + PATHS + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-linux/bin/" + /usr/bin/ + /usr/local/bin + /bin/ + $ENV{AVR_ROOT} + ) +elseif(WIN32) + set(OS_SUFFIX ".exe") + find_path(ARM_TOOLCHAIN_ROOT + NAMES + ${TRIPLE}-gcc${OS_SUFFIX} + PATHS + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin" + "${CMAKE_SOURCE_DIR}/toolchains/gcc-arm-none-eabi-10.3-2021.10/bin/" + "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" + $ENV{AVR_ROOT} + ) + find_path(MAKE_ROOT + NAMES + make${OS_SUFFIX} + PATHS + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin/" + "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" + $ENV{AVR_ROOT} + ) +else(UNIX) + message(FATAL_ERROR "toolchain not supported on this OS") +endif(UNIX) +endmacro(find_gcc) + +macro(find_arm_toolchain) + find_gcc(arm-none-eabi) + + if(NOT ARM_TOOLCHAIN_ROOT) + include(GetARMToolchain) + find_gcc(arm-none-eabi) + endif() + + if(NOT ARM_TOOLCHAIN_ROOT) + message(FATAL_ERROR "ARM Toolchain could not be found") + endif() + + set(TOOLCHAIN_ROOT ${ARM_TOOLCHAIN_ROOT}) + message("ARM toolchain found: ${ARM_TOOLCHAIN_ROOT}") + message("Found make: ${MAKE_ROOT}") +endmacro() \ No newline at end of file diff --git a/cmake/FindAVRToolchain.cmake b/cmake/FindAVRToolchain.cmake new file mode 100644 index 0000000000..911ca07447 --- /dev/null +++ b/cmake/FindAVRToolchain.cmake @@ -0,0 +1,62 @@ +macro(find_gcc TRIPLE) +if(UNIX) + set(OS_SUFFIX "") + find_path(AVR_TOOLCHAIN_ROOT + NAMES + ${TRIPLE}-gcc${OS_SUFFIX} + PATHS + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc/avr-gcc-12.1.0-x64-linux/bin/" + /usr/bin/ + /usr/local/bin + /bin/ + $ENV{AVR_ROOT} + ) + find_path(MAKE_ROOT + NAMES + make${OS_SUFFIX} + PATHS + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-linux/bin/" + /usr/bin/ + /usr/local/bin + /bin/ + $ENV{AVR_ROOT} + ) +elseif(WIN32) + set(OS_SUFFIX ".exe") + find_path(AVR_TOOLCHAIN_ROOT + NAMES + ${TRIPLE}-gcc${OS_SUFFIX} + PATHS + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin" + "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" + $ENV{AVR_ROOT} + ) + find_path(MAKE_ROOT + NAMES + make${OS_SUFFIX} + PATHS + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin/" + "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" + $ENV{AVR_ROOT} + ) +else(UNIX) + message(FATAL_ERROR "toolchain not supported on this OS") +endif(UNIX) +endmacro(find_gcc) + +macro(find_avr_toolchain) + find_gcc(avr) + + if(NOT AVR_TOOLCHAIN_ROOT) + include(GetAVRToolchain) + find_gcc(avr) + endif() + + if(NOT AVR_TOOLCHAIN_ROOT) + message(FATAL_ERROR "AVR Toolchain could not be found") + endif() + + set(TOOLCHAIN_ROOT ${AVR_TOOLCHAIN_ROOT}) + message("AVR toolchain found: ${AVR_TOOLCHAIN_ROOT}") + message("Found make: ${MAKE_ROOT}") +endmacro() \ No newline at end of file diff --git a/cmake/FindToolchain.cmake b/cmake/FindToolchain.cmake index cc1d426dca..ab3279bf18 100644 --- a/cmake/FindToolchain.cmake +++ b/cmake/FindToolchain.cmake @@ -5,7 +5,7 @@ if(UNIX) NAMES ${TRIPLE}-gcc${OS_SUFFIX} PATHS - "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc/avr-gcc-12.1.0-x64-linux/bin/" + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc/avr-gcc-12.1.0-x64-linux/bin/" /usr/bin/ /usr/local/bin /bin/ @@ -15,7 +15,7 @@ if(UNIX) NAMES make${OS_SUFFIX} PATHS - "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc/avr-gcc-12.1.0-x64-linux/bin/" + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-linux/bin/" /usr/bin/ /usr/local/bin /bin/ @@ -27,7 +27,8 @@ elseif(WIN32) NAMES ${TRIPLE}-gcc${OS_SUFFIX} PATHS - "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc/avr-gcc-12.1.0-x64-windows/bin/" + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin" + "${CMAKE_SOURCE_DIR}/toolchains/gcc-arm-none-eabi-10.3-2021.10/bin/" "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" $ENV{AVR_ROOT} ) @@ -35,7 +36,7 @@ elseif(WIN32) NAMES make${OS_SUFFIX} PATHS - "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc/avr-gcc-12.1.0-x64-windows/bin/" + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin/" "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" $ENV{AVR_ROOT} ) @@ -44,19 +45,22 @@ else(UNIX) endif(UNIX) endmacro(find_gcc) -macro(find_toolchain) -find_gcc(avr) +macro(find_toolchain TRIPLE) + find_gcc(${TRIPLE}) -if(NOT TOOLCHAIN_ROOT) - include(GetAVR-GCC) - find_gcc(avr) -endif(NOT TOOLCHAIN_ROOT) + if(NOT TOOLCHAIN_ROOT) + if("${TRIPLE}" STREQUAL "avr") + include(GetAVRToolchain) + else() + include(GetARMToolchain) + endif() + find_gcc(${TRIPLE}) + endif() -if(NOT TOOLCHAIN_ROOT) - message(FATAL_ERROR "Toolchain root could not be found!!!") -endif(NOT TOOLCHAIN_ROOT) - -message("Found toolchain: ${TOOLCHAIN_ROOT}") -message("Found make: ${MAKE_ROOT}") + if(NOT TOOLCHAIN_ROOT) + message(FATAL_ERROR "Toolchain could not be found") + endif() + message("Found toolchain for ${TRIPLE}: ${TOOLCHAIN_ROOT}") + message("Found make: ${MAKE_ROOT}") endmacro() \ No newline at end of file diff --git a/cmake/GetARMToolchain.cmake b/cmake/GetARMToolchain.cmake new file mode 100644 index 0000000000..20dd3b33bf --- /dev/null +++ b/cmake/GetARMToolchain.cmake @@ -0,0 +1,24 @@ +message("Downloading gcc-arm-none-eabi") +if(WIN32) +file(DOWNLOAD + https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-win32.zip?rev=8f4a92e2ec2040f89912f372a55d8cf3&hash=8A9EAF77EF1957B779C59EADDBF2DAC118170BBF + ${CMAKE_SOURCE_DIR}/toolchains/downloads/gcc-arm-none-eabi-win32.zip + EXPECTED_HASH MD5=2bc8f0c4c4659f8259c8176223eeafc1 + SHOW_PROGRESS +) +file(ARCHIVE_EXTRACT + INPUT ${CMAKE_SOURCE_DIR}/toolchains/downloads/gcc-arm-none-eabi-win32.zip + DESTINATION ${CMAKE_SOURCE_DIR}/toolchains/ +) +elseif(UNIX) +file(DOWNLOAD + https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2?rev=78196d3461ba4c9089a67b5f33edf82a&hash=D484B37FF37D6FC3597EBE2877FB666A41D5253B + ${CMAKE_SOURCE_DIR}/toolchains/downloads/gcc-arm-none-eabi-x86_64-linux.tar.bz2 + EXPECTED_HASH MD5=3fe3d8bb693bd0a6e4615b6569443d0d + SHOW_PROGRESS +) +file(ARCHIVE_EXTRACT + INPUT ${CMAKE_SOURCE_DIR}/toolchains/downloads/gcc-arm-none-eabi-x86_64-linux.tar.bz2 + DESTINATION ${CMAKE_SOURCE_DIR}/toolchains/ +) +endif() \ No newline at end of file diff --git a/cmake/GetAVR-GCC.cmake b/cmake/GetAVRToolchain.cmake similarity index 95% rename from cmake/GetAVR-GCC.cmake rename to cmake/GetAVRToolchain.cmake index f7edc7d6c0..8fefc704bc 100644 --- a/cmake/GetAVR-GCC.cmake +++ b/cmake/GetAVRToolchain.cmake @@ -4,7 +4,7 @@ file(DOWNLOAD https://github.com/ZakKemble/avr-gcc-build/releases/download/v12.1.0-1/avr-gcc-12.1.0-x64-windows.zip ${CMAKE_SOURCE_DIR}/toolchains/downloads/avr-gcc-x64-windows.zip EXPECTED_HASH SHA256=e921a964fdeaedbe963352d0f26c6520a0a3eb8effc6ff232f3824b06c4ea0e2 - SHOW_PROGRESS TRUE + SHOW_PROGRESS ) file(ARCHIVE_EXTRACT INPUT ${CMAKE_SOURCE_DIR}/toolchains/downloads/avr-gcc-x64-windows.zip @@ -15,7 +15,7 @@ file(DOWNLOAD https://github.com/ZakKemble/avr-gcc-build/releases/download/v12.1.0-1/avr-gcc-12.1.0-x64-linux.tar.bz2 ${CMAKE_SOURCE_DIR}/toolchains/downloads/avr-gcc-x64-linux.tar.bz2 EXPECTED_HASH SHA256=feb034f4b85237032da8bac1f03765af5ebc4a8939b69bed57ff31bc482ca1a6 - SHOW_PROGRESS TRUE + SHOW_PROGRESS ) file(ARCHIVE_EXTRACT INPUT ${CMAKE_SOURCE_DIR}/toolchains/downloads/avr-gcc-x64-linux.tar.bz2 diff --git a/keyboards/CMakeLists.txt b/keyboards/CMakeLists.txt index 5c1cbdf5dc..8b79151c29 100644 --- a/keyboards/CMakeLists.txt +++ b/keyboards/CMakeLists.txt @@ -2,11 +2,13 @@ include(ExternalProject) include(AddKeyboard) if(DEFINED QMK_KEYBOARD_FOLDER) - add_keyboard(${CMAKE_SOURCE_DIR}/keyboards/${QMK_KEYBOARD_FOLDER}/CMakeFiles.txt) + add_keyboard(${QMK_KEYBOARD_FOLDER}) endif() file(GLOB_RECURSE KEYBOARDS **/CMakeLists.txt) foreach(KEYBOARD_CMAKE ${KEYBOARDS}) - add_keyboard(${KEYBOARD_CMAKE}) + get_filename_component(KEYBOARD_FOLDER_ABS "${KEYBOARD_CMAKE}" DIRECTORY) + file(RELATIVE_PATH KEYBOARD_FOLDER "${CMAKE_SOURCE_DIR}/keyboards" "${KEYBOARD_FOLDER_ABS}") + add_keyboard(${KEYBOARD_FOLDER}) endforeach() \ No newline at end of file diff --git a/keyboards/planck/rev6/CMakeLists.txt b/keyboards/planck/rev6/CMakeLists.txt new file mode 100644 index 0000000000..ebaf8f44ef --- /dev/null +++ b/keyboards/planck/rev6/CMakeLists.txt @@ -0,0 +1 @@ +add_qmk_executable(planck.rev6 rev6.c planck.c) \ No newline at end of file diff --git a/platforms/avr/toolchain.cmake b/platforms/avr/toolchain.cmake index cf2499002c..2b44cf92dd 100644 --- a/platforms/avr/toolchain.cmake +++ b/platforms/avr/toolchain.cmake @@ -11,7 +11,8 @@ if(UNIX) elseif(WIN32) set(OS_SUFFIX ".exe") endif() - +# include(FindAVRToolchain) +# find_avr_toolchain() # setup the AVR compiler variables diff --git a/platforms/chibios/toolchain.cmake b/platforms/chibios/toolchain.cmake new file mode 100644 index 0000000000..0c7001e1cf --- /dev/null +++ b/platforms/chibios/toolchain.cmake @@ -0,0 +1,138 @@ +set(TRIPLE "arm-none-eabi") + +if(UNIX) + set(OS_SUFFIX "") +elseif(WIN32) + set(OS_SUFFIX ".exe") +endif() +# include(FindARMToolchain) +# find_arm_toolchain() + +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR avr) +set(CMAKE_CROSS_COMPILING 1) + +set(CMAKE_MAKE_PROGRAM "${MAKE_ROOT}/make${OS_SUFFIX}" CACHE PATH "make" FORCE) +set(CMAKE_C_COMPILER "${TOOLCHAIN_ROOT}/${TRIPLE}-gcc${OS_SUFFIX}" CACHE PATH "gcc" FORCE) +set(CMAKE_CXX_COMPILER "${TOOLCHAIN_ROOT}/${TRIPLE}-g++${OS_SUFFIX}" CACHE PATH "g++" FORCE) +set(CMAKE_AR "${TOOLCHAIN_ROOT}/${TRIPLE}-ar${OS_SUFFIX}" CACHE PATH "ar" FORCE) +set(CMAKE_AS "${TOOLCHAIN_ROOT}/${TRIPLE}-as${OS_SUFFIX}" CACHE PATH "as" FORCE) +set(CMAKE_LINKER "${TOOLCHAIN_ROOT}/${TRIPLE}-ld${OS_SUFFIX}" CACHE PATH "linker" FORCE) +set(CMAKE_NM "${TOOLCHAIN_ROOT}/${TRIPLE}-nm${OS_SUFFIX}" CACHE PATH "nm" FORCE) +set(CMAKE_OBJCOPY "${TOOLCHAIN_ROOT}/${TRIPLE}-objcopy${OS_SUFFIX}" CACHE PATH "objcopy" FORCE) +set(CMAKE_OBJDUMP "${TOOLCHAIN_ROOT}/${TRIPLE}-objdump${OS_SUFFIX}" CACHE PATH "objdump" FORCE) +set(CMAKE_STRIP "${TOOLCHAIN_ROOT}/${TRIPLE}-strip${OS_SUFFIX}" CACHE PATH "strip" FORCE) +set(CMAKE_RANLIB "${TOOLCHAIN_ROOT}/${TRIPLE}-ranlib${OS_SUFFIX}" CACHE PATH "ranlib" FORCE) +set(AVR_SIZE "${TOOLCHAIN_ROOT}/${TRIPLE}-size${OS_SUFFIX}" CACHE PATH "size" FORCE) + +add_compile_options( + $<$:-std=gnu11> + $<$:-std=gnu++14> + # -flto + -Os + -Wall + -Wstrict-prototypes + -fcommon + # -g + -funsigned-char + -funsigned-bitfields + -ffunction-sections + -fdata-sections + -fpack-struct + -fshort-enums + -fno-builtin-printf + $<$:-fno-inline-small-functions> + $<$:-fno-strict-aliasing> + $<$:-fno-exceptions> +) + +add_compile_definitions( + F_CPU=16000000 + F_USB=16000000UL + __AVR_ATmega32U4__ + # LTO_ENABLE +) + +# include_directories("C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/avr/include") + +macro(add_qmk_executable target_name) + + set(elf_file ${target_name}-${QMK_MCU}.elf) + set(map_file ${target_name}-${QMK_MCU}.map) + set(hex_file ${target_name}-${QMK_MCU}.hex) + set(lst_file ${target_name}-${QMK_MCU}.lst) + + add_link_options(-Wl,--gc-sections,-Map=${map_file}) + + # create elf file + add_executable(${elf_file} + ${ARGN} + ) + + target_link_libraries(${elf_file} + PUBLIC + quantum + tmk_core_protocol + platforms + ) + + # set_target_properties( + # ${elf_file} + + # PROPERTIES + # COMPILE_FLAGS "-mmcu=${QMK_MCU} -g -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics" + # LINK_FLAGS "-mmcu=${QMK_MCU} -Wl,-Map,${map_file}" + # ) + + # generate the lst file + add_custom_command( + OUTPUT ${lst_file} + + COMMAND + ${CMAKE_OBJDUMP} -h -S ${elf_file} > ${lst_file} + + DEPENDS ${elf_file} + ) + + # create hex file + add_custom_command( + OUTPUT ${hex_file} + + COMMAND + ${CMAKE_OBJCOPY} -j .text -j .data -O ihex ${elf_file} ${hex_file} + + DEPENDS ${elf_file} + ) + + add_custom_command( + OUTPUT "print-size-${elf_file}" + + COMMAND + ${AVR_SIZE} ${elf_file} + + DEPENDS ${elf_file} + ) + + add_custom_command( + OUTPUT "print-size-${hex_file}" + + COMMAND + ${AVR_SIZE} ${hex_file} + + DEPENDS ${hex_file} + ) + + # build the intel hex file for the device + add_custom_target( + ${target_name} + ALL + DEPENDS ${hex_file} ${lst_file} "print-size-${elf_file}" "print-size-${hex_file}" + ) + + set_target_properties( + ${target_name} + + PROPERTIES + OUTPUT_NAME ${elf_file} + ) +endmacro(add_qmk_executable) From 9ae271c8447eb2014b9793ab1f047a9161254b46 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sun, 2 Apr 2023 22:40:34 -0400 Subject: [PATCH 08/26] capitalization matters on linux --- cmake/{FindLufa.cmake => Findlufa.cmake} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename cmake/{FindLufa.cmake => Findlufa.cmake} (100%) diff --git a/cmake/FindLufa.cmake b/cmake/Findlufa.cmake similarity index 100% rename from cmake/FindLufa.cmake rename to cmake/Findlufa.cmake From d5760d02a699f7cdc81b69f3db57ffe7157b407c Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sun, 2 Apr 2023 23:46:40 -0400 Subject: [PATCH 09/26] some relative/abs keymap folder stuff --- CMakeLists.txt | 33 +++++++++++++++++++++++++++------ cmake/AddKeyboard.cmake | 23 ++++++++++++++++++----- keyboards/CMakeLists.txt | 7 +++++-- 3 files changed, 50 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ebe0584728..7d16ccffff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,20 +34,38 @@ endwhile() file(READ keyboards/${QMK_KEYBOARD_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 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) +if(NOT DEFINED QMK_KEYMAP_FOLDER) + set(QMK_KEYMAP_FOLDER "default") +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() + 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() - # assuming every keyboard has a default/keymap.c at some level - if(EXISTS ${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/keymaps/default/keymap.c) - list(APPEND QMK_KEYBOARD_KEYMAPS "${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/keymaps/default/keymap.c") + 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 @@ -67,8 +85,11 @@ foreach(FOLDER ${QMK_KEYBOARD_FOLDERS}) # endif() endforeach() -if(NOT DEFINED QMK_KEYBOARD_KEYMAPS) - message(FATAL_ERROR "Keymap not found") +if(${IS_KEYMAP_FOLDER_RELATIVE}) + if(NOT DEFINED QMK_KEYBOARD_KEYMAPS) + message(FATAL_ERROR "Keymap not found") + endif() + list(GET QMK_KEYBOARD_KEYMAPS 0 QMK_KEYBOARD_KEYMAP) endif() if(NOT DEFINED QMK_KEYBOARD_HEADERS) @@ -76,11 +97,11 @@ if(NOT DEFINED QMK_KEYBOARD_HEADERS) endif() # list(GET QMK_KEYBOARD_FOLDERS 0 QMK_KEYBOARD_BASE_FOLDER) -list(GET QMK_KEYBOARD_KEYMAPS 0 QMK_KEYBOARD_KEYMAP) list(GET QMK_KEYBOARD_HEADERS -1 QMK_KEYBOARD_HEADER) project(${QMK_KEYBOARD} LANGUAGES C CXX ASM + HOMEPAGE_URL ${URL} VERSION ${DEVICE_VER}) string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" VERSION_MATCH ${DEVICE_VER}) diff --git a/cmake/AddKeyboard.cmake b/cmake/AddKeyboard.cmake index d7267bf011..2ac4d13cb0 100644 --- a/cmake/AddKeyboard.cmake +++ b/cmake/AddKeyboard.cmake @@ -1,8 +1,8 @@ -macro(add_keyboard KEYBOARD_FOLDER) +macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) # not entirely sure why this is necessary set(TEMP_PATH ${KEYBOARD_FOLDER}) - cmake_path(IS_RELATIVE TEMP_PATH IS_FOLDER_RELATIVE) - if(${IS_FOLDER_RELATIVE}) + cmake_path(IS_RELATIVE TEMP_PATH IS_KEYBOARD_FOLDER_RELATIVE) + if(${IS_KEYBOARD_FOLDER_RELATIVE}) set(KEYBOARD_FOLDER_ABS ${CMAKE_SOURCE_DIR}/keyboards/${KEYBOARD_FOLDER}) if(NOT EXISTS ${KEYBOARD_FOLDER_ABS}) message(FATAL_ERROR "Keyboard does not exist in QMK - try using an absolute path to the keyboard folder") @@ -13,6 +13,18 @@ macro(add_keyboard KEYBOARD_FOLDER) message(FATAL_ERROR "Absolute path to keyboard does not exist") endif() endif() + + set(TEMP_PATH ${KEYMAP_FOLDER}) + cmake_path(IS_RELATIVE TEMP_PATH IS_KEYMAP_FOLDER_RELATIVE) + if(${IS_KEYMAP_FOLDER_RELATIVE}) + set(KEYMAP_NAME ${KEYMAP_FOLDER}) + else() + if(WIN32) + set(KEYMAP_NAME $ENV{USERNAME}) + else() + set(KEYMAP_NAME $ENV{USE}) + endif() + endif() # find the right toolchain message(STATUS "Reading config from ${KEYBOARD_FOLDER_ABS}/info.json") @@ -36,14 +48,14 @@ macro(add_keyboard KEYBOARD_FOLDER) message(FATAL_ERROR "Could not find platform for ${KEYBOARD_FOLDER}") endif() - if(${IS_FOLDER_RELATIVE}) + if(${IS_KEYBOARD_FOLDER_RELATIVE}) string(REPLACE "/" "_" KEYBOARD_NAME ${KEYBOARD_FOLDER}) else() string(JSON KEYBOARD_NAME GET ${JSON_STRING} keyboard_name) string(REPLACE " " "_" KEYBOARD_NAME ${KEYBOARD_NAME}) endif() - ExternalProject_Add(${KEYBOARD_NAME} + ExternalProject_Add(${KEYBOARD_NAME}_${KEYMAP_NAME} SOURCE_DIR ${CMAKE_SOURCE_DIR} PREFIX ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER} TMP_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/tmp @@ -61,5 +73,6 @@ macro(add_keyboard KEYBOARD_FOLDER) -DMAKE_ROOT=${MAKE_ROOT} -DQMK_KEYBOARD=${KEYBOARD_NAME} -DQMK_KEYBOARD_FOLDER=${KEYBOARD_FOLDER} + -DQMK_KEYMAP_FOLDER=${KEYMAP_FOLDER} ) endmacro(add_keyboard) \ No newline at end of file diff --git a/keyboards/CMakeLists.txt b/keyboards/CMakeLists.txt index 8b79151c29..b1c78db466 100644 --- a/keyboards/CMakeLists.txt +++ b/keyboards/CMakeLists.txt @@ -2,7 +2,10 @@ include(ExternalProject) include(AddKeyboard) if(DEFINED QMK_KEYBOARD_FOLDER) - add_keyboard(${QMK_KEYBOARD_FOLDER}) + if(NOT DEFINED QMK_KEYMAP_FOLDER) + set(QMK_KEYMAP_FOLDER "default") + endif() + add_keyboard(${QMK_KEYBOARD_FOLDER} ${QMK_KEYMAP_FOLDER}) endif() file(GLOB_RECURSE KEYBOARDS **/CMakeLists.txt) @@ -10,5 +13,5 @@ file(GLOB_RECURSE KEYBOARDS **/CMakeLists.txt) foreach(KEYBOARD_CMAKE ${KEYBOARDS}) get_filename_component(KEYBOARD_FOLDER_ABS "${KEYBOARD_CMAKE}" DIRECTORY) file(RELATIVE_PATH KEYBOARD_FOLDER "${CMAKE_SOURCE_DIR}/keyboards" "${KEYBOARD_FOLDER_ABS}") - add_keyboard(${KEYBOARD_FOLDER}) + add_keyboard(${KEYBOARD_FOLDER} "default") endforeach() \ No newline at end of file From 2ebad0d33fefeee1ad4f693e2c9a8e16cc8d4e80 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Mon, 3 Apr 2023 13:19:45 -0400 Subject: [PATCH 10/26] basic json validator supporting most used properties. converted some regex to cmake-compatible expressions --- CMakeLists.txt | 4 +- cmake/AddKeyboard.cmake | 7 +- cmake/FindARMToolchain.cmake | 4 +- cmake/FindAVRToolchain.cmake | 4 +- cmake/ValidateJson.cmake | 199 ++++++++++++++++++++++++++++ cmake/features/backlight.cmake | 4 +- data/schemas/definitions.jsonschema | 12 +- platforms/chibios/toolchain.cmake | 34 +++-- 8 files changed, 240 insertions(+), 28 deletions(-) create mode 100644 cmake/ValidateJson.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d16ccffff..ada5c260af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,9 @@ while(NOT ${QMK_KEYBOARD_CURRENT_FOLDER} STREQUAL "") endwhile() # would be nice to also do validation here -file(READ keyboards/${QMK_KEYBOARD_FOLDER}/info.json QMK_KEYBOARD_INFO_JSON_STRING) +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) diff --git a/cmake/AddKeyboard.cmake b/cmake/AddKeyboard.cmake index 2ac4d13cb0..c8b6d29f74 100644 --- a/cmake/AddKeyboard.cmake +++ b/cmake/AddKeyboard.cmake @@ -27,8 +27,11 @@ macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) endif() # find the right toolchain - message(STATUS "Reading config from ${KEYBOARD_FOLDER_ABS}/info.json") - file(READ ${KEYBOARD_FOLDER_ABS}/info.json JSON_STRING) + + # not sure we need to validate here + include(ValidateJSON) + validate_json(${KEYBOARD_FOLDER_ABS}/info.json keyboard JSON_STRING) + string(JSON PROCESSOR GET ${JSON_STRING} processor) if(${PROCESSOR} MATCHES "^at.*") set(PLATFORM "avr") diff --git a/cmake/FindARMToolchain.cmake b/cmake/FindARMToolchain.cmake index 2de22a273d..76e1e86f20 100644 --- a/cmake/FindARMToolchain.cmake +++ b/cmake/FindARMToolchain.cmake @@ -58,6 +58,6 @@ macro(find_arm_toolchain) endif() set(TOOLCHAIN_ROOT ${ARM_TOOLCHAIN_ROOT}) - message("ARM toolchain found: ${ARM_TOOLCHAIN_ROOT}") - message("Found make: ${MAKE_ROOT}") + message(STATUS "ARM toolchain found: ${ARM_TOOLCHAIN_ROOT}") + message(STATUS "Found make: ${MAKE_ROOT}") endmacro() \ No newline at end of file diff --git a/cmake/FindAVRToolchain.cmake b/cmake/FindAVRToolchain.cmake index 911ca07447..3a72b90c30 100644 --- a/cmake/FindAVRToolchain.cmake +++ b/cmake/FindAVRToolchain.cmake @@ -57,6 +57,6 @@ macro(find_avr_toolchain) endif() set(TOOLCHAIN_ROOT ${AVR_TOOLCHAIN_ROOT}) - message("AVR toolchain found: ${AVR_TOOLCHAIN_ROOT}") - message("Found make: ${MAKE_ROOT}") + message(STATUS "AVR toolchain found: ${AVR_TOOLCHAIN_ROOT}") + message(STATUS "Found make: ${MAKE_ROOT}") endmacro() \ No newline at end of file diff --git a/cmake/ValidateJson.cmake b/cmake/ValidateJson.cmake new file mode 100644 index 0000000000..51b96fb249 --- /dev/null +++ b/cmake/ValidateJson.cmake @@ -0,0 +1,199 @@ +function(validate_json JSON_FILE SCHEMA_NAME JSON_STRING_STR) + unset(${JSON_STRING_STR} PARENT_SCOPE) + message(STATUS "Validating ${JSON_FILE} with '${SCHEMA_NAME}' schema") + file(READ ${JSON_FILE} JSON_STRING) + file(READ ${CMAKE_SOURCE_DIR}/data/schemas/${SCHEMA_NAME}.jsonschema SCHEMA_STRING) + string(JSON SCHEMA_ID GET ${SCHEMA_STRING} $id) + + set(DEFINITIONS "{}") + file(READ ${CMAKE_SOURCE_DIR}/data/schemas/definitions.jsonschema DEFINITIONS_STRING) + string(JSON DEFINITION_ID GET ${DEFINITIONS_STRING} $id) + string(JSON DEFINITIONS SET ${DEFINITIONS} "${DEFINITION_ID}#" ${DEFINITIONS_STRING}) + + string(JSON SCHEMA_DEFINITIONS ERROR_VARIABLE JSON_ERROR GET ${SCHEMA_STRING} definitions) + if(${JSON_ERROR} STREQUAL "NOTFOUND") + string(JSON DEFINITIONS SET ${DEFINITIONS} "#" "{}") + string(JSON DEFINITIONS SET ${DEFINITIONS} "#" definitions ${SCHEMA_DEFINITIONS}) + # string(JSON DEFINITIONS_LENGTH LENGTH ${SCHEMA_DEFINITIONS}) + # math(EXPR MAX "${DEFINITIONS_LENGTH} - 1") + # foreach(IDX RANGE ${MAX}) + # string(JSON DEFINITION_NAME MEMBER ${SCHEMA_DEFINITIONS} ${IDX}) + # string(JSON DEFINITION GET ${SCHEMA_DEFINITIONS} ${DEFINITION_NAME}) + # message(DEBUG "Loading local definition '${DEFINITION_NAME}'") + # string(JSON DEFINITIONS_STRING SET ${DEFINITIONS_STRING} ${DEFINITION_NAME} ${DEFINITION}) + # endforeach() + endif() + + validate_object(${JSON_STRING} ${SCHEMA_STRING} OBJECT_ERROR) + if(DEFINED OBJECT_ERROR) + message(FATAL_ERROR ${OBJECT_ERROR}) + else() + set(${JSON_STRING_STR} ${JSON_STRING} PARENT_SCOPE) + endif() +endfunction() + +function(validate_object JSON_STRING SCHEMA_STRING OBJECT_ERROR_STR) + unset(${OBJECT_ERROR_STR} PARENT_SCOPE) + set(OBJECT_ERROR) + string(JSON PROPERTY_NAME_SCHEMA ERROR_VARIABLE PROPERTY_NAMES_ERROR GET ${SCHEMA_STRING} propertyNames) + string(JSON REQUIRED_PROPERTIES ERROR_VARIABLE REQUIRED_PROPERTIES_ERROR GET ${SCHEMA_STRING} required) + set(REQUIRED_LIST) + if(${REQUIRED_PROPERTIES_ERROR} STREQUAL "NOTFOUND") + string(JSON REQUIRED_LENGTH LENGTH ${REQUIRED_PROPERTIES}) + math(EXPR MAX "${REQUIRED_LENGTH} - 1") + foreach(IDX RANGE ${MAX}) + string(JSON REQUIRED GET ${REQUIRED_PROPERTIES} ${IDX}) + list(APPEND REQUIRED_LIST ${REQUIRED}) + endforeach() + endif() + string(JSON NUM_PROPERTIES LENGTH ${JSON_STRING}) + math(EXPR MAX "${NUM_PROPERTIES} - 1") + foreach(IDX RANGE ${MAX}) + string(JSON PROPERTY_NAME MEMBER ${JSON_STRING} ${IDX}) + list(REMOVE_ITEM REQUIRED_LIST ${PROPERTY_NAME}) + message(DEBUG "Validating property '${PROPERTY_NAME}'") + if(${PROPERTY_NAMES_ERROR} STREQUAL "NOTFOUND") + validate_property(${PROPERTY_NAME} ${PROPERTY_NAME_SCHEMA} PROPERTY_NAME_ERROR) + if(DEFINED PROPERTY_NAME_ERROR) + list(APPEND OBJECT_ERROR "${PROPERTY_NAME_ERROR}") + endif() + endif() + string(JSON PROPERTY GET ${JSON_STRING} ${PROPERTY_NAME}) + string(JSON SCHEMA_PROPERTIES ERROR_VARIABLE PROPERTIES_ERROR GET ${SCHEMA_STRING} properties ${PROPERTY_NAME}) + if(${PROPERTIES_ERROR} STREQUAL "NOTFOUND") + string(JSON PROPERTY_SCHEMA GET ${SCHEMA_STRING} properties ${PROPERTY_NAME}) + else() + string(JSON PROPERTY_SCHEMA ERROR_VARIABLE ADDITIONAL_PROPERTIES_ERROR GET ${SCHEMA_STRING} additionalProperties) + if(NOT ${ADDITIONAL_PROPERTIES_ERROR} STREQUAL "NOTFOUND" OR "${PROPERTY_SCHEMA}" STREQUAL "OFF") + list(APPEND OBJECT_ERROR "Additional properties like '${PROPERTY_NAME}' not permitted in '${JSON_STRING}'") + endif() + endif() + validate_property(${PROPERTY} ${PROPERTY_SCHEMA} PROPERTY_ERROR) + if(DEFINED PROPERTY_ERROR) + list(APPEND OBJECT_ERROR "${PROPERTY_ERROR}") + endif() + endforeach() + list(LENGTH REQUIRED_LIST REQUIRED_REMAINING_LENGTH) + if(${REQUIRED_REMAINING_LENGTH} GREATER 0) + list(APPEND OBJECT_ERROR "Required properties not found: ${REQUIRED_LIST}") + endif() + set(${OBJECT_ERROR_STR} ${OBJECT_ERROR} PARENT_SCOPE) +endfunction() + +function(validate_property PROPERTY PROPERTY_SCHEMA PROPERTY_ERROR_STR) + unset(${PROPERTY_ERROR_STR} PARENT_SCOPE) + set(PROPERTY_ERROR) + string(JSON PROPERTY_REF ERROR_VARIABLE JSON_ERROR GET ${PROPERTY_SCHEMA} $ref) + if(${JSON_ERROR} STREQUAL "NOTFOUND") + string(REPLACE "/" ";" REF_COMPONENTS "${PROPERTY_REF}") + string(JSON PROPERTY_SCHEMA GET ${DEFINITIONS} ${REF_COMPONENTS}) + endif() + string(JSON PROPERTY_TYPE ERROR_VARIABLE JSON_ERROR GET ${PROPERTY_SCHEMA} type) + if(${JSON_ERROR} STREQUAL "NOTFOUND") + message(DEBUG "Validating property type '${PROPERTY_TYPE}'") + if(${PROPERTY_TYPE} STREQUAL "object") + validate_object(${PROPERTY} ${PROPERTY_SCHEMA} OBJECT_ERROR) + if(DEFINED OBJECT_ERROR) + list(APPEND PROPERTY_ERROR ${OBJECT_ERROR}) + endif() + elseif(${PROPERTY_TYPE} STREQUAL "array") + string(JSON ARRAY_LENGTH LENGTH ${PROPERTY}) + string(JSON MAX_ITEMS ERROR_VARIABLE JSON_ERROR GET ${PROPERTY_SCHEMA} maxItems) + if(${JSON_ERROR} STREQUAL "NOTFOUND" AND ${ARRAY_LENGTH} GREATER ${MAX_ITEMS}) + list(APPEND PROPERTY_ERROR "Number of items in '${PROPERTY}' exceeds maximum ${MAX_ITEMS}") + endif() + string(JSON MIN_ITEMS ERROR_VARIABLE JSON_ERROR GET ${PROPERTY_SCHEMA} minItems) + if(${JSON_ERROR} STREQUAL "NOTFOUND" AND ${ARRAY_LENGTH} LESS ${MIN_ITEMS}) + list(APPEND PROPERTY_ERROR "Number of items in '${PROPERTY}' is less than ${MIN_ITEMS}") + endif() + string(JSON ITEM_SCHEMA ERROR_VARIABLE JSON_ERROR GET ${PROPERTY_SCHEMA} items) + if(${JSON_ERROR} STREQUAL "NOTFOUND") + math(EXPR MAX "${ARRAY_LENGTH} - 1") + foreach(IDX RANGE ${MAX}) + string(JSON ITEM GET ${PROPERTY} ${IDX}) + validate_property(${ITEM} ${ITEM_SCHEMA} ITEM_ERROR) + if(DEFINED ITEM_ERROR) + list(APPEND PROPERTY_ERROR ${ITEM_ERROR}) + endif() + endforeach() + endif() + elseif(${PROPERTY_TYPE} STREQUAL "null") + if(NOT "${PROPERTY}" STREQUAL "null") + list(APPEND PROPERTY_ERROR "Property '${PROPERTY}' is not null'") + endif() + elseif(${PROPERTY_TYPE} STREQUAL "boolean") + if(NOT "${PROPERTY}" STREQUAL "OFF" AND NOT "${PROPERTY}" STREQUAL "ON") + list(APPEND PROPERTY_ERROR "Property '${PROPERTY}' is not a boolean'") + endif() + elseif(${PROPERTY_TYPE} STREQUAL "number") + if(NOT "${PROPERTY}" MATCHES "-?[0-9]+\\.?[0-9]*") + list(APPEND PROPERTY_ERROR "Property '${PROPERTY}' is not a number'") + endif() + elseif(${PROPERTY_TYPE} STREQUAL "integer") + if(NOT "${PROPERTY}" MATCHES "-?[0-9]+") + list(APPEND PROPERTY_ERROR "Property '${PROPERTY}' is not an integer'") + endif() + string(JSON MIN ERROR_VARIABLE JSON_ERROR GET ${PROPERTY_SCHEMA} minimum) + if(${JSON_ERROR} STREQUAL "NOTFOUND" AND ${PROPERTY} LESS ${MIN}) + list(APPEND PROPERTY_ERROR "Property '${PROPERTY}' is less than the minimum of ${MIN}") + endif() + string(JSON MAX ERROR_VARIABLE JSON_ERROR GET ${PROPERTY_SCHEMA} maximum) + if(${JSON_ERROR} STREQUAL "NOTFOUND" AND ${PROPERTY} GREATER ${MAX}) + list(APPEND PROPERTY_ERROR "Property '${PROPERTY}' is greater than the maximum of ${MAX}") + endif() + elseif(${PROPERTY_TYPE} STREQUAL "string") + # cmake regex doesn't support {}, so other options might be needed here + string(JSON PATTERN ERROR_VARIABLE JSON_ERROR GET ${PROPERTY_SCHEMA} pattern) + if(${JSON_ERROR} STREQUAL "NOTFOUND" AND NOT "${PROPERTY}" MATCHES "${PATTERN}") + list(APPEND PROPERTY_ERROR "Property '${PROPERTY}' does not match '${PATTERN}'") + endif() + string(LENGTH ${PROPERTY} STRING_LENGTH) + string(JSON MIN_LENGTH ERROR_VARIABLE JSON_ERROR GET ${PROPERTY_SCHEMA} minLength) + if(${JSON_ERROR} STREQUAL "NOTFOUND" AND ${STRING_LENGTH} LESS ${MIN_LENGTH}) + list(APPEND PROPERTY_ERROR "Length of property '${PROPERTY}' is less than the minimum of ${MIN_LENGTH}") + endif() + string(JSON MAX_LENGTH ERROR_VARIABLE JSON_ERROR GET ${PROPERTY_SCHEMA} maxLength) + if(${JSON_ERROR} STREQUAL "NOTFOUND" AND ${STRING_LENGTH} GREATER ${MAX_LENGTH}) + list(APPEND PROPERTY_ERROR "Length of property '${PROPERTY}' is greater than the maximum of ${MAX_LENGTH}") + endif() + string(JSON ENUM_LIST ERROR_VARIABLE JSON_ERROR GET ${PROPERTY_SCHEMA} enum) + if(${JSON_ERROR} STREQUAL "NOTFOUND") + set(FOUND_IN_ENUM_LIST FALSE) + string(JSON ENUM_LENGTH LENGTH ${ENUM_LIST}) + math(EXPR MAX "${ENUM_LENGTH} - 1") + foreach(IDX RANGE ${MAX}) + string(JSON ENUM GET ${PROPERTY_SCHEMA} enum ${IDX}) + if(${ENUM} STREQUAL ${PROPERTY}) + set(FOUND_IN_ENUM_LIST TRUE) + endif() + endforeach() + if(NOT ${FOUND_IN_ENUM_LIST}) + list(APPEND PROPERTY_ERROR "Property '${PROPERTY}' is not defined in the schema's enum: ${ENUM_LIST}") + endif() + endif() + else() + message(STATUS "Unknown type '${PROPERTY_TYPE}'") + endif() + else() + string(JSON PROPERTY_ONEOF ERROR_VARIABLE JSON_ERROR GET ${PROPERTY_SCHEMA} oneOf) + if(${JSON_ERROR} STREQUAL "NOTFOUND") + set(TYPE_SUCCESS FALSE) + string(JSON NUM_ONEOF LENGTH ${PROPERTY_ONEOF}) + math(EXPR MAX "${NUM_ONEOF} - 1") + set(ONEOF_ERRORS) + foreach(IDX RANGE ${MAX}) + string(JSON PROPERTY_SCHEMA GET ${PROPERTY_ONEOF} ${IDX}) + validate_property(${PROPERTY} ${PROPERTY_SCHEMA} ONEOF_ERROR) + if(NOT DEFINED ONEOF_ERROR) + set(TYPE_SUCCESS TRUE) + else() + list(APPEND ONEOF_ERRORS "${ONEOF_ERROR}\n") + endif() + endforeach() + if(NOT TYPE_SUCCESS) + list(APPEND PROPERTY_ERROR "Could not validate oneOf type '${PROPERTY}' :\n${ONEOF_ERRORS}") + endif() + endif() + endif() + set(${PROPERTY_ERROR_STR} ${PROPERTY_ERROR} PARENT_SCOPE) +endfunction() \ No newline at end of file diff --git a/cmake/features/backlight.cmake b/cmake/features/backlight.cmake index b4545d7786..10819ad927 100644 --- a/cmake/features/backlight.cmake +++ b/cmake/features/backlight.cmake @@ -2,12 +2,12 @@ option(BACKLIGHT_ENABLE "" TRUE) set(BACKLIGHT_DRIVER "pwm" CACHE STRING "Backlight driver") set_property(CACHE BACKLIGHT_DRIVER PROPERTY STRINGS pwm timer software custom) -if(${BACKLIGHT_ENABLE}) +string(JSON BACKLIGHT_PIN ERROR_VARIABLE NO_BACKLIGHT_PIN GET ${QMK_KEYBOARD_INFO_JSON_STRING} backlight pin) +if(${BACKLIGHT_ENABLE} AND NOT ${NO_BACKLIGHT_PIN} STREQUAL "backlight-NOTFOUND") add_library(backlight quantum/backlight/backlight.c quantum/process_keycode/process_backlight.c ) - string(JSON BACKLIGHT_PIN GET ${QMK_KEYBOARD_INFO_JSON_STRING} backlight pin) add_compile_definitions( BACKLIGHT_ENABLE BACKLIGHT_PIN=${BACKLIGHT_PIN} diff --git a/data/schemas/definitions.jsonschema b/data/schemas/definitions.jsonschema index 94a94157c0..c4e2a8af6b 100644 --- a/data/schemas/definitions.jsonschema +++ b/data/schemas/definitions.jsonschema @@ -14,15 +14,15 @@ }, "hex_number_2d": { "type": "string", - "pattern": "^0x[0-9A-F]{2}$" + "pattern": "^0x[0-9A-F][0-9A-F]$" }, "hex_number_4d": { "type": "string", - "pattern": "^0x[0-9A-F]{4}$" + "pattern": "^0x[0-9A-F][0-9A-F][0-9A-F][0-9A-F]$" }, "bcd_version": { "type": "string", - "pattern": "^[0-9]{1,2}\\.[0-9]\\.[0-9]$" + "pattern": "^[0-9][0-9]?\\.[0-9]\\.[0-9]$" }, "text_identifier": { "type": "string", @@ -83,15 +83,15 @@ }, { "type": "string", - "pattern": "^[A-K]\\d{1,2}$" + "pattern": "^[A-K]\\d\\d?$" }, { "type": "string", - "pattern": "^LINE_PIN\\d{1,2}$" + "pattern": "^LINE_PIN\\d\\d?$" }, { "type": "string", - "pattern": "^GP\\d{1,2}$" + "pattern": "^GP\\d\\d?$" }, { "type": "integer" diff --git a/platforms/chibios/toolchain.cmake b/platforms/chibios/toolchain.cmake index 0c7001e1cf..9ef02b1869 100644 --- a/platforms/chibios/toolchain.cmake +++ b/platforms/chibios/toolchain.cmake @@ -9,7 +9,7 @@ endif() # find_arm_toolchain() set(CMAKE_SYSTEM_NAME Generic) -set(CMAKE_SYSTEM_PROCESSOR avr) +set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_CROSS_COMPILING 1) set(CMAKE_MAKE_PROGRAM "${MAKE_ROOT}/make${OS_SUFFIX}" CACHE PATH "make" FORCE) @@ -32,27 +32,35 @@ add_compile_options( -Os -Wall -Wstrict-prototypes - -fcommon + # -fcommon # -g - -funsigned-char - -funsigned-bitfields + -fomit-frame-pointer -ffunction-sections -fdata-sections - -fpack-struct - -fshort-enums + -fno-common + -fshort-wchar -fno-builtin-printf - $<$:-fno-inline-small-functions> - $<$:-fno-strict-aliasing> - $<$:-fno-exceptions> + # -funsigned-char + # -funsigned-bitfields + # -ffunction-sections + # -fdata-sections + # -fpack-struct + # -fshort-enums + # -fno-builtin-printf + # $<$:-fno-inline-small-functions> + # $<$:-fno-strict-aliasing> + # $<$:-fno-exceptions> ) add_compile_definitions( - F_CPU=16000000 - F_USB=16000000UL - __AVR_ATmega32U4__ + # F_CPU=16000000 + # F_USB=16000000UL + # __AVR_ATmega32U4__ # LTO_ENABLE ) +add_link_options(--specs=nosys.specs) + # include_directories("C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/avr/include") macro(add_qmk_executable target_name) @@ -62,7 +70,7 @@ macro(add_qmk_executable target_name) set(hex_file ${target_name}-${QMK_MCU}.hex) set(lst_file ${target_name}-${QMK_MCU}.lst) - add_link_options(-Wl,--gc-sections,-Map=${map_file}) + add_link_options(-Wl,--gc-sections,-nostartfiles) # create elf file add_executable(${elf_file} From 4d999378d082cb66d553558ef519da128ad0d83e Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Mon, 3 Apr 2023 13:43:40 -0400 Subject: [PATCH 11/26] 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 ada5c260af..ace52077e1 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 c8b6d29f74..05a1028e23 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} From 40a3a431ef97d639d8040ce00141e5cbd20aa9cb Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Mon, 3 Apr 2023 21:02:40 -0400 Subject: [PATCH 12/26] unknown state --- .gitignore | 2 +- CMakeLists.txt | 44 ++++++++++++------- cmake/AddKeyboard.cmake | 36 +++++++++------ cmake/ResolveKeyboard.cmake | 42 ++++++++++++++++++ cmake/features/backlight.cmake | 2 +- cmake/features/oled.cmake | 4 +- .../toolchains/arm-none-eabi.cmake | 41 ++++++++++++++--- .../toolchains/avr.cmake | 2 + cmake/toolchains/riscv32-unknown-elf.cmake | 0 cmake/toolchains/riscv64-unknown-elf.cmake | 16 +++++++ data/keyboards.json | 4 ++ platforms/CMakeLists.txt | 2 +- platforms/avr/CMakeLists.txt | 7 ++- platforms/chibios/CMakeLists.txt | 3 ++ tmk_core/protocol/CMakeLists.txt | 4 +- tmk_core/protocol/chibios/CMakeLists.txt | 21 +++++++++ 16 files changed, 185 insertions(+), 45 deletions(-) create mode 100644 cmake/ResolveKeyboard.cmake rename platforms/chibios/toolchain.cmake => cmake/toolchains/arm-none-eabi.cmake (83%) rename platforms/avr/toolchain.cmake => cmake/toolchains/avr.cmake (98%) create mode 100644 cmake/toolchains/riscv32-unknown-elf.cmake create mode 100644 cmake/toolchains/riscv64-unknown-elf.cmake create mode 100644 data/keyboards.json create mode 100644 platforms/chibios/CMakeLists.txt create mode 100644 tmk_core/protocol/chibios/CMakeLists.txt diff --git a/.gitignore b/.gitignore index 09108487a4..908d5089ee 100644 --- a/.gitignore +++ b/.gitignore @@ -56,7 +56,7 @@ cmake-build-debug *.pdf # cmake toolchain downloads -toolchains +/toolchains # Let these ones be user specific, since we have so many different configurations *.code-workspace diff --git a/CMakeLists.txt b/CMakeLists.txt index ace52077e1..bcb198d008 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,8 +5,8 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") include(UpdateSubmodule) # early declaration of macro defined in toolchain -macro(add_qmk_executable _) -endmacro(add_qmk_executable) +# macro(add_qmk_executable _) +# endmacro(add_qmk_executable) if(NOT DEFINED QMK_KEYBOARD) @@ -19,6 +19,8 @@ add_subdirectory(keyboards) else() # build step +include(ResolveKeyboard) +resolve_keyboard(${QMK_KEYBOARD_FOLDER} QMK_KEYBOARD_FOLDER_ABS) set(TEMP_PATH ${QMK_KEYBOARD_FOLDER}) cmake_path(IS_RELATIVE TEMP_PATH IS_KEYBOARD_FOLDER_RELATIVE) @@ -29,9 +31,11 @@ endif() set(TEMP_PATH ${QMK_KEYMAP_FOLDER}) cmake_path(IS_RELATIVE TEMP_PATH IS_KEYMAP_FOLDER_RELATIVE) +if(${IS_KEYBOARD_FOLDER_RELATIVE} AND NOT EXISTS ${CMAKE_SOURCE_DIR}/keyboards/${QMK_KEYMAP_FOLDER}) + set(IS_KEYBOARD_FOLDER_RELATIVE FALSE) +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) @@ -52,6 +56,8 @@ set(QMK_KEYBOARD_FOLDER_ABS ${CMAKE_SOURCE_DIR}/keyboards/${QMK_KEYBOARD_FOLDER} # 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") + elseif(EXISTS ${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/keymap.c) + list(APPEND QMK_KEYBOARD_KEYMAPS "${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/keymap.c") endif() endif() get_filename_component(LAST_PART ${FOLDER} NAME) @@ -91,11 +97,15 @@ set(QMK_KEYBOARD_FOLDER_ABS ${CMAKE_SOURCE_DIR}/keyboards/${QMK_KEYBOARD_FOLDER} list(GET QMK_KEYBOARD_HEADERS -1 QMK_KEYBOARD_HEADER) else(${IS_KEYBOARD_FOLDER_RELATIVE}) - set(QMK_KEYBOARD_FOLDER_ABS ${QMK_KEYBOARD_FOLDER}) - + include_directories(${QMK_KEYBOARD_FOLDER_ABS}) + if(EXISTS ${QMK_KEYBOARD_FOLDER_ABS}/config.h) + list(APPEND QMK_KEYBOARD_CONFIG_HS "${QMK_KEYBOARD_FOLDER_ABS}/config.h") + endif() 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") + if(EXISTS "${QMK_KEYBOARD_FOLDER_ABS}/keymaps/${QMK_KEYMAP_FOLDER}/keymap.c") + set(QMK_KEYBOARD_KEYMAP "${QMK_KEYBOARD_FOLDER_ABS}/keymaps/${QMK_KEYMAP_FOLDER}/keymap.c") + elseif(EXISTS "${QMK_KEYBOARD_FOLDER_ABS}/keymap.c") + set(QMK_KEYBOARD_KEYMAP "${QMK_KEYBOARD_FOLDER_ABS}/keymap.c") else() message(FATAL_ERROR "Could not find keymap in keymap folder '${QMK_KEYMAP_FOLDER}'") endif() @@ -108,8 +118,12 @@ else(${IS_KEYBOARD_FOLDER_RELATIVE}) endif() if(NOT DEFINED QMK_KEYBOARD_HEADER) - get_filename_component((LAST_PART ${QMK_KEYBOARD_FOLDER}) NAME) - set(QMK_KEYBOARD_HEADER "${LAST_PART}.h") + get_filename_component(LAST_PART ${QMK_KEYBOARD_FOLDER_ABS} NAME) + if(EXISTS "${QMK_KEYBOARD_FOLDER_ABS}/${LAST_PART}.h") + set(QMK_KEYBOARD_HEADER "${LAST_PART}.h") + elseif(EXISTS "${QMK_KEYBOARD_FOLDER_ABS}/keyboard.h") + set(QMK_KEYBOARD_HEADER "keyboard.h") + endif() endif() endif() @@ -137,11 +151,6 @@ math(EXPR VERSION_C_EVAL "${VERSION_MAJOR} * 10000 + ${VERSION_MINOR} * 100 + ${ add_compile_options( -include ${QMK_KEYBOARD_CONFIG_HS} - -mmcu=${QMK_MCU} -) - -add_link_options( - -mmcu=${QMK_MCU} ) add_compile_definitions( @@ -163,10 +172,11 @@ add_subdirectory(tmk_core/protocol) include(features/oled) include(features/backlight) -if(EXISTS keyboards/${QMK_KEYBOARD_FOLDER}/CMakeLists.txt) - add_subdirectory(keyboards/${QMK_KEYBOARD_FOLDER}) +if(EXISTS ${QMK_KEYBOARD_FOLDER_ABS}/CMakeLists.txt) + add_subdirectory(${QMK_KEYBOARD_FOLDER_ABS}) else() - file(GLOB KEYBOARD_SRC "keyboards/${QMK_KEYBOARD_FOLDER}/*.c") + file(GLOB KEYBOARD_SRC "${QMK_KEYBOARD_FOLDER_ABS}/*.c") + list(REMOVE_ITEM KEYBOARD_SRC "${QMK_KEYBOARD_KEYMAP}") add_qmk_executable(${QMK_KEYBOARD} ${KEYBOARD_SRC}) endif() diff --git a/cmake/AddKeyboard.cmake b/cmake/AddKeyboard.cmake index 05a1028e23..b2bc838182 100644 --- a/cmake/AddKeyboard.cmake +++ b/cmake/AddKeyboard.cmake @@ -1,18 +1,27 @@ +include(ResolveKeyboard) +include(ValidateJSON) + macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) # not entirely sure why this is necessary + # set(TEMP_PATH ${KEYBOARD_FOLDER}) + # cmake_path(IS_RELATIVE TEMP_PATH IS_KEYBOARD_FOLDER_RELATIVE) + # if(${IS_KEYBOARD_FOLDER_RELATIVE}) + # set(KEYBOARD_FOLDER_ABS ${CMAKE_SOURCE_DIR}/keyboards/${KEYBOARD_FOLDER}) + # if(NOT EXISTS ${KEYBOARD_FOLDER_ABS}) + # # message(FATAL_ERROR "Keyboard does not exist in QMK - try using an absolute path to the keyboard folder") + # resolve_keyboard(${KEYBOARD_FOLDER} KEYBOARD_FOLDER_ABS) + # endif() + # else() + # set(KEYBOARD_FOLDER_ABS ${KEYBOARD_FOLDER}) + # if(NOT EXISTS ${KEYBOARD_FOLDER_ABS}) + # message(FATAL_ERROR "Absolute path to keyboard does not exist") + # endif() + # endif() + + resolve_keyboard(${KEYBOARD_FOLDER} KEYBOARD_FOLDER_ABS) + set(TEMP_PATH ${KEYBOARD_FOLDER}) cmake_path(IS_RELATIVE TEMP_PATH IS_KEYBOARD_FOLDER_RELATIVE) - if(${IS_KEYBOARD_FOLDER_RELATIVE}) - set(KEYBOARD_FOLDER_ABS ${CMAKE_SOURCE_DIR}/keyboards/${KEYBOARD_FOLDER}) - if(NOT EXISTS ${KEYBOARD_FOLDER_ABS}) - message(FATAL_ERROR "Keyboard does not exist in QMK - try using an absolute path to the keyboard folder") - endif() - else() - set(KEYBOARD_FOLDER_ABS ${KEYBOARD_FOLDER}) - if(NOT EXISTS ${KEYBOARD_FOLDER_ABS}) - message(FATAL_ERROR "Absolute path to keyboard does not exist") - endif() - endif() set(TEMP_PATH ${KEYMAP_FOLDER}) cmake_path(IS_RELATIVE TEMP_PATH IS_KEYMAP_FOLDER_RELATIVE) @@ -29,12 +38,12 @@ macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) # find the right toolchain # not sure we need to validate here - include(ValidateJSON) validate_json(${KEYBOARD_FOLDER_ABS}/info.json keyboard JSON_STRING) string(JSON PROCESSOR GET ${JSON_STRING} processor) if(${PROCESSOR} MATCHES "^at.*") set(PLATFORM "avr") + set(TOOLCHAIN "avr") include(FindAVRToolchain) find_avr_toolchain() elseif( @@ -44,6 +53,7 @@ macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) ${PROCESSOR} MATCHES "RP2040" OR ${PROCESSOR} MATCHES "^GD32.*") set(PLATFORM "chibios") + set(TOOLCHAIN "arm-none-eabi") include(FindARMToolchain) find_arm_toolchain() endif() @@ -71,7 +81,7 @@ macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) # this seems to work well for all systems so far - not sure if it'd be useful to customize CMAKE_GENERATOR "Unix Makefiles" CMAKE_ARGS - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_SOURCE_DIR}/platforms/${PLATFORM}/toolchain.cmake + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_SOURCE_DIR}/cmake/toolchains/${TOOLCHAIN}.cmake -DTOOLCHAIN_ROOT=${TOOLCHAIN_ROOT} -DMAKE_ROOT=${MAKE_ROOT} -DQMK_KEYBOARD=${KEYBOARD_NAME} diff --git a/cmake/ResolveKeyboard.cmake b/cmake/ResolveKeyboard.cmake new file mode 100644 index 0000000000..66fb25805b --- /dev/null +++ b/cmake/ResolveKeyboard.cmake @@ -0,0 +1,42 @@ +function(resolve_keyboard KEYBOARD KEYBOAD_FOLDER_ABS_STR) + message(STATUS "Resolving ${KEYBOARD}") + if(EXISTS "${CMAKE_SOURCE_DIR}/keyboards/${KEYBOARD}") + message(STATUS "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(STATUS "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(STATUS "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(STATUS "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() \ No newline at end of file diff --git a/cmake/features/backlight.cmake b/cmake/features/backlight.cmake index 10819ad927..25f903309a 100644 --- a/cmake/features/backlight.cmake +++ b/cmake/features/backlight.cmake @@ -17,7 +17,7 @@ if(${BACKLIGHT_ENABLE} AND NOT ${NO_BACKLIGHT_PIN} STREQUAL "backlight-NOTFOUND" else() target_sources(backlight PRIVATE quantum/backlight/backlight_driver_common.c) if(${BACKLIGHT_DRIVER} STREQUAL "pwm") - target_sources(backlight PRIVATE quantum/backlight/backlight_${CMAKE_SYSTEM_PROCESSOR}.c) + target_sources(backlight PRIVATE quantum/backlight/backlight_${QMK_PLATFORM}.c) else() target_sources(backlight PRIVATE quantum/backlight/backlight_${BACKLIGHT_DRIVER}.c) endif() diff --git a/cmake/features/oled.cmake b/cmake/features/oled.cmake index e84b72d233..f2bc0e8a3a 100644 --- a/cmake/features/oled.cmake +++ b/cmake/features/oled.cmake @@ -2,12 +2,12 @@ option(OLED_ENABLE "" TRUE) if(${OLED_ENABLE}) add_library(oled drivers/oled/ssd1306_sh1106.c - platforms/${CMAKE_SYSTEM_PROCESSOR}/drivers/i2c_master.c) + platforms/${QMK_PLATFORM}/drivers/i2c_master.c) add_compile_definitions(OLED_ENABLE) target_include_directories(oled PUBLIC drivers) target_include_directories(quantum PUBLIC drivers/oled) target_include_directories(oled PUBLIC drivers/oled) - target_include_directories(oled PUBLIC platforms/${CMAKE_SYSTEM_PROCESSOR}/drivers) + target_include_directories(oled PUBLIC platforms/${QMK_PLATFORM}/drivers) target_link_libraries(oled PUBLIC quantum) target_link_libraries(oled PUBLIC platform_avr) endif() diff --git a/platforms/chibios/toolchain.cmake b/cmake/toolchains/arm-none-eabi.cmake similarity index 83% rename from platforms/chibios/toolchain.cmake rename to cmake/toolchains/arm-none-eabi.cmake index 9ef02b1869..ecbf475460 100644 --- a/platforms/chibios/toolchain.cmake +++ b/cmake/toolchains/arm-none-eabi.cmake @@ -1,4 +1,6 @@ set(TRIPLE "arm-none-eabi") +set(QMK_PLATFORM "chibios") +set(QMK_PROTOCOL "chibios") if(UNIX) set(OS_SUFFIX "") @@ -28,12 +30,14 @@ set(AVR_SIZE "${TOOLCHAIN_ROOT}/${TRIPLE}-size${OS_SUFFIX}" CACHE P add_compile_options( $<$:-std=gnu11> $<$:-std=gnu++14> + $<$:-fno-rtti> # -flto -Os -Wall -Wstrict-prototypes # -fcommon # -g + -fomit-frame-pointer -ffunction-sections -fdata-sections @@ -53,13 +57,38 @@ add_compile_options( ) add_compile_definitions( - # F_CPU=16000000 - # F_USB=16000000UL - # __AVR_ATmega32U4__ - # LTO_ENABLE + THUMB_PRESENT + THUMB_NO_INTERWORKING + PROTOCOL_CHIBIOS + MCU_${MCU_FAMILY} + PLATFORM_SUPPORTS_SYNCHRONIZATION + PORT_IGNORE_GCC_VERSION_CHECK=1 ) -add_link_options(--specs=nosys.specs) +add_link_options( + -Wl,--gc-sections + -nostartfiles + -Wl,--no-wchar-size-warning + --specs=nano.specs + -mthumb + -mno-thumb-interwork + -mno-unaligned-access +) + +if(${USE_FPU}) + add_compile_definitions( + CORTEX_USE_FPU=TRUE + ) + add_link_options( + -mfloat-abi=hard + -mfpu=fpv4-sp-d16 + -fsingle-precision-constant + ) +else() + add_compile_definitions( + CORTEX_USE_FPU=FALSE + ) +endif() # include_directories("C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/avr/include") @@ -70,7 +99,7 @@ macro(add_qmk_executable target_name) set(hex_file ${target_name}-${QMK_MCU}.hex) set(lst_file ${target_name}-${QMK_MCU}.lst) - add_link_options(-Wl,--gc-sections,-nostartfiles) + # add_link_options(-Wl,--gc-sections,-nostartfiles) # create elf file add_executable(${elf_file} diff --git a/platforms/avr/toolchain.cmake b/cmake/toolchains/avr.cmake similarity index 98% rename from platforms/avr/toolchain.cmake rename to cmake/toolchains/avr.cmake index 2b44cf92dd..5d099eecaf 100644 --- a/platforms/avr/toolchain.cmake +++ b/cmake/toolchains/avr.cmake @@ -5,6 +5,8 @@ # @since Feb 06 2016 set(TRIPLE "avr") +set(QMK_PLATFORM "avr") +set(QMK_PROTOCOL "lufa") if(UNIX) set(OS_SUFFIX "") diff --git a/cmake/toolchains/riscv32-unknown-elf.cmake b/cmake/toolchains/riscv32-unknown-elf.cmake new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cmake/toolchains/riscv64-unknown-elf.cmake b/cmake/toolchains/riscv64-unknown-elf.cmake new file mode 100644 index 0000000000..d270270f24 --- /dev/null +++ b/cmake/toolchains/riscv64-unknown-elf.cmake @@ -0,0 +1,16 @@ +if(${USE_PICOLIBC}) + add_compile_options( + --specs=picolibc.specs + ) + add_compile_definitions(USE_PICOLIBC) + add_link_options( + -Wl,--defsym=__heap_start=__heap_base__,--defsym=__heap_end=__heap_end__ + ) +endif() + +add_compile_options( + -march=${MCU_ARCH} + -mabi=${MCU_ABI} + -mcmodel=${MCU_CMODEL} + -mstrict-align +) \ No newline at end of file diff --git a/data/keyboards.json b/data/keyboards.json new file mode 100644 index 0000000000..9e72c053c8 --- /dev/null +++ b/data/keyboards.json @@ -0,0 +1,4 @@ +{ + "olkb/planck/rev3": "@jackhumbert/test_keyboard", + "olkb/planck/rev6": "planck/rev6" +} \ No newline at end of file diff --git a/platforms/CMakeLists.txt b/platforms/CMakeLists.txt index 260f9355c1..5696c8b2db 100644 --- a/platforms/CMakeLists.txt +++ b/platforms/CMakeLists.txt @@ -2,4 +2,4 @@ add_library(platforms suspend.c synchronization_util.c timer.c) target_include_directories(platforms PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(platforms PUBLIC quantum) -add_subdirectory(${CMAKE_SYSTEM_PROCESSOR}) \ No newline at end of file +add_subdirectory(${QMK_PLATFORM}) \ No newline at end of file diff --git a/platforms/avr/CMakeLists.txt b/platforms/avr/CMakeLists.txt index dd8f58dadb..5b9f6c3b69 100644 --- a/platforms/avr/CMakeLists.txt +++ b/platforms/avr/CMakeLists.txt @@ -1,10 +1,15 @@ +add_compile_options( + -mmcu=${QMK_MCU} +) +add_link_options( + -mmcu=${QMK_MCU} +) add_library(platforms_avr hardware_id.c platform.c suspend.c timer.c printf.c - xprintf.S bootloaders/bootloadhid.c ) target_include_directories(platforms_avr PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/platforms/chibios/CMakeLists.txt b/platforms/chibios/CMakeLists.txt new file mode 100644 index 0000000000..135c6cee8e --- /dev/null +++ b/platforms/chibios/CMakeLists.txt @@ -0,0 +1,3 @@ +add_link_options( + -mcpu=${QMK_MCU} +) \ No newline at end of file diff --git a/tmk_core/protocol/CMakeLists.txt b/tmk_core/protocol/CMakeLists.txt index 3e341e3a8c..c2cf43e815 100644 --- a/tmk_core/protocol/CMakeLists.txt +++ b/tmk_core/protocol/CMakeLists.txt @@ -12,6 +12,4 @@ add_compile_definitions( target_include_directories(tmk_core_protocol PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(tmk_core_protocol PUBLIC quantum) -if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "avr") - add_subdirectory(lufa) -endif() \ No newline at end of file +add_subdirectory(${QMK_PROTOCOL}) \ No newline at end of file diff --git a/tmk_core/protocol/chibios/CMakeLists.txt b/tmk_core/protocol/chibios/CMakeLists.txt new file mode 100644 index 0000000000..5a4144ccf3 --- /dev/null +++ b/tmk_core/protocol/chibios/CMakeLists.txt @@ -0,0 +1,21 @@ +add_compile_definitions( + PROTOCOL_CHIBIOS + FIXED_CONTROL_ENDPOINT_SIZE=64 + FIXED_NUM_CONFIGURATIONS=1 +) + +add_library(tmk_core_protocol_chibios + usb_main.c + chibios.c + ../usb_descriptor.c + usb_driver.c + usb_util.c +) + +# find_package(lufa REQUIRED) + +target_include_directories(tmk_core_protocol_chibios PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(tmk_core_protocol_chibios PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/lufa_utils) + +# target_link_libraries(tmk_core_protocol_chibios PUBLIC lufa) +target_link_libraries(tmk_core_protocol_chibios PUBLIC quantum) \ No newline at end of file From 6468360ff1b0dfd85de202b27c0798c87e195ecc Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Mon, 3 Apr 2023 23:22:59 -0400 Subject: [PATCH 13/26] example tasks --- .vscode/tasks.json | 137 +++++++++++++++++++++++++++++++++++++ CMakeLists.txt | 8 +-- cmake/toolchains/avr.cmake | 11 ++- 3 files changed, 149 insertions(+), 7 deletions(-) create mode 100644 .vscode/tasks.json diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000000..521cdcbf5a --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,137 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Load Keyboard & Refresh Outline", + "dependsOrder": "sequence", + "dependsOn":[ + "Load Keyboard", + "Configure CMake" + ], + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "label": "Load Keyboard", + "type": "shell", + "command": "cmake -Bbuild -DQMK_KEYBOARD_FOLDER=${input:keyboard}", + "problemMatcher": [] + }, + { + "label": "Configure CMake", + "type": "cmake", + "command": "configure" + // "command": "${command:cmake.configure}", + // "problemMatcher": [], + }, + { + "label": "Build", + "problemMatcher": [ + { + "base": "$gcc", + "fileLocation": ["relative", "${workspaceRoot}/build"] + }, + ], + "options": { + "environment": { + "CLICOLOR_FORCE": "1" + } + }, + "type": "cmake", + "command": "build", + "targets":[ + "${input:keyboard_safe}" + ], + "group": { + "kind": "build", + "isDefault": true + }, + // "type": "shell", + // "command": "cmake --build build --target ${input:keyboard_safe}", + // "problemMatcher": [], + // "group": { + // "kind": "build", + // "isDefault": true + // } + // "type": "cmake", + // "command": "build", + // "targets":[ + // "${input:keyboard_safe}" + // ] + }, + { + "label": "Rebuild", + // "type": "process", + // "command": "cmake", + // "args": [ + // "--build", + // "build", + // "--target", + // "${input:keyboard_safe}", + // "--clean-first" + // ], + "problemMatcher": [ + { + "base": "$gcc", + "fileLocation": ["relative", "${workspaceRoot}/build"] + }, + ], + "options": { + "environment": { + "CLICOLOR_FORCE": "1" + } + }, + "type": "cmake", + "command": "cleanRebuild", + "targets":[ + "${input:keyboard_safe}" + ], + "group": { + "kind": "build", + "isDefault": true + }, + } + ], + "inputs": [ + { + "id": "keyboard", + "description": "Keyboard:", + "type": "pickString", + "options":[ + "planck/rev5", + "olkb/planck/rev3" + ] + }, + { + "id": "keyboard_safe", + "description": "Keyboard:", + "type": "pickString", + "options":[ + "planck_rev5_default", + "olkb_planck_rev3_default" + ] + }, + // { + // "type": "command", + // "id": "keyboard", + // "command": "extension.commandvariable.pickStringRemember", + // "args": { + // "description": "select an option :", + // "options": [ + // ["always 1", "5000"], + // ["always 2", "5100"] + // ], + // "default": "", + // "fileName": "${workspaceFolder}/data/keyboards.json", + // "pattern": { + // "regexp": "^\\s*(?!#)([^=]+?)\\s*=\\s*(?:(\\{.+\\})|(.+))$", + // "label": "$1", + // "json": "$2", + // "value": "$3" + // } + // } + // } + ] +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index bcb198d008..da41715bfd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,9 @@ resolve_keyboard(${QMK_KEYBOARD_FOLDER} QMK_KEYBOARD_FOLDER_ABS) set(TEMP_PATH ${QMK_KEYBOARD_FOLDER}) cmake_path(IS_RELATIVE TEMP_PATH IS_KEYBOARD_FOLDER_RELATIVE) +if(${IS_KEYBOARD_FOLDER_RELATIVE} AND NOT EXISTS ${CMAKE_SOURCE_DIR}/keyboards/${QMK_KEYBOARD_FOLDER}) + set(IS_KEYBOARD_FOLDER_RELATIVE FALSE) +endif() if(NOT DEFINED QMK_KEYMAP_FOLDER) set(QMK_KEYMAP_FOLDER "default") @@ -31,9 +34,6 @@ endif() set(TEMP_PATH ${QMK_KEYMAP_FOLDER}) cmake_path(IS_RELATIVE TEMP_PATH IS_KEYMAP_FOLDER_RELATIVE) -if(${IS_KEYBOARD_FOLDER_RELATIVE} AND NOT EXISTS ${CMAKE_SOURCE_DIR}/keyboards/${QMK_KEYMAP_FOLDER}) - set(IS_KEYBOARD_FOLDER_RELATIVE FALSE) -endif() if(${IS_KEYBOARD_FOLDER_RELATIVE}) set(QMK_KEYBOARD_CURRENT_FOLDER ${QMK_KEYBOARD_FOLDER}) @@ -113,7 +113,7 @@ else(${IS_KEYBOARD_FOLDER_RELATIVE}) 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}'") + message(FATAL_ERROR "Could not find keymap in keymap path '${QMK_KEYMAP_FOLDER}'") endif() endif() diff --git a/cmake/toolchains/avr.cmake b/cmake/toolchains/avr.cmake index 5d099eecaf..c429b835a3 100644 --- a/cmake/toolchains/avr.cmake +++ b/cmake/toolchains/avr.cmake @@ -53,7 +53,8 @@ find_program(AVR_UPLOAD add_compile_options( $<$:-std=gnu11> $<$:-std=gnu++14> - # -flto + -flto + # -mrelax -Os -Wall -Wstrict-prototypes @@ -77,7 +78,11 @@ add_compile_definitions( F_CPU=16000000 F_USB=16000000UL __AVR_ATmega32U4__ - # LTO_ENABLE + LTO_ENABLE +) + +add_link_options( + -Wl,--gc-sections ) # include_directories("C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/avr/include") @@ -92,7 +97,7 @@ macro(add_qmk_executable target_name) set(hex_file ${target_name}-${QMK_MCU}.hex) set(lst_file ${target_name}-${QMK_MCU}.lst) - add_link_options(-Wl,--gc-sections,-Map=${map_file}) + add_link_options(-Wl,-Map=${map_file}) # create elf file add_executable(${elf_file} From 531c37b256c6fbb68245108e186940752d808f88 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 4 Apr 2023 12:07:58 -0400 Subject: [PATCH 14/26] closer, tasks populating targets --- .vscode/tasks.json | 110 ++++++------------ CMakeLists.txt | 154 +++++++------------------- cmake/AddKeyboard.cmake | 40 ++----- cmake/FindARMToolchain.cmake | 58 +--------- cmake/FindAVRToolchain.cmake | 57 +--------- cmake/FindToolchain.cmake | 66 ----------- cmake/Findlufa.cmake | 7 +- cmake/ResolveKeyboard.cmake | 74 +++++++++++++ cmake/ResolveToolchain.cmake | 57 ++++++++++ cmake/features/backlight.cmake | 7 +- cmake/features/oled.cmake | 5 +- cmake/toolchains/arm-none-eabi.cmake | 40 ++++--- cmake/toolchains/avr.cmake | 122 +++++++++----------- keyboards/CMakeLists.txt | 2 + platforms/CMakeLists.txt | 3 +- platforms/avr/CMakeLists.txt | 17 +-- platforms/chibios/CMakeLists.txt | 5 +- quantum/CMakeLists.txt | 11 +- tmk_core/protocol/CMakeLists.txt | 5 +- tmk_core/protocol/lufa/CMakeLists.txt | 8 +- 20 files changed, 354 insertions(+), 494 deletions(-) delete mode 100644 cmake/FindToolchain.cmake create mode 100644 cmake/ResolveToolchain.cmake diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 521cdcbf5a..f439088ac7 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -23,15 +23,13 @@ "label": "Configure CMake", "type": "cmake", "command": "configure" - // "command": "${command:cmake.configure}", - // "problemMatcher": [], }, { "label": "Build", "problemMatcher": [ { "base": "$gcc", - "fileLocation": ["relative", "${workspaceRoot}/build"] + "fileLocation": ["relative", "${workspaceFolder}/build"] }, ], "options": { @@ -42,57 +40,36 @@ "type": "cmake", "command": "build", "targets":[ - "${input:keyboard_safe}" + "${input:keyboard_target}" ], "group": { "kind": "build", "isDefault": true }, - // "type": "shell", - // "command": "cmake --build build --target ${input:keyboard_safe}", - // "problemMatcher": [], - // "group": { - // "kind": "build", - // "isDefault": true - // } - // "type": "cmake", - // "command": "build", - // "targets":[ - // "${input:keyboard_safe}" - // ] }, - { - "label": "Rebuild", - // "type": "process", - // "command": "cmake", - // "args": [ - // "--build", - // "build", - // "--target", - // "${input:keyboard_safe}", - // "--clean-first" - // ], - "problemMatcher": [ - { - "base": "$gcc", - "fileLocation": ["relative", "${workspaceRoot}/build"] - }, - ], - "options": { - "environment": { - "CLICOLOR_FORCE": "1" - } - }, - "type": "cmake", - "command": "cleanRebuild", - "targets":[ - "${input:keyboard_safe}" - ], - "group": { - "kind": "build", - "isDefault": true - }, - } + // { + // "label": "Rebuild", + // "problemMatcher": [ + // { + // "base": "$gcc", + // "fileLocation": ["relative", "${workspaceFolder}/build"] + // }, + // ], + // "options": { + // "environment": { + // "CLICOLOR_FORCE": "1" + // } + // }, + // "type": "cmake", + // "command": "cleanRebuild", + // "targets":[ + // "${input:keyboard_target}" + // ], + // "group": { + // "kind": "build", + // "isDefault": true + // }, + // } ], "inputs": [ { @@ -105,33 +82,14 @@ ] }, { - "id": "keyboard_safe", - "description": "Keyboard:", - "type": "pickString", - "options":[ - "planck_rev5_default", - "olkb_planck_rev3_default" - ] - }, - // { - // "type": "command", - // "id": "keyboard", - // "command": "extension.commandvariable.pickStringRemember", - // "args": { - // "description": "select an option :", - // "options": [ - // ["always 1", "5000"], - // ["always 2", "5100"] - // ], - // "default": "", - // "fileName": "${workspaceFolder}/data/keyboards.json", - // "pattern": { - // "regexp": "^\\s*(?!#)([^=]+?)\\s*=\\s*(?:(\\{.+\\})|(.+))$", - // "label": "$1", - // "json": "$2", - // "value": "$3" - // } - // } - // } + "id": "keyboard_target", + "type": "command", + "command": "shellCommand.execute", + "args": { + "command": "type build\\targets", + "description": "Target:", + "fieldSeparator": "|" + }, + } ] } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index da41715bfd..cfdd4a4cf2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,11 +3,27 @@ cmake_minimum_required(VERSION 3.20) list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") include(UpdateSubmodule) +include(ResolveKeyboard) +include(ValidateJSON) + +set(QMK_KEYBOARDS_FOLDER "${CMAKE_SOURCE_DIR}/keyboards") # early declaration of macro defined in toolchain # macro(add_qmk_executable _) # endmacro(add_qmk_executable) +function (_get_all_cmake_targets out_var current_dir) + get_property(targets DIRECTORY ${current_dir} PROPERTY BUILDSYSTEM_TARGETS) + get_property(subdirs DIRECTORY ${current_dir} PROPERTY SUBDIRECTORIES) + + foreach(subdir ${subdirs}) + _get_all_cmake_targets(subdir_targets ${subdir}) + list(APPEND targets ${subdir_targets}) + endforeach() + + set(${out_var} ${targets} PARENT_SCOPE) +endfunction() + if(NOT DEFINED QMK_KEYBOARD) # configure step - populate targets @@ -16,118 +32,30 @@ project(qmk_firmware) add_subdirectory(keyboards) +# Run at end of top-level CMakeLists +# _get_all_cmake_targets(all_targets ${CMAKE_SOURCE_DIR}) +# message(STATUS "All: ${all_targets}") +# list(JOIN all_targets "\n" TARGET_FILE) +# file(WRITE "${CMAKE_SOURCE_DIR}/build/targets" ${TARGET_FILE}) + else() # build step -include(ResolveKeyboard) -resolve_keyboard(${QMK_KEYBOARD_FOLDER} QMK_KEYBOARD_FOLDER_ABS) - -set(TEMP_PATH ${QMK_KEYBOARD_FOLDER}) -cmake_path(IS_RELATIVE TEMP_PATH IS_KEYBOARD_FOLDER_RELATIVE) -if(${IS_KEYBOARD_FOLDER_RELATIVE} AND NOT EXISTS ${CMAKE_SOURCE_DIR}/keyboards/${QMK_KEYBOARD_FOLDER}) - set(IS_KEYBOARD_FOLDER_RELATIVE FALSE) -endif() if(NOT DEFINED QMK_KEYMAP_FOLDER) set(QMK_KEYMAP_FOLDER "default") endif() -set(TEMP_PATH ${QMK_KEYMAP_FOLDER}) -cmake_path(IS_RELATIVE TEMP_PATH IS_KEYMAP_FOLDER_RELATIVE) +resolve_keyboard(${QMK_KEYBOARD_FOLDER} QMK_KEYBOARD_FOLDER_ABS) +cmake_path(IS_PREFIX QMK_KEYBOARDS_FOLDER "${QMK_KEYBOARD_FOLDER_ABS}" IS_KEYBOARDS_FOLDER) +resolve_config_h(${QMK_KEYBOARD_FOLDER_ABS} QMK_KEYBOARD_CONFIG_H) +resolve_keyboard_h(${QMK_KEYBOARD_FOLDER_ABS} QMK_KEYBOARD_H) +resolve_keymap_c(${QMK_KEYBOARD_FOLDER_ABS} ${QMK_KEYMAP_FOLDER} QMK_KEYMAP_C) -if(${IS_KEYBOARD_FOLDER_RELATIVE}) - 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() +message(STATUS "config.h: ${QMK_KEYBOARD_CONFIG_H}") +message(STATUS "keyboard.h: ${QMK_KEYBOARD_H}") +message(STATUS "Keymap.c: ${QMK_KEYMAP_C}") - 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") - elseif(EXISTS ${CMAKE_SOURCE_DIR}/keyboards/${FOLDER}/keymap.c) - list(APPEND QMK_KEYBOARD_KEYMAPS "${CMAKE_SOURCE_DIR}/keyboards/${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() - - if(${IS_KEYMAP_FOLDER_RELATIVE}) - 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() - - 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}) - include_directories(${QMK_KEYBOARD_FOLDER_ABS}) - if(EXISTS ${QMK_KEYBOARD_FOLDER_ABS}/config.h) - list(APPEND QMK_KEYBOARD_CONFIG_HS "${QMK_KEYBOARD_FOLDER_ABS}/config.h") - endif() - if(${IS_KEYMAP_FOLDER_RELATIVE}) - if(EXISTS "${QMK_KEYBOARD_FOLDER_ABS}/keymaps/${QMK_KEYMAP_FOLDER}/keymap.c") - set(QMK_KEYBOARD_KEYMAP "${QMK_KEYBOARD_FOLDER_ABS}/keymaps/${QMK_KEYMAP_FOLDER}/keymap.c") - elseif(EXISTS "${QMK_KEYBOARD_FOLDER_ABS}/keymap.c") - set(QMK_KEYBOARD_KEYMAP "${QMK_KEYBOARD_FOLDER_ABS}/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 path '${QMK_KEYMAP_FOLDER}'") - endif() - endif() - - if(NOT DEFINED QMK_KEYBOARD_HEADER) - get_filename_component(LAST_PART ${QMK_KEYBOARD_FOLDER_ABS} NAME) - if(EXISTS "${QMK_KEYBOARD_FOLDER_ABS}/${LAST_PART}.h") - set(QMK_KEYBOARD_HEADER "${LAST_PART}.h") - elseif(EXISTS "${QMK_KEYBOARD_FOLDER_ABS}/keyboard.h") - set(QMK_KEYBOARD_HEADER "keyboard.h") - endif() - endif() -endif() - -include(ValidateJSON) validate_json(${QMK_KEYBOARD_FOLDER_ABS}/info.json keyboard QMK_KEYBOARD_INFO_JSON_STRING) string(JSON KEYBOARD_NAME GET ${QMK_KEYBOARD_INFO_JSON_STRING} keyboard_name) @@ -139,7 +67,7 @@ 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 + LANGUAGES C CXX ASM HOMEPAGE_URL ${URL} VERSION ${DEVICE_VER}) @@ -150,12 +78,12 @@ set(VERSION_PATCH ${CMAKE_MATCH_3}) math(EXPR VERSION_C_EVAL "${VERSION_MAJOR} * 10000 + ${VERSION_MINOR} * 100 + ${VERSION_PATCH}" OUTPUT_FORMAT HEXADECIMAL) add_compile_options( - -include ${QMK_KEYBOARD_CONFIG_HS} + -include ${QMK_KEYBOARD_CONFIG_H} ) add_compile_definitions( - QMK_KEYBOARD_H="${QMK_KEYBOARD_HEADER}" - KEYMAP_C="${QMK_KEYBOARD_KEYMAP}" + QMK_KEYBOARD_H="${QMK_KEYBOARD_H}" + KEYMAP_C="${QMK_KEYMAP_C}" MATRIX_ROWS=6 MATRIX_COLS=15 VENDOR_ID=${VENDOR_ID} @@ -165,13 +93,6 @@ add_compile_definitions( PRODUCT="${KEYBOARD_NAME}" ) -add_subdirectory(quantum) -add_subdirectory(platforms) -add_subdirectory(tmk_core/protocol) - -include(features/oled) -include(features/backlight) - if(EXISTS ${QMK_KEYBOARD_FOLDER_ABS}/CMakeLists.txt) add_subdirectory(${QMK_KEYBOARD_FOLDER_ABS}) else() @@ -180,4 +101,11 @@ else() add_qmk_executable(${QMK_KEYBOARD} ${KEYBOARD_SRC}) endif() +add_subdirectory(quantum) +add_subdirectory(platforms) +add_subdirectory(tmk_core/protocol) + +include(features/oled) +include(features/backlight) + endif() \ No newline at end of file diff --git a/cmake/AddKeyboard.cmake b/cmake/AddKeyboard.cmake index b2bc838182..e2b5ce92a1 100644 --- a/cmake/AddKeyboard.cmake +++ b/cmake/AddKeyboard.cmake @@ -1,5 +1,6 @@ include(ResolveKeyboard) include(ValidateJSON) +include(ResolveToolchain) macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) # not entirely sure why this is necessary @@ -41,51 +42,34 @@ macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) validate_json(${KEYBOARD_FOLDER_ABS}/info.json keyboard JSON_STRING) string(JSON PROCESSOR GET ${JSON_STRING} processor) - if(${PROCESSOR} MATCHES "^at.*") - set(PLATFORM "avr") - set(TOOLCHAIN "avr") - include(FindAVRToolchain) - find_avr_toolchain() - elseif( - ${PROCESSOR} MATCHES "^STM.*" OR - ${PROCESSOR} MATCHES "^WB32.*" OR - ${PROCESSOR} MATCHES "^MK.*" OR - ${PROCESSOR} MATCHES "RP2040" OR - ${PROCESSOR} MATCHES "^GD32.*") - set(PLATFORM "chibios") - set(TOOLCHAIN "arm-none-eabi") - include(FindARMToolchain) - find_arm_toolchain() - endif() - if(NOT DEFINED PLATFORM) - message(FATAL_ERROR "Could not find platform for ${KEYBOARD_FOLDER}") - endif() + resolve_toolchain(${PROCESSOR} TOOLCHAIN) + string(JSON KEYBOARD_NAME GET ${JSON_STRING} keyboard_name) if(${IS_KEYBOARD_FOLDER_RELATIVE}) - string(MAKE_C_IDENTIFIER ${KEYBOARD_FOLDER} KEYBOARD_NAME) + string(MAKE_C_IDENTIFIER ${KEYBOARD_FOLDER} KEYBOARD_SLUG) else() - string(JSON KEYBOARD_NAME GET ${JSON_STRING} keyboard_name) - string(MAKE_C_IDENTIFIER ${KEYBOARD_NAME} KEYBOARD_NAME) + string(MAKE_C_IDENTIFIER ${KEYBOARD_NAME} KEYBOARD_SLUG) endif() + string(JSON MANUFACTURER GET ${JSON_STRING} manufacturer) - ExternalProject_Add(${KEYBOARD_NAME}_${KEYMAP_NAME} + ExternalProject_Add(${KEYBOARD_SLUG}_${KEYMAP_NAME} SOURCE_DIR ${CMAKE_SOURCE_DIR} - PREFIX ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER} + # PREFIX ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER} TMP_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/tmp DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Download BINARY_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Build STAMP_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Stamp LOG_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Log INSTALL_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Install - INSTALL_COMMAND cmake -E echo "No install needed" + INSTALL_COMMAND ${CMAKE_COMMAND} -E echo "nothing to install" #copy ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Build/* ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Install/ # this seems to work well for all systems so far - not sure if it'd be useful to customize CMAKE_GENERATOR "Unix Makefiles" CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_SOURCE_DIR}/cmake/toolchains/${TOOLCHAIN}.cmake - -DTOOLCHAIN_ROOT=${TOOLCHAIN_ROOT} - -DMAKE_ROOT=${MAKE_ROOT} - -DQMK_KEYBOARD=${KEYBOARD_NAME} + -DQMK_KEYBOARD=${KEYBOARD_SLUG} -DQMK_KEYBOARD_FOLDER=${KEYBOARD_FOLDER} -DQMK_KEYMAP_FOLDER=${KEYMAP_FOLDER} ) + +file(APPEND "${CMAKE_SOURCE_DIR}/build/targets" "${KEYBOARD_SLUG}_${KEYMAP_NAME}|${KEYBOARD_NAME}|${MANUFACTURER}|${KEYBOARD_FOLDER}\n") endmacro(add_keyboard) \ No newline at end of file diff --git a/cmake/FindARMToolchain.cmake b/cmake/FindARMToolchain.cmake index 76e1e86f20..d0426eb5c8 100644 --- a/cmake/FindARMToolchain.cmake +++ b/cmake/FindARMToolchain.cmake @@ -1,63 +1,15 @@ -macro(find_gcc TRIPLE) -if(UNIX) - set(OS_SUFFIX "") - find_path(ARM_TOOLCHAIN_ROOT - NAMES - ${TRIPLE}-gcc${OS_SUFFIX} - PATHS - "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc/avr-gcc-12.1.0-x64-linux/bin/" - /usr/bin/ - /usr/local/bin - /bin/ - $ENV{AVR_ROOT} - ) - find_path(MAKE_ROOT - NAMES - make${OS_SUFFIX} - PATHS - "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-linux/bin/" - /usr/bin/ - /usr/local/bin - /bin/ - $ENV{AVR_ROOT} - ) -elseif(WIN32) - set(OS_SUFFIX ".exe") - find_path(ARM_TOOLCHAIN_ROOT - NAMES - ${TRIPLE}-gcc${OS_SUFFIX} - PATHS - "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin" - "${CMAKE_SOURCE_DIR}/toolchains/gcc-arm-none-eabi-10.3-2021.10/bin/" - "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" - $ENV{AVR_ROOT} - ) - find_path(MAKE_ROOT - NAMES - make${OS_SUFFIX} - PATHS - "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin/" - "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" - $ENV{AVR_ROOT} - ) -else(UNIX) - message(FATAL_ERROR "toolchain not supported on this OS") -endif(UNIX) -endmacro(find_gcc) - macro(find_arm_toolchain) - find_gcc(arm-none-eabi) + find_toolchain(arm-none-eabi TOOLCHAIN_ROOT MAKE_ROOT) - if(NOT ARM_TOOLCHAIN_ROOT) + if(NOT TOOLCHAIN_ROOT) include(GetARMToolchain) - find_gcc(arm-none-eabi) + find_toolchain(arm-none-eabi TOOLCHAIN_ROOT MAKE_ROOT) endif() - if(NOT ARM_TOOLCHAIN_ROOT) + if(NOT TOOLCHAIN_ROOT) message(FATAL_ERROR "ARM Toolchain could not be found") endif() - set(TOOLCHAIN_ROOT ${ARM_TOOLCHAIN_ROOT}) - message(STATUS "ARM toolchain found: ${ARM_TOOLCHAIN_ROOT}") + message(STATUS "ARM toolchain found: ${TOOLCHAIN_ROOT}") message(STATUS "Found make: ${MAKE_ROOT}") endmacro() \ No newline at end of file diff --git a/cmake/FindAVRToolchain.cmake b/cmake/FindAVRToolchain.cmake index 3a72b90c30..c671c50d1b 100644 --- a/cmake/FindAVRToolchain.cmake +++ b/cmake/FindAVRToolchain.cmake @@ -1,62 +1,15 @@ -macro(find_gcc TRIPLE) -if(UNIX) - set(OS_SUFFIX "") - find_path(AVR_TOOLCHAIN_ROOT - NAMES - ${TRIPLE}-gcc${OS_SUFFIX} - PATHS - "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc/avr-gcc-12.1.0-x64-linux/bin/" - /usr/bin/ - /usr/local/bin - /bin/ - $ENV{AVR_ROOT} - ) - find_path(MAKE_ROOT - NAMES - make${OS_SUFFIX} - PATHS - "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-linux/bin/" - /usr/bin/ - /usr/local/bin - /bin/ - $ENV{AVR_ROOT} - ) -elseif(WIN32) - set(OS_SUFFIX ".exe") - find_path(AVR_TOOLCHAIN_ROOT - NAMES - ${TRIPLE}-gcc${OS_SUFFIX} - PATHS - "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin" - "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" - $ENV{AVR_ROOT} - ) - find_path(MAKE_ROOT - NAMES - make${OS_SUFFIX} - PATHS - "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin/" - "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" - $ENV{AVR_ROOT} - ) -else(UNIX) - message(FATAL_ERROR "toolchain not supported on this OS") -endif(UNIX) -endmacro(find_gcc) - macro(find_avr_toolchain) - find_gcc(avr) + find_toolchain(avr TOOLCHAIN_ROOT MAKE_ROOT) - if(NOT AVR_TOOLCHAIN_ROOT) + if(NOT TOOLCHAIN_ROOT) include(GetAVRToolchain) - find_gcc(avr) + find_toolchain(avr TOOLCHAIN_ROOT MAKE_ROOT) endif() - if(NOT AVR_TOOLCHAIN_ROOT) + if(NOT TOOLCHAIN_ROOT) message(FATAL_ERROR "AVR Toolchain could not be found") endif() - set(TOOLCHAIN_ROOT ${AVR_TOOLCHAIN_ROOT}) - message(STATUS "AVR toolchain found: ${AVR_TOOLCHAIN_ROOT}") + message(STATUS "AVR toolchain found: ${TOOLCHAIN_ROOT}") message(STATUS "Found make: ${MAKE_ROOT}") endmacro() \ No newline at end of file diff --git a/cmake/FindToolchain.cmake b/cmake/FindToolchain.cmake deleted file mode 100644 index ab3279bf18..0000000000 --- a/cmake/FindToolchain.cmake +++ /dev/null @@ -1,66 +0,0 @@ -macro(find_gcc TRIPLE) -if(UNIX) - set(OS_SUFFIX "") - find_path(TOOLCHAIN_ROOT - NAMES - ${TRIPLE}-gcc${OS_SUFFIX} - PATHS - "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc/avr-gcc-12.1.0-x64-linux/bin/" - /usr/bin/ - /usr/local/bin - /bin/ - $ENV{AVR_ROOT} - ) - find_path(MAKE_ROOT - NAMES - make${OS_SUFFIX} - PATHS - "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-linux/bin/" - /usr/bin/ - /usr/local/bin - /bin/ - $ENV{AVR_ROOT} - ) -elseif(WIN32) - set(OS_SUFFIX ".exe") - find_path(TOOLCHAIN_ROOT - NAMES - ${TRIPLE}-gcc${OS_SUFFIX} - PATHS - "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin" - "${CMAKE_SOURCE_DIR}/toolchains/gcc-arm-none-eabi-10.3-2021.10/bin/" - "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" - $ENV{AVR_ROOT} - ) - find_path(MAKE_ROOT - NAMES - make${OS_SUFFIX} - PATHS - "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin/" - "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" - $ENV{AVR_ROOT} - ) -else(UNIX) - message(FATAL_ERROR "toolchain not supported on this OS") -endif(UNIX) -endmacro(find_gcc) - -macro(find_toolchain TRIPLE) - find_gcc(${TRIPLE}) - - if(NOT TOOLCHAIN_ROOT) - if("${TRIPLE}" STREQUAL "avr") - include(GetAVRToolchain) - else() - include(GetARMToolchain) - endif() - find_gcc(${TRIPLE}) - endif() - - if(NOT TOOLCHAIN_ROOT) - message(FATAL_ERROR "Toolchain could not be found") - endif() - - message("Found toolchain for ${TRIPLE}: ${TOOLCHAIN_ROOT}") - message("Found make: ${MAKE_ROOT}") -endmacro() \ No newline at end of file diff --git a/cmake/Findlufa.cmake b/cmake/Findlufa.cmake index 80f04e24ce..8c9a3511f2 100644 --- a/cmake/Findlufa.cmake +++ b/cmake/Findlufa.cmake @@ -19,5 +19,10 @@ add_library(lufa ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Endpoint_${ARCH}.c ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/EndpointStream_${ARCH}.c ${LUFA_ROOT_PATH}/Drivers/USB/Core/DeviceStandardReq.c + ${LUFA_PATH}/LUFA/Drivers/USB/USB.h ) -target_include_directories(lufa PUBLIC ${LUFA_PATH}) \ No newline at end of file +target_include_directories(lufa PUBLIC ${LUFA_PATH}) + +target_link_libraries(lufa ${QMK_TARGET}) +target_link_libraries(lufa tmk_core_protocol) +target_link_libraries(lufa tmk_core_protocol_lufa) \ No newline at end of file diff --git a/cmake/ResolveKeyboard.cmake b/cmake/ResolveKeyboard.cmake index 66fb25805b..8833fe2046 100644 --- a/cmake/ResolveKeyboard.cmake +++ b/cmake/ResolveKeyboard.cmake @@ -39,4 +39,78 @@ function(resolve_keyboard KEYBOARD KEYBOAD_FOLDER_ABS_STR) message(FATAL_ERROR "Couldn't find") # set(${RESULT_STR} "NOTFOUND" PARENT_SCOPE) endif() +endfunction() + +function(resolve_config_h KEYBOARD_FOLDER_ABS CONFIG_H_STR) + 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") + 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) + else() + message(FATAL_ERROR "Could not find keymap.c in ${KEYMAP_FOLDER}") + 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() + message(FATAL_ERROR "Could not find keymap.c in ${KEYBOARD_FOLDER_ABS}") + else() + if(EXISTS "${KEYBOARD_FOLDER_ABS}/keymap.c") + set(${KEYMAP_C_STR} "${KEYBOARD_FOLDER_ABS}/keymap.c" PARENT_SCOPE) + elseif(EXISTS "${KEYBOARD_FOLDER_ABS}/keymaps/${KEYMAP_FOLDER}/keymap.c") + set(${KEYMAP_C_STR} "${KEYBOARD_FOLDER_ABS}/keymaps/${KEYMAP_FOLDER}/keymap.c" PARENT_SCOPE) + else() + message(FATAL_ERROR "Could not find keymap.c in ${KEYBOARD_FOLDER_ABS}") + endif() + endif() + endif() endfunction() \ No newline at end of file diff --git a/cmake/ResolveToolchain.cmake b/cmake/ResolveToolchain.cmake new file mode 100644 index 0000000000..b71b1770d3 --- /dev/null +++ b/cmake/ResolveToolchain.cmake @@ -0,0 +1,57 @@ +function(resolve_toolchain PROCESSOR TOOLCHAIN_STR) + unset(${TOOLCHAIN_STR} PARENT_SCOPE) + if( + ${PROCESSOR} MATCHES "^at.*" + ) + set(${TOOLCHAIN_STR} "avr" PARENT_SCOPE) + include(FindAVRToolchain) + find_avr_toolchain() + elseif( + ${PROCESSOR} MATCHES "^STM.*" OR + ${PROCESSOR} MATCHES "^WB32.*" OR + ${PROCESSOR} MATCHES "^MK.*" OR + ${PROCESSOR} MATCHES "RP2040" OR + ${PROCESSOR} MATCHES "^GD32.*" + ) + set(${TOOLCHAIN_STR} "arm-none-eabi" PARENT_SCOPE) + include(FindARMToolchain) + find_arm_toolchain() + elseif( + ${PROCESSOR} MATCHES "risc-v" + ) + set(${TOOLCHAIN_STR} "riscv32-unknown-elf" PARENT_SCOPE) + else() + message(FATAL_ERROR "Could not find toolchain for ${PROCESSOR}") + endif() +endfunction() + +function(find_toolchain TOOLCHAIN TOOLCHAIN_ROOT_STR) + unset(${TOOLCHAIN_STR} PARENT_SCOPE) + if(UNIX) + set(OS_SUFFIX "") + find_path(TOOLCHAIN_ROOT + NAMES + ${TOOLCHAIN}-gcc${OS_SUFFIX} + PATHS + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc/avr-gcc-12.1.0-x64-linux/bin/" + "${CMAKE_SOURCE_DIR}/toolchains/gcc-arm-none-eabi-10.3-2021.10/bin/" + /usr/bin/ + /usr/local/bin + /bin/ + $ENV{AVR_ROOT} + ) + elseif(WIN32) + set(OS_SUFFIX ".exe") + find_path(TOOLCHAIN_ROOT + NAMES + ${TOOLCHAIN}-gcc${OS_SUFFIX} + PATHS + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin" + "${CMAKE_SOURCE_DIR}/toolchains/gcc-arm-none-eabi-10.3-2021.10/bin/" + $ENV{AVR_ROOT} + ) + else() + message(FATAL_ERROR "Unsure how to handle this OS") + endif(UNIX) + set(${TOOLCHAIN_ROOT_STR} ${TOOLCHAIN_ROOT} PARENT_SCOPE) +endfunction(find_toolchain) \ No newline at end of file diff --git a/cmake/features/backlight.cmake b/cmake/features/backlight.cmake index 25f903309a..9f6af2a773 100644 --- a/cmake/features/backlight.cmake +++ b/cmake/features/backlight.cmake @@ -23,6 +23,9 @@ if(${BACKLIGHT_ENABLE} AND NOT ${NO_BACKLIGHT_PIN} STREQUAL "backlight-NOTFOUND" endif() endif() target_include_directories(backlight PUBLIC quantum/backlight) - target_include_directories(quantum PUBLIC quantum/backlight) - target_link_libraries(backlight PUBLIC quantum) + target_include_directories(backlight PUBLIC drivers/oled) + # target_include_directories(backlight PUBLIC quantum/backlight) + # target_include_directories(quantum PUBLIC quantum/backlight) + target_link_libraries(backlight ${QMK_TARGET}) + target_link_libraries(backlight quantum) endif() diff --git a/cmake/features/oled.cmake b/cmake/features/oled.cmake index f2bc0e8a3a..90e0fd9ff1 100644 --- a/cmake/features/oled.cmake +++ b/cmake/features/oled.cmake @@ -5,9 +5,8 @@ if(${OLED_ENABLE}) platforms/${QMK_PLATFORM}/drivers/i2c_master.c) add_compile_definitions(OLED_ENABLE) target_include_directories(oled PUBLIC drivers) - target_include_directories(quantum PUBLIC drivers/oled) target_include_directories(oled PUBLIC drivers/oled) target_include_directories(oled PUBLIC platforms/${QMK_PLATFORM}/drivers) - target_link_libraries(oled PUBLIC quantum) - target_link_libraries(oled PUBLIC platform_avr) + target_link_libraries(oled ${QMK_TARGET}) + target_link_libraries(oled platforms) endif() diff --git a/cmake/toolchains/arm-none-eabi.cmake b/cmake/toolchains/arm-none-eabi.cmake index ecbf475460..cb8333db35 100644 --- a/cmake/toolchains/arm-none-eabi.cmake +++ b/cmake/toolchains/arm-none-eabi.cmake @@ -1,4 +1,6 @@ -set(TRIPLE "arm-none-eabi") +include(ResolveToolchain) + +set(QMK_TOOLCHAIN "arm-none-eabi") set(QMK_PLATFORM "chibios") set(QMK_PROTOCOL "chibios") @@ -7,25 +9,33 @@ if(UNIX) elseif(WIN32) set(OS_SUFFIX ".exe") endif() -# include(FindARMToolchain) -# find_arm_toolchain() + +find_toolchain(arm-none-eabi TOOLCHAIN_ROOT) set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_CROSS_COMPILING 1) -set(CMAKE_MAKE_PROGRAM "${MAKE_ROOT}/make${OS_SUFFIX}" CACHE PATH "make" FORCE) -set(CMAKE_C_COMPILER "${TOOLCHAIN_ROOT}/${TRIPLE}-gcc${OS_SUFFIX}" CACHE PATH "gcc" FORCE) -set(CMAKE_CXX_COMPILER "${TOOLCHAIN_ROOT}/${TRIPLE}-g++${OS_SUFFIX}" CACHE PATH "g++" FORCE) -set(CMAKE_AR "${TOOLCHAIN_ROOT}/${TRIPLE}-ar${OS_SUFFIX}" CACHE PATH "ar" FORCE) -set(CMAKE_AS "${TOOLCHAIN_ROOT}/${TRIPLE}-as${OS_SUFFIX}" CACHE PATH "as" FORCE) -set(CMAKE_LINKER "${TOOLCHAIN_ROOT}/${TRIPLE}-ld${OS_SUFFIX}" CACHE PATH "linker" FORCE) -set(CMAKE_NM "${TOOLCHAIN_ROOT}/${TRIPLE}-nm${OS_SUFFIX}" CACHE PATH "nm" FORCE) -set(CMAKE_OBJCOPY "${TOOLCHAIN_ROOT}/${TRIPLE}-objcopy${OS_SUFFIX}" CACHE PATH "objcopy" FORCE) -set(CMAKE_OBJDUMP "${TOOLCHAIN_ROOT}/${TRIPLE}-objdump${OS_SUFFIX}" CACHE PATH "objdump" FORCE) -set(CMAKE_STRIP "${TOOLCHAIN_ROOT}/${TRIPLE}-strip${OS_SUFFIX}" CACHE PATH "strip" FORCE) -set(CMAKE_RANLIB "${TOOLCHAIN_ROOT}/${TRIPLE}-ranlib${OS_SUFFIX}" CACHE PATH "ranlib" FORCE) -set(AVR_SIZE "${TOOLCHAIN_ROOT}/${TRIPLE}-size${OS_SUFFIX}" CACHE PATH "size" FORCE) +set(CMAKE_C_COMPILER "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-gcc${OS_SUFFIX}" CACHE PATH "gcc" FORCE) +set(CMAKE_CXX_COMPILER "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-g++${OS_SUFFIX}" CACHE PATH "g++" FORCE) +set(CMAKE_AR "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-ar${OS_SUFFIX}" CACHE PATH "ar" FORCE) +set(CMAKE_AS "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-as${OS_SUFFIX}" CACHE PATH "as" FORCE) +set(CMAKE_LINKER "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-ld${OS_SUFFIX}" CACHE PATH "linker" FORCE) +set(CMAKE_NM "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-nm${OS_SUFFIX}" CACHE PATH "nm" FORCE) +set(CMAKE_OBJCOPY "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-objcopy${OS_SUFFIX}" CACHE PATH "objcopy" FORCE) +set(CMAKE_OBJDUMP "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-objdump${OS_SUFFIX}" CACHE PATH "objdump" FORCE) +set(CMAKE_STRIP "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-strip${OS_SUFFIX}" CACHE PATH "strip" FORCE) +set(CMAKE_RANLIB "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-ranlib${OS_SUFFIX}" CACHE PATH "ranlib" FORCE) +set(AVR_SIZE "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-size${OS_SUFFIX}" CACHE PATH "size" FORCE) + +find_program(CMAKE_MAKE_PROGRAM NAME make + PATHS + $<$:"${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin/"> + $<$UNIX>:"${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-linux/bin/"> + /usr/bin/ + /usr/local/bin + /bin/ +) add_compile_options( $<$:-std=gnu11> diff --git a/cmake/toolchains/avr.cmake b/cmake/toolchains/avr.cmake index c429b835a3..10c507ac45 100644 --- a/cmake/toolchains/avr.cmake +++ b/cmake/toolchains/avr.cmake @@ -4,7 +4,9 @@ # @author Natesh Narain # @since Feb 06 2016 -set(TRIPLE "avr") +include(ResolveToolchain) + +set(QMK_TOOLCHAIN "avr") set(QMK_PLATFORM "avr") set(QMK_PROTOCOL "lufa") @@ -13,8 +15,8 @@ if(UNIX) elseif(WIN32) set(OS_SUFFIX ".exe") endif() -# include(FindAVRToolchain) -# find_avr_toolchain() + +find_toolchain(avr TOOLCHAIN_ROOT) # setup the AVR compiler variables @@ -22,18 +24,17 @@ set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR avr) set(CMAKE_CROSS_COMPILING 1) -set(CMAKE_MAKE_PROGRAM "${MAKE_ROOT}/make${OS_SUFFIX}" CACHE PATH "make" FORCE) -set(CMAKE_C_COMPILER "${TOOLCHAIN_ROOT}/${TRIPLE}-gcc${OS_SUFFIX}" CACHE PATH "gcc" FORCE) -set(CMAKE_CXX_COMPILER "${TOOLCHAIN_ROOT}/${TRIPLE}-g++${OS_SUFFIX}" CACHE PATH "g++" FORCE) -set(CMAKE_AR "${TOOLCHAIN_ROOT}/${TRIPLE}-ar${OS_SUFFIX}" CACHE PATH "ar" FORCE) -set(CMAKE_AS "${TOOLCHAIN_ROOT}/${TRIPLE}-as${OS_SUFFIX}" CACHE PATH "as" FORCE) -set(CMAKE_LINKER "${TOOLCHAIN_ROOT}/${TRIPLE}-ld${OS_SUFFIX}" CACHE PATH "linker" FORCE) -set(CMAKE_NM "${TOOLCHAIN_ROOT}/${TRIPLE}-nm${OS_SUFFIX}" CACHE PATH "nm" FORCE) -set(CMAKE_OBJCOPY "${TOOLCHAIN_ROOT}/${TRIPLE}-objcopy${OS_SUFFIX}" CACHE PATH "objcopy" FORCE) -set(CMAKE_OBJDUMP "${TOOLCHAIN_ROOT}/${TRIPLE}-objdump${OS_SUFFIX}" CACHE PATH "objdump" FORCE) -set(CMAKE_STRIP "${TOOLCHAIN_ROOT}/${TRIPLE}-strip${OS_SUFFIX}" CACHE PATH "strip" FORCE) -set(CMAKE_RANLIB "${TOOLCHAIN_ROOT}/${TRIPLE}-ranlib${OS_SUFFIX}" CACHE PATH "ranlib" FORCE) -set(AVR_SIZE "${TOOLCHAIN_ROOT}/${TRIPLE}-size${OS_SUFFIX}" CACHE PATH "size" FORCE) +set(CMAKE_C_COMPILER "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-gcc${OS_SUFFIX}" CACHE PATH "gcc" FORCE) +set(CMAKE_CXX_COMPILER "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-g++${OS_SUFFIX}" CACHE PATH "g++" FORCE) +set(CMAKE_AR "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-ar${OS_SUFFIX}" CACHE PATH "ar" FORCE) +set(CMAKE_AS "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-as${OS_SUFFIX}" CACHE PATH "as" FORCE) +set(CMAKE_LINKER "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-ld${OS_SUFFIX}" CACHE PATH "linker" FORCE) +set(CMAKE_NM "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-nm${OS_SUFFIX}" CACHE PATH "nm" FORCE) +set(CMAKE_OBJCOPY "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-objcopy${OS_SUFFIX}" CACHE PATH "objcopy" FORCE) +set(CMAKE_OBJDUMP "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-objdump${OS_SUFFIX}" CACHE PATH "objdump" FORCE) +set(CMAKE_STRIP "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-strip${OS_SUFFIX}" CACHE PATH "strip" FORCE) +set(CMAKE_RANLIB "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-ranlib${OS_SUFFIX}" CACHE PATH "ranlib" FORCE) +set(AVR_SIZE "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-size${OS_SUFFIX}" CACHE PATH "size" FORCE) # set(CMAKE_EXE_LINKER_FLAGS "-L /usr/lib/gcc/avr/4.8.2") @@ -46,6 +47,15 @@ find_program(AVR_UPLOAD $ENV{AVR_ROOT} ) +find_program(CMAKE_MAKE_PROGRAM NAME make + PATHS + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin/" + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-linux/bin/" + /usr/bin/ + /usr/local/bin + /bin/ +) + # setup the avr exectable macro # set(AVR_LINKER_LIBS "-lc -lm -lgcc -Wl,-lprintf_flt -Wl,-u,vfprintf") @@ -53,8 +63,8 @@ find_program(AVR_UPLOAD add_compile_options( $<$:-std=gnu11> $<$:-std=gnu++14> - -flto - # -mrelax + # -flto + -mrelax -Os -Wall -Wstrict-prototypes @@ -78,7 +88,7 @@ add_compile_definitions( F_CPU=16000000 F_USB=16000000UL __AVR_ATmega32U4__ - LTO_ENABLE + # LTO_ENABLE ) add_link_options( @@ -89,87 +99,63 @@ add_link_options( macro(add_qmk_executable target_name) - # add_subdirectory(${CMAKE_SOURCE_DIR}/platforms/avr platforms/avr) - # add_subdirectory(${CMAKE_SOURCE_DIR}/tmk_core/protocol/lufa tmk_core/protocol/lufa) - - set(elf_file ${target_name}-${QMK_MCU}.elf) + set(QMK_TARGET ${target_name}-${QMK_MCU}.elf) set(map_file ${target_name}-${QMK_MCU}.map) set(hex_file ${target_name}-${QMK_MCU}.hex) set(lst_file ${target_name}-${QMK_MCU}.lst) - add_link_options(-Wl,-Map=${map_file}) + add_compile_options( + -mmcu=${QMK_MCU} + ) + + add_link_options( + -mmcu=${QMK_MCU} + -Wl,-Map=${map_file} + ) # create elf file - add_executable(${elf_file} - ${ARGN} - ) + add_executable(${QMK_TARGET} ${ARGN}) - target_link_libraries(${elf_file} - PUBLIC - quantum - tmk_core_protocol - tmk_core_protocol_lufa - platforms - platforms_avr - ) - - # set_target_properties( - # ${elf_file} + target_link_libraries(${QMK_TARGET} quantum) + # set_target_properties(${QMK_TARGET} # PROPERTIES - # COMPILE_FLAGS "-mmcu=${QMK_MCU} -g -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics" - # LINK_FLAGS "-mmcu=${QMK_MCU} -Wl,-Map,${map_file}" + # COMPILE_FLAGS "-mmcu=${QMK_MCU} ${COMPILE_OPTIONS}" + # LINK_FLAGS "-mmcu=${QMK_MCU} ${LINK_OPTIONS}" # ) # generate the lst file add_custom_command( OUTPUT ${lst_file} - - COMMAND - ${CMAKE_OBJDUMP} -h -S ${elf_file} > ${lst_file} - - DEPENDS ${elf_file} + COMMAND ${CMAKE_OBJDUMP} -h -S ${QMK_TARGET} > ${lst_file} + DEPENDS ${QMK_TARGET} ) # create hex file add_custom_command( OUTPUT ${hex_file} - - COMMAND - ${CMAKE_OBJCOPY} -j .text -j .data -O ihex ${elf_file} ${hex_file} - - DEPENDS ${elf_file} + COMMAND ${CMAKE_OBJCOPY} -j .text -j .data -O ihex ${QMK_TARGET} ${hex_file} + DEPENDS ${QMK_TARGET} ) add_custom_command( - OUTPUT "print-size-${elf_file}" - - COMMAND - ${AVR_SIZE} ${elf_file} - - DEPENDS ${elf_file} + OUTPUT "print-size-${QMK_TARGET}" + COMMAND ${AVR_SIZE} ${QMK_TARGET} + DEPENDS ${QMK_TARGET} ) add_custom_command( OUTPUT "print-size-${hex_file}" - - COMMAND - ${AVR_SIZE} ${hex_file} - + COMMAND ${AVR_SIZE} ${hex_file} DEPENDS ${hex_file} ) # build the intel hex file for the device - add_custom_target( - ${target_name} - ALL - DEPENDS ${hex_file} ${lst_file} "print-size-${elf_file}" "print-size-${hex_file}" + add_custom_target(${target_name} ALL + DEPENDS ${hex_file} ${lst_file} "print-size-${QMK_TARGET}" "print-size-${hex_file}" ) - set_target_properties( - ${target_name} - - PROPERTIES - OUTPUT_NAME ${elf_file} + set_target_properties(${target_name} + PROPERTIES OUTPUT_NAME ${QMK_TARGET} ) endmacro(add_qmk_executable) diff --git a/keyboards/CMakeLists.txt b/keyboards/CMakeLists.txt index b1c78db466..27703b7b6d 100644 --- a/keyboards/CMakeLists.txt +++ b/keyboards/CMakeLists.txt @@ -1,5 +1,7 @@ include(ExternalProject) include(AddKeyboard) + +file(WRITE "${CMAKE_SOURCE_DIR}/build/targets" "") if(DEFINED QMK_KEYBOARD_FOLDER) if(NOT DEFINED QMK_KEYMAP_FOLDER) diff --git a/platforms/CMakeLists.txt b/platforms/CMakeLists.txt index 5696c8b2db..52281a277a 100644 --- a/platforms/CMakeLists.txt +++ b/platforms/CMakeLists.txt @@ -1,5 +1,6 @@ add_library(platforms suspend.c synchronization_util.c timer.c) target_include_directories(platforms PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(platforms PUBLIC quantum) +target_link_libraries(platforms ${QMK_TARGET}) +target_link_libraries(platforms quantum) add_subdirectory(${QMK_PLATFORM}) \ No newline at end of file diff --git a/platforms/avr/CMakeLists.txt b/platforms/avr/CMakeLists.txt index 5b9f6c3b69..06a212d938 100644 --- a/platforms/avr/CMakeLists.txt +++ b/platforms/avr/CMakeLists.txt @@ -1,9 +1,9 @@ -add_compile_options( - -mmcu=${QMK_MCU} -) -add_link_options( - -mmcu=${QMK_MCU} -) +# add_compile_options( +# -mmcu=${QMK_MCU} +# ) +# add_link_options( +# -mmcu=${QMK_MCU} +# ) add_library(platforms_avr hardware_id.c platform.c @@ -11,6 +11,9 @@ add_library(platforms_avr timer.c printf.c bootloaders/bootloadhid.c + xprintf.S ) target_include_directories(platforms_avr PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(platforms_avr PUBLIC platforms quantum) \ No newline at end of file + +target_link_libraries(platforms_avr ${QMK_TARGET}) +target_link_libraries(platforms_avr quantum) \ No newline at end of file diff --git a/platforms/chibios/CMakeLists.txt b/platforms/chibios/CMakeLists.txt index 135c6cee8e..ecd20b0fcc 100644 --- a/platforms/chibios/CMakeLists.txt +++ b/platforms/chibios/CMakeLists.txt @@ -1,3 +1,6 @@ add_link_options( -mcpu=${QMK_MCU} -) \ No newline at end of file +) +add_library(platforms_chibios) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(platforms_chibios ${QMK_TARGET}) \ No newline at end of file diff --git a/quantum/CMakeLists.txt b/quantum/CMakeLists.txt index 7321e7003e..8190e0d0a0 100644 --- a/quantum/CMakeLists.txt +++ b/quantum/CMakeLists.txt @@ -20,6 +20,7 @@ add_library(quantum debounce/sym_defer_g.c bootmagic/magic.c ) + target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/logging) target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/keymap_extras) @@ -27,11 +28,11 @@ target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/process_ke target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/sequencer) target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bootmagic) -target_link_libraries(quantum PUBLIC platforms) -if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "avr") - target_link_libraries(quantum PUBLIC platforms_avr) -endif() -target_link_libraries(quantum PUBLIC tmk_core_protocol) +target_link_libraries(quantum ${QMK_TARGET}) +target_link_libraries(quantum platforms) +target_link_libraries(quantum platforms_${QMK_PLATFORM}) +target_link_libraries(quantum tmk_core_protocol) +target_link_libraries(quantum tmk_core_protocol_${QMK_PROTOCOL}) # if no printf # target_sources(quantum PRIVATE ${CMAKE_SOURCE_DIR}/lib/printf/src/printf/printf.c) diff --git a/tmk_core/protocol/CMakeLists.txt b/tmk_core/protocol/CMakeLists.txt index c2cf43e815..a56ed30222 100644 --- a/tmk_core/protocol/CMakeLists.txt +++ b/tmk_core/protocol/CMakeLists.txt @@ -10,6 +10,9 @@ add_compile_definitions( # NKRO_ENABLE ) target_include_directories(tmk_core_protocol PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(tmk_core_protocol PUBLIC quantum) +target_link_libraries(tmk_core_protocol ${QMK_TARGET}) +target_link_libraries(tmk_core_protocol quantum) +target_link_libraries(tmk_core_protocol tmk_core_protocol_${QMK_PROTOCOL}) +target_link_libraries(tmk_core_protocol platforms_${QMK_PLATFORM}) add_subdirectory(${QMK_PROTOCOL}) \ No newline at end of file diff --git a/tmk_core/protocol/lufa/CMakeLists.txt b/tmk_core/protocol/lufa/CMakeLists.txt index 84b67e8353..55b13ed1d9 100644 --- a/tmk_core/protocol/lufa/CMakeLists.txt +++ b/tmk_core/protocol/lufa/CMakeLists.txt @@ -23,5 +23,9 @@ find_package(lufa REQUIRED) target_include_directories(tmk_core_protocol_lufa PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(tmk_core_protocol_lufa PUBLIC lufa) -target_link_libraries(tmk_core_protocol_lufa PUBLIC quantum) \ No newline at end of file +target_link_libraries(tmk_core_protocol_lufa ${QMK_TARGET}) +target_link_libraries(tmk_core_protocol_lufa quantum) +target_link_libraries(tmk_core_protocol_lufa tmk_core_protocol) +target_link_libraries(tmk_core_protocol_lufa lufa) +target_link_libraries(tmk_core_protocol_lufa platforms) +target_link_libraries(tmk_core_protocol_lufa platforms_${QMK_PLATFORM}) \ No newline at end of file From 6a960cbf058a1641bbf68c6db19c2b453071a626 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 4 Apr 2023 12:29:01 -0400 Subject: [PATCH 15/26] move to single lib --- CMakeLists.txt | 2 ++ cmake/Findlufa.cmake | 7 ++++--- cmake/features/backlight.cmake | 9 +++++---- cmake/features/oled.cmake | 5 +++-- cmake/toolchains/avr.cmake | 2 +- platforms/CMakeLists.txt | 8 ++++---- platforms/avr/CMakeLists.txt | 8 ++++---- platforms/chibios/CMakeLists.txt | 6 +++--- quantum/CMakeLists.txt | 24 ++++++++++++------------ tmk_core/protocol/CMakeLists.txt | 12 ++++++------ tmk_core/protocol/lufa/CMakeLists.txt | 19 ++++++++++--------- 11 files changed, 54 insertions(+), 48 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cfdd4a4cf2..446abc7385 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -101,6 +101,8 @@ else() add_qmk_executable(${QMK_KEYBOARD} ${KEYBOARD_SRC}) endif() +add_library(qmk) + add_subdirectory(quantum) add_subdirectory(platforms) add_subdirectory(tmk_core/protocol) diff --git a/cmake/Findlufa.cmake b/cmake/Findlufa.cmake index 8c9a3511f2..c613763594 100644 --- a/cmake/Findlufa.cmake +++ b/cmake/Findlufa.cmake @@ -23,6 +23,7 @@ add_library(lufa ) target_include_directories(lufa PUBLIC ${LUFA_PATH}) -target_link_libraries(lufa ${QMK_TARGET}) -target_link_libraries(lufa tmk_core_protocol) -target_link_libraries(lufa tmk_core_protocol_lufa) \ No newline at end of file +# target_link_libraries(lufa qmk) +# target_link_libraries(lufa ${QMK_TARGET}) +# target_link_libraries(lufa tmk_core_protocol) +# target_link_libraries(lufa tmk_core_protocol_lufa) \ No newline at end of file diff --git a/cmake/features/backlight.cmake b/cmake/features/backlight.cmake index 9f6af2a773..5eed18fbb9 100644 --- a/cmake/features/backlight.cmake +++ b/cmake/features/backlight.cmake @@ -22,10 +22,11 @@ if(${BACKLIGHT_ENABLE} AND NOT ${NO_BACKLIGHT_PIN} STREQUAL "backlight-NOTFOUND" target_sources(backlight PRIVATE quantum/backlight/backlight_${BACKLIGHT_DRIVER}.c) endif() endif() - target_include_directories(backlight PUBLIC quantum/backlight) - target_include_directories(backlight PUBLIC drivers/oled) + target_include_directories(qmk PUBLIC quantum/backlight) + target_include_directories(qmk PUBLIC drivers/oled) + target_link_libraries(backlight qmk) # target_include_directories(backlight PUBLIC quantum/backlight) # target_include_directories(quantum PUBLIC quantum/backlight) - target_link_libraries(backlight ${QMK_TARGET}) - target_link_libraries(backlight quantum) + # target_link_libraries(backlight ${QMK_TARGET}) + # target_link_libraries(backlight quantum) endif() diff --git a/cmake/features/oled.cmake b/cmake/features/oled.cmake index 90e0fd9ff1..19b7ef2649 100644 --- a/cmake/features/oled.cmake +++ b/cmake/features/oled.cmake @@ -7,6 +7,7 @@ if(${OLED_ENABLE}) target_include_directories(oled PUBLIC drivers) target_include_directories(oled PUBLIC drivers/oled) target_include_directories(oled PUBLIC platforms/${QMK_PLATFORM}/drivers) - target_link_libraries(oled ${QMK_TARGET}) - target_link_libraries(oled platforms) + target_link_libraries(oled qmk) + # target_link_libraries(oled ${QMK_TARGET}) + # target_link_libraries(oled platforms) endif() diff --git a/cmake/toolchains/avr.cmake b/cmake/toolchains/avr.cmake index 10c507ac45..eadf1c88db 100644 --- a/cmake/toolchains/avr.cmake +++ b/cmake/toolchains/avr.cmake @@ -116,7 +116,7 @@ macro(add_qmk_executable target_name) # create elf file add_executable(${QMK_TARGET} ${ARGN}) - target_link_libraries(${QMK_TARGET} quantum) + target_link_libraries(${QMK_TARGET} qmk) # set_target_properties(${QMK_TARGET} # PROPERTIES diff --git a/platforms/CMakeLists.txt b/platforms/CMakeLists.txt index 52281a277a..d39d9d45ef 100644 --- a/platforms/CMakeLists.txt +++ b/platforms/CMakeLists.txt @@ -1,6 +1,6 @@ -add_library(platforms suspend.c synchronization_util.c timer.c) -target_include_directories(platforms PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(platforms ${QMK_TARGET}) -target_link_libraries(platforms quantum) +target_sources(qmk PUBLIC suspend.c synchronization_util.c timer.c) +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +# target_link_libraries(platforms ${QMK_TARGET}) +# target_link_libraries(platforms quantum) add_subdirectory(${QMK_PLATFORM}) \ No newline at end of file diff --git a/platforms/avr/CMakeLists.txt b/platforms/avr/CMakeLists.txt index 06a212d938..5556923a06 100644 --- a/platforms/avr/CMakeLists.txt +++ b/platforms/avr/CMakeLists.txt @@ -4,7 +4,7 @@ # add_link_options( # -mmcu=${QMK_MCU} # ) -add_library(platforms_avr +target_sources(qmk PUBLIC hardware_id.c platform.c suspend.c @@ -13,7 +13,7 @@ add_library(platforms_avr bootloaders/bootloadhid.c xprintf.S ) -target_include_directories(platforms_avr PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(platforms_avr ${QMK_TARGET}) -target_link_libraries(platforms_avr quantum) \ No newline at end of file +# target_link_libraries(platforms_avr ${QMK_TARGET}) +# target_link_libraries(platforms_avr quantum) \ No newline at end of file diff --git a/platforms/chibios/CMakeLists.txt b/platforms/chibios/CMakeLists.txt index ecd20b0fcc..622e2a5678 100644 --- a/platforms/chibios/CMakeLists.txt +++ b/platforms/chibios/CMakeLists.txt @@ -1,6 +1,6 @@ add_link_options( -mcpu=${QMK_MCU} ) -add_library(platforms_chibios) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(platforms_chibios ${QMK_TARGET}) \ No newline at end of file +# add_library(platforms_chibios) +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +# target_link_libraries(platforms_chibios ${QMK_TARGET}) \ No newline at end of file diff --git a/quantum/CMakeLists.txt b/quantum/CMakeLists.txt index 8190e0d0a0..736df9073f 100644 --- a/quantum/CMakeLists.txt +++ b/quantum/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(quantum +target_sources(qmk PUBLIC main.c keymap_introspection.c quantum.c @@ -21,18 +21,18 @@ add_library(quantum bootmagic/magic.c ) -target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/logging) -target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/keymap_extras) -target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/process_keycode) -target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/sequencer) -target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bootmagic) +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/logging) +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/keymap_extras) +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/process_keycode) +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/sequencer) +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bootmagic) -target_link_libraries(quantum ${QMK_TARGET}) -target_link_libraries(quantum platforms) -target_link_libraries(quantum platforms_${QMK_PLATFORM}) -target_link_libraries(quantum tmk_core_protocol) -target_link_libraries(quantum tmk_core_protocol_${QMK_PROTOCOL}) +# target_link_libraries(quantum ${QMK_TARGET}) +# target_link_libraries(quantum platforms) +# target_link_libraries(quantum platforms_${QMK_PLATFORM}) +# target_link_libraries(quantum tmk_core_protocol) +# target_link_libraries(quantum tmk_core_protocol_${QMK_PROTOCOL}) # if no printf # target_sources(quantum PRIVATE ${CMAKE_SOURCE_DIR}/lib/printf/src/printf/printf.c) diff --git a/tmk_core/protocol/CMakeLists.txt b/tmk_core/protocol/CMakeLists.txt index a56ed30222..8f04d84c0c 100644 --- a/tmk_core/protocol/CMakeLists.txt +++ b/tmk_core/protocol/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(tmk_core_protocol +target_sources(qmk PUBLIC host.c report.c usb_device_state.c @@ -9,10 +9,10 @@ add_compile_definitions( # EXTRAKEY_ENABLE # NKRO_ENABLE ) -target_include_directories(tmk_core_protocol PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(tmk_core_protocol ${QMK_TARGET}) -target_link_libraries(tmk_core_protocol quantum) -target_link_libraries(tmk_core_protocol tmk_core_protocol_${QMK_PROTOCOL}) -target_link_libraries(tmk_core_protocol platforms_${QMK_PLATFORM}) +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +# target_link_libraries(tmk_core_protocol ${QMK_TARGET}) +# target_link_libraries(tmk_core_protocol quantum) +# target_link_libraries(tmk_core_protocol tmk_core_protocol_${QMK_PROTOCOL}) +# target_link_libraries(tmk_core_protocol platforms_${QMK_PLATFORM}) add_subdirectory(${QMK_PROTOCOL}) \ No newline at end of file diff --git a/tmk_core/protocol/lufa/CMakeLists.txt b/tmk_core/protocol/lufa/CMakeLists.txt index 55b13ed1d9..7b36900f15 100644 --- a/tmk_core/protocol/lufa/CMakeLists.txt +++ b/tmk_core/protocol/lufa/CMakeLists.txt @@ -1,7 +1,7 @@ set(ARCH AVR8) set(USE_STATIC_OPTIONS "(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)") -add_compile_definitions( +target_compile_definitions(qmk PUBLIC PROTOCOL_LUFA ARCH=ARCH_${ARCH} BOARD=BOARD_NONE @@ -13,7 +13,7 @@ add_compile_definitions( FIXED_NUM_CONFIGURATIONS=1 ) -add_library(tmk_core_protocol_lufa +target_sources(qmk PUBLIC lufa.c ../usb_descriptor.c usb_util.c @@ -21,11 +21,12 @@ add_library(tmk_core_protocol_lufa find_package(lufa REQUIRED) -target_include_directories(tmk_core_protocol_lufa PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(qmk lufa) -target_link_libraries(tmk_core_protocol_lufa ${QMK_TARGET}) -target_link_libraries(tmk_core_protocol_lufa quantum) -target_link_libraries(tmk_core_protocol_lufa tmk_core_protocol) -target_link_libraries(tmk_core_protocol_lufa lufa) -target_link_libraries(tmk_core_protocol_lufa platforms) -target_link_libraries(tmk_core_protocol_lufa platforms_${QMK_PLATFORM}) \ No newline at end of file +# target_link_libraries(tmk_core_protocol_lufa ${QMK_TARGET}) +# target_link_libraries(tmk_core_protocol_lufa quantum) +# target_link_libraries(tmk_core_protocol_lufa tmk_core_protocol) +# target_link_libraries(tmk_core_protocol_lufa lufa) +# target_link_libraries(tmk_core_protocol_lufa platforms) +# target_link_libraries(tmk_core_protocol_lufa platforms_${QMK_PLATFORM}) \ No newline at end of file From 060c15f32bc294c5564aa16d95a6a0b02e503551 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 4 Apr 2023 12:46:29 -0400 Subject: [PATCH 16/26] fully compiling with qmk target --- .vscode/tasks.json | 11 ++++++++++- CMakeLists.txt | 2 ++ cmake/ResolveKeyboard.cmake | 13 +++++++++++++ cmake/features/backlight.cmake | 14 +++++++------- cmake/features/oled.cmake | 12 ++++++------ keyboards/CMakeLists.txt | 9 +++++++++ tmk_core/protocol/CMakeLists.txt | 2 +- 7 files changed, 48 insertions(+), 15 deletions(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index f439088ac7..4af654899d 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -16,7 +16,7 @@ { "label": "Load Keyboard", "type": "shell", - "command": "cmake -Bbuild -DQMK_KEYBOARD_FOLDER=${input:keyboard}", + "command": "cmake -Bbuild -DQMK_KEYBOARD_FOLDER=${input:all_keyboards}", "problemMatcher": [] }, { @@ -90,6 +90,15 @@ "description": "Target:", "fieldSeparator": "|" }, + }, + { + "id": "all_keyboards", + "type": "command", + "command": "shellCommand.execute", + "args": { + "command": "type build\\all_keyboards", + "description": "Keyboard:" + }, } ] } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 446abc7385..8a81084f52 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,6 +103,8 @@ endif() add_library(qmk) +resolve_keyboard_includes(${QMK_KEYBOARD_FOLDER_ABS}) + add_subdirectory(quantum) add_subdirectory(platforms) add_subdirectory(tmk_core/protocol) diff --git a/cmake/ResolveKeyboard.cmake b/cmake/ResolveKeyboard.cmake index 8833fe2046..27ca55b7e3 100644 --- a/cmake/ResolveKeyboard.cmake +++ b/cmake/ResolveKeyboard.cmake @@ -113,4 +113,17 @@ function(resolve_keymap_c KEYBOARD_FOLDER_ABS KEYMAP_FOLDER KEYMAP_C_STR) endif() endif() endif() +endfunction() + +function(resolve_keyboard_includes KEYBOARD_FOLDER_ABS) + 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 "") + 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() \ No newline at end of file diff --git a/cmake/features/backlight.cmake b/cmake/features/backlight.cmake index 5eed18fbb9..07c5b53757 100644 --- a/cmake/features/backlight.cmake +++ b/cmake/features/backlight.cmake @@ -4,27 +4,27 @@ set_property(CACHE BACKLIGHT_DRIVER PROPERTY STRINGS pwm timer software custom) string(JSON BACKLIGHT_PIN ERROR_VARIABLE NO_BACKLIGHT_PIN GET ${QMK_KEYBOARD_INFO_JSON_STRING} backlight pin) if(${BACKLIGHT_ENABLE} AND NOT ${NO_BACKLIGHT_PIN} STREQUAL "backlight-NOTFOUND") - add_library(backlight + target_sources(qmk PUBLIC quantum/backlight/backlight.c quantum/process_keycode/process_backlight.c ) - add_compile_definitions( + target_compile_definitions(qmk PUBLIC BACKLIGHT_ENABLE BACKLIGHT_PIN=${BACKLIGHT_PIN} ) if(${BACKLIGHT_DRIVER} STREQUAL "custom") - add_compile_definitions(BACKLIGHT_CUSTOM_DRIVER) + target_compile_definitions(qmk PUBLIC BACKLIGHT_CUSTOM_DRIVER) else() - target_sources(backlight PRIVATE quantum/backlight/backlight_driver_common.c) + target_sources(qmk PUBLIC quantum/backlight/backlight_driver_common.c) if(${BACKLIGHT_DRIVER} STREQUAL "pwm") - target_sources(backlight PRIVATE quantum/backlight/backlight_${QMK_PLATFORM}.c) + target_sources(qmk PUBLIC quantum/backlight/backlight_${QMK_PLATFORM}.c) else() - target_sources(backlight PRIVATE quantum/backlight/backlight_${BACKLIGHT_DRIVER}.c) + target_sources(qmk PUBLIC quantum/backlight/backlight_${BACKLIGHT_DRIVER}.c) endif() endif() target_include_directories(qmk PUBLIC quantum/backlight) target_include_directories(qmk PUBLIC drivers/oled) - target_link_libraries(backlight qmk) + # target_link_libraries(backlight qmk) # target_include_directories(backlight PUBLIC quantum/backlight) # target_include_directories(quantum PUBLIC quantum/backlight) # target_link_libraries(backlight ${QMK_TARGET}) diff --git a/cmake/features/oled.cmake b/cmake/features/oled.cmake index 19b7ef2649..ac7a4b5c58 100644 --- a/cmake/features/oled.cmake +++ b/cmake/features/oled.cmake @@ -1,13 +1,13 @@ option(OLED_ENABLE "" TRUE) if(${OLED_ENABLE}) - add_library(oled + target_sources(qmk PUBLIC drivers/oled/ssd1306_sh1106.c platforms/${QMK_PLATFORM}/drivers/i2c_master.c) - add_compile_definitions(OLED_ENABLE) - target_include_directories(oled PUBLIC drivers) - target_include_directories(oled PUBLIC drivers/oled) - target_include_directories(oled PUBLIC platforms/${QMK_PLATFORM}/drivers) - target_link_libraries(oled qmk) + target_compile_definitions(qmk PUBLIC OLED_ENABLE) + target_include_directories(qmk PUBLIC drivers) + target_include_directories(qmk PUBLIC drivers/oled) + target_include_directories(qmk PUBLIC platforms/${QMK_PLATFORM}/drivers) + # target_link_libraries(oled qmk) # target_link_libraries(oled ${QMK_TARGET}) # target_link_libraries(oled platforms) endif() diff --git a/keyboards/CMakeLists.txt b/keyboards/CMakeLists.txt index 27703b7b6d..77a634b6a4 100644 --- a/keyboards/CMakeLists.txt +++ b/keyboards/CMakeLists.txt @@ -16,4 +16,13 @@ foreach(KEYBOARD_CMAKE ${KEYBOARDS}) get_filename_component(KEYBOARD_FOLDER_ABS "${KEYBOARD_CMAKE}" DIRECTORY) file(RELATIVE_PATH KEYBOARD_FOLDER "${CMAKE_SOURCE_DIR}/keyboards" "${KEYBOARD_FOLDER_ABS}") add_keyboard(${KEYBOARD_FOLDER} "default") +endforeach() + +file(GLOB_RECURSE POSSIBLE_KEYBOARDS **/info.json) + +file(WRITE "${CMAKE_SOURCE_DIR}/build/all_keyboards" "") +foreach(KEYBOARD_INFO ${POSSIBLE_KEYBOARDS}) + get_filename_component(KEYBOARD_FOLDER_ABS "${KEYBOARD_INFO}" DIRECTORY) + file(RELATIVE_PATH KEYBOARD_FOLDER "${CMAKE_SOURCE_DIR}/keyboards" "${KEYBOARD_FOLDER_ABS}") + file(APPEND "${CMAKE_SOURCE_DIR}/build/all_keyboards" "${KEYBOARD_FOLDER}\n") endforeach() \ No newline at end of file diff --git a/tmk_core/protocol/CMakeLists.txt b/tmk_core/protocol/CMakeLists.txt index 8f04d84c0c..8a15ad00cb 100644 --- a/tmk_core/protocol/CMakeLists.txt +++ b/tmk_core/protocol/CMakeLists.txt @@ -4,7 +4,7 @@ target_sources(qmk PUBLIC usb_device_state.c usb_util.c ) -add_compile_definitions( +target_compile_definitions( # MOUSE_ENABLED # EXTRAKEY_ENABLE # NKRO_ENABLE From c9ca9b987548758a46e6da50452cc02bb12a7ced Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 4 Apr 2023 13:42:50 -0400 Subject: [PATCH 17/26] one target one target one target --- CMakeLists.txt | 2 +- cmake/AddKeyboard.cmake | 2 +- cmake/FindARMToolchain.cmake | 5 ++--- cmake/FindAVRToolchain.cmake | 11 ++++++++--- cmake/Findlufa.cmake | 6 ++---- cmake/GetDfuProgrammer.cmake | 22 ++++++++++++++++++++++ cmake/toolchains/avr.cmake | 17 +++++++++++------ tmk_core/protocol/CMakeLists.txt | 4 ++-- tmk_core/protocol/lufa/CMakeLists.txt | 3 ++- 9 files changed, 51 insertions(+), 21 deletions(-) create mode 100644 cmake/GetDfuProgrammer.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 8a81084f52..20cff5cb64 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -101,7 +101,7 @@ else() add_qmk_executable(${QMK_KEYBOARD} ${KEYBOARD_SRC}) endif() -add_library(qmk) +# add_library(qmk) resolve_keyboard_includes(${QMK_KEYBOARD_FOLDER_ABS}) diff --git a/cmake/AddKeyboard.cmake b/cmake/AddKeyboard.cmake index e2b5ce92a1..2ead7499d2 100644 --- a/cmake/AddKeyboard.cmake +++ b/cmake/AddKeyboard.cmake @@ -71,5 +71,5 @@ macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) -DQMK_KEYMAP_FOLDER=${KEYMAP_FOLDER} ) -file(APPEND "${CMAKE_SOURCE_DIR}/build/targets" "${KEYBOARD_SLUG}_${KEYMAP_NAME}|${KEYBOARD_NAME}|${MANUFACTURER}|${KEYBOARD_FOLDER}\n") +file(APPEND "${CMAKE_SOURCE_DIR}/build/targets" "${KEYBOARD_SLUG}_${KEYMAP_NAME}|${KEYBOARD_NAME} with ${KEYMAP_FOLDER}|${KEYBOARD_FOLDER}|Made by: ${MANUFACTURER}\n") endmacro(add_keyboard) \ No newline at end of file diff --git a/cmake/FindARMToolchain.cmake b/cmake/FindARMToolchain.cmake index d0426eb5c8..0078451c43 100644 --- a/cmake/FindARMToolchain.cmake +++ b/cmake/FindARMToolchain.cmake @@ -1,9 +1,9 @@ macro(find_arm_toolchain) - find_toolchain(arm-none-eabi TOOLCHAIN_ROOT MAKE_ROOT) + find_toolchain(arm-none-eabi TOOLCHAIN_ROOT) if(NOT TOOLCHAIN_ROOT) include(GetARMToolchain) - find_toolchain(arm-none-eabi TOOLCHAIN_ROOT MAKE_ROOT) + find_toolchain(arm-none-eabi TOOLCHAIN_ROOT) endif() if(NOT TOOLCHAIN_ROOT) @@ -11,5 +11,4 @@ macro(find_arm_toolchain) endif() message(STATUS "ARM toolchain found: ${TOOLCHAIN_ROOT}") - message(STATUS "Found make: ${MAKE_ROOT}") endmacro() \ No newline at end of file diff --git a/cmake/FindAVRToolchain.cmake b/cmake/FindAVRToolchain.cmake index c671c50d1b..bb207e1555 100644 --- a/cmake/FindAVRToolchain.cmake +++ b/cmake/FindAVRToolchain.cmake @@ -1,9 +1,15 @@ macro(find_avr_toolchain) - find_toolchain(avr TOOLCHAIN_ROOT MAKE_ROOT) + find_toolchain(avr TOOLCHAIN_ROOT) if(NOT TOOLCHAIN_ROOT) include(GetAVRToolchain) - find_toolchain(avr TOOLCHAIN_ROOT MAKE_ROOT) + find_toolchain(avr TOOLCHAIN_ROOT) + endif() + + find_program(DFU_PROGRAMMER NAMES dfu-programmer PATHS ${CMAKE_SOURCE_DIR}/toolchains/dfu-programmer/) + if(${DFU_PROGRAMMER} STREQUAL "DFU_PROGRAMMER-NOTFOUND") + include(GetDfuProgrammer) + find_program(DFU_PROGRAMMER NAMES dfu-programmer PATHS ${CMAKE_SOURCE_DIR}/toolchains/dfu-programmer/) endif() if(NOT TOOLCHAIN_ROOT) @@ -11,5 +17,4 @@ macro(find_avr_toolchain) endif() message(STATUS "AVR toolchain found: ${TOOLCHAIN_ROOT}") - message(STATUS "Found make: ${MAKE_ROOT}") endmacro() \ No newline at end of file diff --git a/cmake/Findlufa.cmake b/cmake/Findlufa.cmake index c613763594..83912123b3 100644 --- a/cmake/Findlufa.cmake +++ b/cmake/Findlufa.cmake @@ -2,7 +2,7 @@ include(UpdateSubmodule) update_submodule(lib/lufa) set(LUFA_PATH ${CMAKE_SOURCE_DIR}/lib/lufa) set(LUFA_ROOT_PATH ${LUFA_PATH}/LUFA) -add_library(lufa +target_sources(qmk PUBLIC ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/USBController_${ARCH}.c ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/USBInterrupt_${ARCH}.c ${LUFA_ROOT_PATH}/Drivers/USB/Core/ConfigDescriptors.c @@ -21,9 +21,7 @@ add_library(lufa ${LUFA_ROOT_PATH}/Drivers/USB/Core/DeviceStandardReq.c ${LUFA_PATH}/LUFA/Drivers/USB/USB.h ) -target_include_directories(lufa PUBLIC ${LUFA_PATH}) - -# target_link_libraries(lufa qmk) +target_include_directories(qmk PUBLIC ${LUFA_PATH}) # target_link_libraries(lufa ${QMK_TARGET}) # target_link_libraries(lufa tmk_core_protocol) # target_link_libraries(lufa tmk_core_protocol_lufa) \ No newline at end of file diff --git a/cmake/GetDfuProgrammer.cmake b/cmake/GetDfuProgrammer.cmake new file mode 100644 index 0000000000..3f1b289e18 --- /dev/null +++ b/cmake/GetDfuProgrammer.cmake @@ -0,0 +1,22 @@ +message("Downloading dfu-programmer") +if(WIN32) +file(DOWNLOAD + https://github.com/dfu-programmer/dfu-programmer/releases/download/v1.0.0/dfu-programmer-x64-1.0.0.7z + ${CMAKE_SOURCE_DIR}/toolchains/downloads/dfu-programmer-x64-1.0.0.7z + SHOW_PROGRESS +) +file(ARCHIVE_EXTRACT + INPUT ${CMAKE_SOURCE_DIR}/toolchains/downloads/dfu-programmer-x64-1.0.0.7z + DESTINATION ${CMAKE_SOURCE_DIR}/toolchains/dfu-programmer/ +) +elseif(UNIX) +file(DOWNLOAD + https://github.com/dfu-programmer/dfu-programmer/releases/download/v1.0.0/dfu-programmer-linux-1.0.0.7z + ${CMAKE_SOURCE_DIR}/toolchains/downloads/dfu-programmer-linux-1.0.0.7z + SHOW_PROGRESS +) +file(ARCHIVE_EXTRACT + INPUT ${CMAKE_SOURCE_DIR}/toolchains/downloads/dfu-programmer-linux-1.0.0.7z + DESTINATION ${CMAKE_SOURCE_DIR}/toolchains/dfu-programmer/ +) +endif() \ No newline at end of file diff --git a/cmake/toolchains/avr.cmake b/cmake/toolchains/avr.cmake index eadf1c88db..9755e3a771 100644 --- a/cmake/toolchains/avr.cmake +++ b/cmake/toolchains/avr.cmake @@ -63,8 +63,8 @@ find_program(CMAKE_MAKE_PROGRAM NAME make add_compile_options( $<$:-std=gnu11> $<$:-std=gnu++14> - # -flto - -mrelax + -flto + # -mrelax -Os -Wall -Wstrict-prototypes @@ -88,7 +88,7 @@ add_compile_definitions( F_CPU=16000000 F_USB=16000000UL __AVR_ATmega32U4__ - # LTO_ENABLE + LTO_ENABLE ) add_link_options( @@ -114,9 +114,13 @@ macro(add_qmk_executable target_name) ) # create elf file - add_executable(${QMK_TARGET} ${ARGN}) + add_executable(qmk ${ARGN}) - target_link_libraries(${QMK_TARGET} qmk) + set_target_properties(qmk + PROPERTIES OUTPUT_NAME ${QMK_TARGET} + ) + + # target_link_libraries(${QMK_TARGET} qmk) # set_target_properties(${QMK_TARGET} # PROPERTIES @@ -134,7 +138,8 @@ macro(add_qmk_executable target_name) # create hex file add_custom_command( OUTPUT ${hex_file} - COMMAND ${CMAKE_OBJCOPY} -j .text -j .data -O ihex ${QMK_TARGET} ${hex_file} + # COMMAND ${CMAKE_OBJCOPY} -j .text -j .data -O ihex ${QMK_TARGET} ${hex_file} + COMMAND ${CMAKE_OBJCOPY} -O ihex -R .eeprom -R .fuse -R .lock -R .signature ${QMK_TARGET} ${hex_file} DEPENDS ${QMK_TARGET} ) diff --git a/tmk_core/protocol/CMakeLists.txt b/tmk_core/protocol/CMakeLists.txt index 8a15ad00cb..86c2afd0dc 100644 --- a/tmk_core/protocol/CMakeLists.txt +++ b/tmk_core/protocol/CMakeLists.txt @@ -4,11 +4,11 @@ target_sources(qmk PUBLIC usb_device_state.c usb_util.c ) -target_compile_definitions( +# target_compile_definitions( # MOUSE_ENABLED # EXTRAKEY_ENABLE # NKRO_ENABLE -) +# ) target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) # target_link_libraries(tmk_core_protocol ${QMK_TARGET}) # target_link_libraries(tmk_core_protocol quantum) diff --git a/tmk_core/protocol/lufa/CMakeLists.txt b/tmk_core/protocol/lufa/CMakeLists.txt index 7b36900f15..690e5a0abb 100644 --- a/tmk_core/protocol/lufa/CMakeLists.txt +++ b/tmk_core/protocol/lufa/CMakeLists.txt @@ -20,9 +20,10 @@ target_sources(qmk PUBLIC ) find_package(lufa REQUIRED) +# target_compile_definitions(lufa PUBLIC ${COMPILE_DEFINITIONS}) target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(qmk lufa) +# target_link_libraries(qmk lufa) # target_link_libraries(tmk_core_protocol_lufa ${QMK_TARGET}) # target_link_libraries(tmk_core_protocol_lufa quantum) From 7093a41c6c3bed5381af510f8aaec0feaa7350e8 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 4 Apr 2023 14:19:52 -0400 Subject: [PATCH 18/26] clean-up --- .vscode/settings.json | 2 +- CMakeLists.txt | 22 +++++------------- cmake/AddKeyboard.cmake | 19 ++++++++-------- cmake/toolchains/avr.cmake | 46 +++++++++++++++++++++----------------- 4 files changed, 43 insertions(+), 46 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 76117e52e0..c81ed8140a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,7 +5,7 @@ // Configure glob patterns for excluding files and folders. "files.exclude": { "**/.build": true, - "**/*.hex": true, + // "**/*.hex": true, "**/*.bin": true, "**/*.uf2": true }, diff --git a/CMakeLists.txt b/CMakeLists.txt index 20cff5cb64..5a0e0b9925 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,10 +8,6 @@ include(ValidateJSON) set(QMK_KEYBOARDS_FOLDER "${CMAKE_SOURCE_DIR}/keyboards") -# early declaration of macro defined in toolchain -# macro(add_qmk_executable _) -# endmacro(add_qmk_executable) - function (_get_all_cmake_targets out_var current_dir) get_property(targets DIRECTORY ${current_dir} PROPERTY BUILDSYSTEM_TARGETS) get_property(subdirs DIRECTORY ${current_dir} PROPERTY SUBDIRECTORIES) @@ -32,12 +28,6 @@ project(qmk_firmware) add_subdirectory(keyboards) -# Run at end of top-level CMakeLists -# _get_all_cmake_targets(all_targets ${CMAKE_SOURCE_DIR}) -# message(STATUS "All: ${all_targets}") -# list(JOIN all_targets "\n" TARGET_FILE) -# file(WRITE "${CMAKE_SOURCE_DIR}/build/targets" ${TARGET_FILE}) - else() # build step @@ -93,15 +83,15 @@ add_compile_definitions( PRODUCT="${KEYBOARD_NAME}" ) -if(EXISTS ${QMK_KEYBOARD_FOLDER_ABS}/CMakeLists.txt) - add_subdirectory(${QMK_KEYBOARD_FOLDER_ABS}) -else() +# if(EXISTS ${QMK_KEYBOARD_FOLDER_ABS}/CMakeLists.txt) + # add_subdirectory(${QMK_KEYBOARD_FOLDER_ABS}) +# else() file(GLOB KEYBOARD_SRC "${QMK_KEYBOARD_FOLDER_ABS}/*.c") list(REMOVE_ITEM KEYBOARD_SRC "${QMK_KEYBOARD_KEYMAP}") - add_qmk_executable(${QMK_KEYBOARD} ${KEYBOARD_SRC}) -endif() + add_qmk_executable(${TARGET_NAME} ${KEYBOARD_SRC}) +# endif() -# add_library(qmk) +add_library(qmk) resolve_keyboard_includes(${QMK_KEYBOARD_FOLDER_ABS}) diff --git a/cmake/AddKeyboard.cmake b/cmake/AddKeyboard.cmake index 2ead7499d2..f315711d74 100644 --- a/cmake/AddKeyboard.cmake +++ b/cmake/AddKeyboard.cmake @@ -51,16 +51,16 @@ macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) string(MAKE_C_IDENTIFIER ${KEYBOARD_NAME} KEYBOARD_SLUG) endif() string(JSON MANUFACTURER GET ${JSON_STRING} manufacturer) - - ExternalProject_Add(${KEYBOARD_SLUG}_${KEYMAP_NAME} + set(TARGET_NAME "${KEYBOARD_SLUG}_${KEYMAP_NAME}") + ExternalProject_Add(${TARGET_NAME} SOURCE_DIR ${CMAKE_SOURCE_DIR} # PREFIX ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER} - TMP_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/tmp - DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Download - BINARY_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Build - STAMP_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Stamp - LOG_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Log - INSTALL_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Install + TMP_DIR ${CMAKE_SOURCE_DIR}/build/tmp + DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/build/download + BINARY_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${TARGET_NAME} + STAMP_DIR ${CMAKE_SOURCE_DIR}/build/stamp + LOG_DIR ${CMAKE_SOURCE_DIR}/build/log + INSTALL_DIR ${CMAKE_SOURCE_DIR}/build/install INSTALL_COMMAND ${CMAKE_COMMAND} -E echo "nothing to install" #copy ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Build/* ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Install/ # this seems to work well for all systems so far - not sure if it'd be useful to customize CMAKE_GENERATOR "Unix Makefiles" @@ -69,7 +69,8 @@ macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) -DQMK_KEYBOARD=${KEYBOARD_SLUG} -DQMK_KEYBOARD_FOLDER=${KEYBOARD_FOLDER} -DQMK_KEYMAP_FOLDER=${KEYMAP_FOLDER} + -DTARGET_NAME=${TARGET_NAME} ) -file(APPEND "${CMAKE_SOURCE_DIR}/build/targets" "${KEYBOARD_SLUG}_${KEYMAP_NAME}|${KEYBOARD_NAME} with ${KEYMAP_FOLDER}|${KEYBOARD_FOLDER}|Made by: ${MANUFACTURER}\n") +file(APPEND "${CMAKE_SOURCE_DIR}/build/targets" "${TARGET_NAME}|${KEYBOARD_NAME} with ${KEYMAP_FOLDER}|${KEYBOARD_FOLDER}|Made by: ${MANUFACTURER}\n") endmacro(add_keyboard) \ No newline at end of file diff --git a/cmake/toolchains/avr.cmake b/cmake/toolchains/avr.cmake index 9755e3a771..2c72645c80 100644 --- a/cmake/toolchains/avr.cmake +++ b/cmake/toolchains/avr.cmake @@ -99,10 +99,10 @@ add_link_options( macro(add_qmk_executable target_name) - set(QMK_TARGET ${target_name}-${QMK_MCU}.elf) - set(map_file ${target_name}-${QMK_MCU}.map) - set(hex_file ${target_name}-${QMK_MCU}.hex) - set(lst_file ${target_name}-${QMK_MCU}.lst) + set(elf_file ${target_name}.elf) + set(map_file ${target_name}.map) + set(hex_file ${target_name}.hex) + set(lst_file ${target_name}.lst) add_compile_options( -mmcu=${QMK_MCU} @@ -114,15 +114,16 @@ macro(add_qmk_executable target_name) ) # create elf file - add_executable(qmk ${ARGN}) + add_executable(${elf_file} ${ARGN}) - set_target_properties(qmk - PROPERTIES OUTPUT_NAME ${QMK_TARGET} - ) + # add_executable(qmk ${ARGN}) + # set_target_properties(qmk + # PROPERTIES OUTPUT_NAME ${elf_file} + # ) - # target_link_libraries(${QMK_TARGET} qmk) + target_link_libraries(${elf_file} qmk) - # set_target_properties(${QMK_TARGET} + # set_target_properties(${elf_file} # PROPERTIES # COMPILE_FLAGS "-mmcu=${QMK_MCU} ${COMPILE_OPTIONS}" # LINK_FLAGS "-mmcu=${QMK_MCU} ${LINK_OPTIONS}" @@ -131,22 +132,22 @@ macro(add_qmk_executable target_name) # generate the lst file add_custom_command( OUTPUT ${lst_file} - COMMAND ${CMAKE_OBJDUMP} -h -S ${QMK_TARGET} > ${lst_file} - DEPENDS ${QMK_TARGET} + COMMAND ${CMAKE_OBJDUMP} -h -S ${elf_file} > ${lst_file} + DEPENDS ${elf_file} ) # create hex file add_custom_command( OUTPUT ${hex_file} - # COMMAND ${CMAKE_OBJCOPY} -j .text -j .data -O ihex ${QMK_TARGET} ${hex_file} - COMMAND ${CMAKE_OBJCOPY} -O ihex -R .eeprom -R .fuse -R .lock -R .signature ${QMK_TARGET} ${hex_file} - DEPENDS ${QMK_TARGET} + # COMMAND ${CMAKE_OBJCOPY} -j .text -j .data -O ihex ${elf_file} ${hex_file} + COMMAND ${CMAKE_OBJCOPY} -O ihex -R .eeprom -R .fuse -R .lock -R .signature ${elf_file} ${hex_file} + DEPENDS ${elf_file} ) add_custom_command( - OUTPUT "print-size-${QMK_TARGET}" - COMMAND ${AVR_SIZE} ${QMK_TARGET} - DEPENDS ${QMK_TARGET} + OUTPUT "print-size-${elf_file}" + COMMAND ${AVR_SIZE} ${elf_file} + DEPENDS ${elf_file} ) add_custom_command( @@ -155,12 +156,17 @@ macro(add_qmk_executable target_name) DEPENDS ${hex_file} ) + add_custom_target(copy_hex + COMMAND ${CMAKE_COMMAND} -E copy $ ${CMAKE_SOURCE_DIR}/build/${target_name}.hex + DEPENDS ${hex_file} + ) + # build the intel hex file for the device add_custom_target(${target_name} ALL - DEPENDS ${hex_file} ${lst_file} "print-size-${QMK_TARGET}" "print-size-${hex_file}" + DEPENDS ${hex_file} ${lst_file} "print-size-${elf_file}" "print-size-${hex_file}" copy_hex ) set_target_properties(${target_name} - PROPERTIES OUTPUT_NAME ${QMK_TARGET} + PROPERTIES OUTPUT_NAME ${elf_file} ) endmacro(add_qmk_executable) From fe59b4e5d669a3b8513ac32b7f7564a0dc7fcb44 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 4 Apr 2023 16:26:44 -0400 Subject: [PATCH 19/26] load keyboard ui through vscode --- .vscode/tasks.json | 30 +++++++++---------- CMakeLists.txt | 2 +- cmake/AddKeyboard.cmake | 2 +- cmake/ConfigureKeyboard.cmake | 44 ++++++++++++++++++++++++++++ cmake/toolchains/arm-none-eabi.cmake | 42 +++++++++----------------- cmake/toolchains/avr.cmake | 2 -- keyboards/CMakeLists.txt | 38 ++++++++++++++++-------- 7 files changed, 100 insertions(+), 60 deletions(-) create mode 100644 cmake/ConfigureKeyboard.cmake diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 4af654899d..14618443d5 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -2,10 +2,10 @@ "version": "2.0.0", "tasks": [ { - "label": "Load Keyboard & Refresh Outline", + "label": "Load Keyboard", "dependsOrder": "sequence", "dependsOn":[ - "Load Keyboard", + "Only Load Keyboard", "Configure CMake" ], "group": { @@ -14,9 +14,9 @@ } }, { - "label": "Load Keyboard", + "label": "Only Load Keyboard", "type": "shell", - "command": "cmake -Bbuild -DQMK_KEYBOARD_FOLDER=${input:all_keyboards}", + "command": "cmake -D QMK_KEYBOARD_FOLDER=\"${input:all_keyboards}\" -D QMK_KEYMAP_FOLDER=\"${input:keymap}\" -P ${workspaceFolder}/cmake/ConfigureKeyboard.cmake", "problemMatcher": [] }, { @@ -72,15 +72,6 @@ // } ], "inputs": [ - { - "id": "keyboard", - "description": "Keyboard:", - "type": "pickString", - "options":[ - "planck/rev5", - "olkb/planck/rev3" - ] - }, { "id": "keyboard_target", "type": "command", @@ -97,8 +88,17 @@ "command": "shellCommand.execute", "args": { "command": "type build\\all_keyboards", - "description": "Keyboard:" + "description": "Keyboard:", + "default": "" }, - } + }, + { + "id": "keymap", + "description": "Keymap:", + "type": "pickString", + "options":[ + "default" + ] + }, ] } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a0e0b9925..1ffd2f2404 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,7 +44,7 @@ resolve_keymap_c(${QMK_KEYBOARD_FOLDER_ABS} ${QMK_KEYMAP_FOLDER} QMK_KEYMAP_C) message(STATUS "config.h: ${QMK_KEYBOARD_CONFIG_H}") message(STATUS "keyboard.h: ${QMK_KEYBOARD_H}") -message(STATUS "Keymap.c: ${QMK_KEYMAP_C}") +message(STATUS "keymap.c: ${QMK_KEYMAP_C}") validate_json(${QMK_KEYBOARD_FOLDER_ABS}/info.json keyboard QMK_KEYBOARD_INFO_JSON_STRING) diff --git a/cmake/AddKeyboard.cmake b/cmake/AddKeyboard.cmake index f315711d74..013d8a15b9 100644 --- a/cmake/AddKeyboard.cmake +++ b/cmake/AddKeyboard.cmake @@ -72,5 +72,5 @@ macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) -DTARGET_NAME=${TARGET_NAME} ) -file(APPEND "${CMAKE_SOURCE_DIR}/build/targets" "${TARGET_NAME}|${KEYBOARD_NAME} with ${KEYMAP_FOLDER}|${KEYBOARD_FOLDER}|Made by: ${MANUFACTURER}\n") +# file(APPEND "${CMAKE_SOURCE_DIR}/build/targets" "${TARGET_NAME}|${KEYBOARD_NAME} with ${KEYMAP_FOLDER}|${KEYBOARD_FOLDER}|Made by: ${MANUFACTURER}\n") endmacro(add_keyboard) \ No newline at end of file diff --git a/cmake/ConfigureKeyboard.cmake b/cmake/ConfigureKeyboard.cmake new file mode 100644 index 0000000000..f6d084725a --- /dev/null +++ b/cmake/ConfigureKeyboard.cmake @@ -0,0 +1,44 @@ +cmake_minimum_required(VERSION 3.20) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") + +include(ResolveKeyboard) +include(ValidateJSON) + +resolve_keyboard(${QMK_KEYBOARD_FOLDER} KEYBOARD_FOLDER_ABS) +validate_json(${KEYBOARD_FOLDER_ABS}/info.json keyboard JSON_STRING) + +if(NOT DEFINED QMK_KEYMAP_FOLDER) + set(QMK_KEYMAP_FOLDER default) +endif() + +set(TEMP_PATH ${QMK_KEYBOARD_FOLDER}) +cmake_path(IS_RELATIVE TEMP_PATH IS_KEYBOARD_FOLDER_RELATIVE) + +set(TEMP_PATH ${QMK_KEYMAP_FOLDER}) +cmake_path(IS_RELATIVE TEMP_PATH IS_KEYMAP_FOLDER_RELATIVE) + +if(${IS_KEYMAP_FOLDER_RELATIVE}) + set(KEYMAP_NAME ${QMK_KEYMAP_FOLDER}) +else() + if(WIN32) + set(KEYMAP_NAME $ENV{USERNAME}) + else() + set(KEYMAP_NAME $ENV{USE}) + endif() +endif() + +string(JSON KEYBOARD_NAME GET ${JSON_STRING} keyboard_name) + +if(${IS_KEYBOARD_FOLDER_RELATIVE}) + string(MAKE_C_IDENTIFIER ${QMK_KEYBOARD_FOLDER} KEYBOARD_SLUG) +else() + string(MAKE_C_IDENTIFIER ${KEYBOARD_NAME} KEYBOARD_SLUG) +endif() + +string(JSON MANUFACTURER GET ${JSON_STRING} manufacturer) + +set(TARGET_NAME "${KEYBOARD_SLUG}_${KEYMAP_NAME}") +file(APPEND "${CMAKE_SOURCE_DIR}/build/targets" "${TARGET_NAME}|${KEYBOARD_NAME} with ${QMK_KEYMAP_FOLDER}|${QMK_KEYBOARD_FOLDER}|Made by: ${MANUFACTURER}\n") + +message(STATUS "Added keyboard '${QMK_KEYBOARD_FOLDER}' with keymap '${QMK_KEYMAP_FOLDER}'") diff --git a/cmake/toolchains/arm-none-eabi.cmake b/cmake/toolchains/arm-none-eabi.cmake index cb8333db35..2af836d092 100644 --- a/cmake/toolchains/arm-none-eabi.cmake +++ b/cmake/toolchains/arm-none-eabi.cmake @@ -30,8 +30,8 @@ set(AVR_SIZE "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-size${OS_SUFFIX}" find_program(CMAKE_MAKE_PROGRAM NAME make PATHS - $<$:"${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin/"> - $<$UNIX>:"${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-linux/bin/"> + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin/" + "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-linux/bin/" /usr/bin/ /usr/local/bin /bin/ @@ -100,36 +100,17 @@ else() ) endif() -# include_directories("C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/avr/include") - macro(add_qmk_executable target_name) - set(elf_file ${target_name}-${QMK_MCU}.elf) - set(map_file ${target_name}-${QMK_MCU}.map) - set(hex_file ${target_name}-${QMK_MCU}.hex) - set(lst_file ${target_name}-${QMK_MCU}.lst) - - # add_link_options(-Wl,--gc-sections,-nostartfiles) + set(elf_file ${target_name}.elf) + set(map_file ${target_name}.map) + set(hex_file ${target_name}.hex) + set(lst_file ${target_name}.lst) # create elf file - add_executable(${elf_file} - ${ARGN} - ) + add_executable(${elf_file} ${ARGN}) - target_link_libraries(${elf_file} - PUBLIC - quantum - tmk_core_protocol - platforms - ) - - # set_target_properties( - # ${elf_file} - - # PROPERTIES - # COMPILE_FLAGS "-mmcu=${QMK_MCU} -g -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics" - # LINK_FLAGS "-mmcu=${QMK_MCU} -Wl,-Map,${map_file}" - # ) + target_link_libraries(${elf_file} qmk) # generate the lst file add_custom_command( @@ -169,11 +150,16 @@ macro(add_qmk_executable target_name) DEPENDS ${hex_file} ) + add_custom_target(copy_hex + COMMAND ${CMAKE_COMMAND} -E copy $ ${CMAKE_SOURCE_DIR}/build/${target_name}.hex + DEPENDS ${hex_file} + ) + # build the intel hex file for the device add_custom_target( ${target_name} ALL - DEPENDS ${hex_file} ${lst_file} "print-size-${elf_file}" "print-size-${hex_file}" + DEPENDS ${hex_file} ${lst_file} "print-size-${elf_file}" "print-size-${hex_file}" copy_hex ) set_target_properties( diff --git a/cmake/toolchains/avr.cmake b/cmake/toolchains/avr.cmake index 2c72645c80..f8d68c747c 100644 --- a/cmake/toolchains/avr.cmake +++ b/cmake/toolchains/avr.cmake @@ -95,8 +95,6 @@ add_link_options( -Wl,--gc-sections ) -# include_directories("C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/avr/include") - macro(add_qmk_executable target_name) set(elf_file ${target_name}.elf) diff --git a/keyboards/CMakeLists.txt b/keyboards/CMakeLists.txt index 77a634b6a4..4e6df9c6f6 100644 --- a/keyboards/CMakeLists.txt +++ b/keyboards/CMakeLists.txt @@ -1,22 +1,34 @@ include(ExternalProject) include(AddKeyboard) -file(WRITE "${CMAKE_SOURCE_DIR}/build/targets" "") +# file(WRITE "${CMAKE_SOURCE_DIR}/build/targets" "") -if(DEFINED QMK_KEYBOARD_FOLDER) - if(NOT DEFINED QMK_KEYMAP_FOLDER) - set(QMK_KEYMAP_FOLDER "default") - endif() - add_keyboard(${QMK_KEYBOARD_FOLDER} ${QMK_KEYMAP_FOLDER}) -endif() +# if(DEFINED QMK_KEYBOARD_FOLDER) +# if(NOT DEFINED QMK_KEYMAP_FOLDER) +# set(QMK_KEYMAP_FOLDER "default") +# endif() +# add_keyboard(${QMK_KEYBOARD_FOLDER} ${QMK_KEYMAP_FOLDER}) +# endif() -file(GLOB_RECURSE KEYBOARDS **/CMakeLists.txt) +# file(GLOB_RECURSE KEYBOARDS **/CMakeLists.txt) -foreach(KEYBOARD_CMAKE ${KEYBOARDS}) - get_filename_component(KEYBOARD_FOLDER_ABS "${KEYBOARD_CMAKE}" DIRECTORY) - file(RELATIVE_PATH KEYBOARD_FOLDER "${CMAKE_SOURCE_DIR}/keyboards" "${KEYBOARD_FOLDER_ABS}") - add_keyboard(${KEYBOARD_FOLDER} "default") -endforeach() +# foreach(KEYBOARD_CMAKE ${KEYBOARDS}) +# get_filename_component(KEYBOARD_FOLDER_ABS "${KEYBOARD_CMAKE}" DIRECTORY) +# file(RELATIVE_PATH KEYBOARD_FOLDER "${CMAKE_SOURCE_DIR}/keyboards" "${KEYBOARD_FOLDER_ABS}") +# add_keyboard(${KEYBOARD_FOLDER} "default") +# endforeach() + +file(STRINGS "${CMAKE_SOURCE_DIR}/build/targets" TARGETS) + +while(TARGETS) + list(POP_FRONT TARGETS LINE) + if (LINE MATCHES "(.+)\\|(.+)\\|(.+)\\|(.+)") + set(KEYBOARD_FOLDER ${CMAKE_MATCH_3}) + add_keyboard(${KEYBOARD_FOLDER} "default") + endif() +endwhile() + +# list all keyboards in build/all_keyboards file(GLOB_RECURSE POSSIBLE_KEYBOARDS **/info.json) From 94d76a4f9e7cc10752853bfc1f6d3711c8cd6cd0 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 4 Apr 2023 16:55:03 -0400 Subject: [PATCH 20/26] fix case issues --- CMakeLists.txt | 4 ++-- cmake/AddKeyboard.cmake | 4 ++-- keyboards/CMakeLists.txt | 8 +++++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ffd2f2404..85e96ebab7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") include(UpdateSubmodule) include(ResolveKeyboard) -include(ValidateJSON) +include(ValidateJson) set(QMK_KEYBOARDS_FOLDER "${CMAKE_SOURCE_DIR}/keyboards") @@ -102,4 +102,4 @@ add_subdirectory(tmk_core/protocol) include(features/oled) include(features/backlight) -endif() \ No newline at end of file +endif() diff --git a/cmake/AddKeyboard.cmake b/cmake/AddKeyboard.cmake index 013d8a15b9..51d5ac6830 100644 --- a/cmake/AddKeyboard.cmake +++ b/cmake/AddKeyboard.cmake @@ -1,5 +1,5 @@ include(ResolveKeyboard) -include(ValidateJSON) +include(ValidateJson) include(ResolveToolchain) macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) @@ -73,4 +73,4 @@ macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) ) # file(APPEND "${CMAKE_SOURCE_DIR}/build/targets" "${TARGET_NAME}|${KEYBOARD_NAME} with ${KEYMAP_FOLDER}|${KEYBOARD_FOLDER}|Made by: ${MANUFACTURER}\n") -endmacro(add_keyboard) \ No newline at end of file +endmacro(add_keyboard) diff --git a/keyboards/CMakeLists.txt b/keyboards/CMakeLists.txt index 4e6df9c6f6..b9f068fb21 100644 --- a/keyboards/CMakeLists.txt +++ b/keyboards/CMakeLists.txt @@ -1,7 +1,9 @@ include(ExternalProject) include(AddKeyboard) - -# file(WRITE "${CMAKE_SOURCE_DIR}/build/targets" "") + +if(NOT EXISTS "${CMAKE_SOURCE_DIR}/build/targets") + file(WRITE "${CMAKE_SOURCE_DIR}/build/targets" "") +endif() # if(DEFINED QMK_KEYBOARD_FOLDER) # if(NOT DEFINED QMK_KEYMAP_FOLDER) @@ -37,4 +39,4 @@ foreach(KEYBOARD_INFO ${POSSIBLE_KEYBOARDS}) get_filename_component(KEYBOARD_FOLDER_ABS "${KEYBOARD_INFO}" DIRECTORY) file(RELATIVE_PATH KEYBOARD_FOLDER "${CMAKE_SOURCE_DIR}/keyboards" "${KEYBOARD_FOLDER_ABS}") file(APPEND "${CMAKE_SOURCE_DIR}/build/all_keyboards" "${KEYBOARD_FOLDER}\n") -endforeach() \ No newline at end of file +endforeach() From c34f0e49983a70f2a936f3229bd14f444ce244c0 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 4 Apr 2023 20:55:10 -0400 Subject: [PATCH 21/26] test out compile_flags.txt --- cmake/Findchibios.cmake | 0 cmake/toolchains/avr.cmake | 4 ++ compile_flags.txt | 61 ++++++++++++++++++++++++ keyboards/mntre/keymaps/default/keymap.c | 2 +- 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 cmake/Findchibios.cmake create mode 100644 compile_flags.txt diff --git a/cmake/Findchibios.cmake b/cmake/Findchibios.cmake new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cmake/toolchains/avr.cmake b/cmake/toolchains/avr.cmake index f8d68c747c..0585b8475b 100644 --- a/cmake/toolchains/avr.cmake +++ b/cmake/toolchains/avr.cmake @@ -167,4 +167,8 @@ macro(add_qmk_executable target_name) set_target_properties(${target_name} PROPERTIES OUTPUT_NAME ${elf_file} ) + + # list(JOIN COMPILE_OPTIONS "\n" COMPILE_FLAGS_TXT) + # file(WRITE ${CMAKE_SOURCE_DIR}/compile_flags.txt ${COMPILE_FLAGS_TXT}) + endmacro(add_qmk_executable) diff --git a/compile_flags.txt b/compile_flags.txt new file mode 100644 index 0000000000..0f9e5f7534 --- /dev/null +++ b/compile_flags.txt @@ -0,0 +1,61 @@ +-std=c11 +-Iquantum +-Itoolchains\avr-gcc-12.1.0-x64-windows\avr\include +-DARCH=ARCH_AVR8 +-DBACKLIGHT_ENABLE +-DBACKLIGHT_PIN=B7 +-DBOARD=BOARD_NONE +-DDEVICE_VER=0x3 +-DFIXED_CONTROL_ENDPOINT_SIZE=8 +-DFIXED_NUM_CONFIGURATIONS=1 +-DF_CPU=16000000 +-DF_USB=16000000UL +-DKEYMAP_C=\\\"keyboards/mntre/keymaps/default/keymap.c\\\" +-DLTO_ENABLE +-DMANUFACTURER=\\\"OLKB\\\" +-DMATRIX_COLS=15 +-DMATRIX_ROWS=6 +-DOLED_ENABLE +-DPRODUCT=\\\"MNTRE\\\" +-DPRODUCT_ID=0xAE01 +-DPROTOCOL_LUFA +-DQMK_KEYBOARD_H="mntre.h" +-DUSB_DEVICE_ONLY +-DUSE_FLASH_DESCRIPTORS +-DUSE_STATIC_OPTIONS=\"(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)\" +-DVENDOR_ID=0x03A8 +-D__AVR_ATmega32U4__ +-Ikeyboards/mntre +-Iquantum +-Iquantum/logging +-Iquantum/keymap_extras +-Iquantum/process_keycode +-Iquantum/sequencer +-Iquantum/bootmagic +-Iplatforms +-Iplatforms/avr +-Itmk_core/protocol +-Ilib/lufa +-Itmk_core/protocol/lufa +-Idrivers +-Idrivers/oled +-Iplatforms/avr/drivers +-Iquantum/backlight +-std=gnu11 +-flto +-Os +-Wall +-Wstrict-prototypes +-fcommon +--param=min-pagesize=0 +-funsigned-char +-funsigned-bitfields +-ffunction-sections +-fdata-sections +-fpack-struct +-fshort-enums +-fno-builtin-printf +-fno-inline-small-functions +-fno-strict-aliasing +-include keyboards/mntre/config.h +-mmcu=atmega32u4 \ No newline at end of file diff --git a/keyboards/mntre/keymaps/default/keymap.c b/keyboards/mntre/keymaps/default/keymap.c index 227ab15c62..2db7a7d975 100644 --- a/keyboards/mntre/keymaps/default/keymap.c +++ b/keyboards/mntre/keymaps/default/keymap.c @@ -23,7 +23,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FN] = LAYOUT( _______, BL_DOWN, BL_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ From cfde338998e021ccfd4a8d544e0855136d5d7382 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 4 Apr 2023 23:39:52 -0400 Subject: [PATCH 22/26] generate compile_commands.json and configure clangd --- .clangd | 2 + cmake/AddKeyboard.cmake | 9 +++- cmake/toolchains/arm-none-eabi.cmake | 2 + cmake/toolchains/avr.cmake | 11 +++-- compile_flags.txt | 61 ---------------------------- 5 files changed, 20 insertions(+), 65 deletions(-) create mode 100644 .clangd delete mode 100644 compile_flags.txt diff --git a/.clangd b/.clangd new file mode 100644 index 0000000000..dd5cdf855f --- /dev/null +++ b/.clangd @@ -0,0 +1,2 @@ +CompileFlags: + Remove: -mcall-prologues \ No newline at end of file diff --git a/cmake/AddKeyboard.cmake b/cmake/AddKeyboard.cmake index 51d5ac6830..a18110b772 100644 --- a/cmake/AddKeyboard.cmake +++ b/cmake/AddKeyboard.cmake @@ -61,7 +61,7 @@ macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) STAMP_DIR ${CMAKE_SOURCE_DIR}/build/stamp LOG_DIR ${CMAKE_SOURCE_DIR}/build/log INSTALL_DIR ${CMAKE_SOURCE_DIR}/build/install - INSTALL_COMMAND ${CMAKE_COMMAND} -E echo "nothing to install" #copy ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Build/* ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Install/ + INSTALL_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/build/${TARGET_NAME}.hex ${CMAKE_SOURCE_DIR}/${TARGET_NAME}.hex # this seems to work well for all systems so far - not sure if it'd be useful to customize CMAKE_GENERATOR "Unix Makefiles" CMAKE_ARGS @@ -71,6 +71,13 @@ macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) -DQMK_KEYMAP_FOLDER=${KEYMAP_FOLDER} -DTARGET_NAME=${TARGET_NAME} ) + ExternalProject_Add_Step(${TARGET_NAME} copy_compile_commands + DEPENDEES configure + DEPENDERS build + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/build/keyboards/${TARGET_NAME}/compile_commands.json ${CMAKE_SOURCE_DIR}/compile_commands.json + # BYPRODUCTS ${CMAKE_SOURCE_DIR}/compile_commands.json + ALWAYS TRUE + ) # file(APPEND "${CMAKE_SOURCE_DIR}/build/targets" "${TARGET_NAME}|${KEYBOARD_NAME} with ${KEYMAP_FOLDER}|${KEYBOARD_FOLDER}|Made by: ${MANUFACTURER}\n") endmacro(add_keyboard) diff --git a/cmake/toolchains/arm-none-eabi.cmake b/cmake/toolchains/arm-none-eabi.cmake index 2af836d092..94c1dd6142 100644 --- a/cmake/toolchains/arm-none-eabi.cmake +++ b/cmake/toolchains/arm-none-eabi.cmake @@ -1,3 +1,5 @@ +set(CMAKE_EXPORT_COMPILE_COMMANDS on) + include(ResolveToolchain) set(QMK_TOOLCHAIN "arm-none-eabi") diff --git a/cmake/toolchains/avr.cmake b/cmake/toolchains/avr.cmake index 0585b8475b..01e80be74e 100644 --- a/cmake/toolchains/avr.cmake +++ b/cmake/toolchains/avr.cmake @@ -4,6 +4,8 @@ # @author Natesh Narain # @since Feb 06 2016 +set(CMAKE_EXPORT_COMPILE_COMMANDS on) + include(ResolveToolchain) set(QMK_TOOLCHAIN "avr") @@ -127,6 +129,11 @@ macro(add_qmk_executable target_name) # LINK_FLAGS "-mmcu=${QMK_MCU} ${LINK_OPTIONS}" # ) + # add_custom_target(compileOptions + # COMMAND cmake -P ${CMAKE_SOURCE_DIR}/cmake/WriteCompileOptions.cmake + # COMMENT "Writing compile_flags.txt" + # ) + # generate the lst file add_custom_command( OUTPUT ${lst_file} @@ -161,14 +168,12 @@ macro(add_qmk_executable target_name) # build the intel hex file for the device add_custom_target(${target_name} ALL - DEPENDS ${hex_file} ${lst_file} "print-size-${elf_file}" "print-size-${hex_file}" copy_hex + DEPENDS ${hex_file} ${lst_file} "print-size-${elf_file}" "print-size-${hex_file}" copy_hex ) set_target_properties(${target_name} PROPERTIES OUTPUT_NAME ${elf_file} ) - # list(JOIN COMPILE_OPTIONS "\n" COMPILE_FLAGS_TXT) - # file(WRITE ${CMAKE_SOURCE_DIR}/compile_flags.txt ${COMPILE_FLAGS_TXT}) endmacro(add_qmk_executable) diff --git a/compile_flags.txt b/compile_flags.txt deleted file mode 100644 index 0f9e5f7534..0000000000 --- a/compile_flags.txt +++ /dev/null @@ -1,61 +0,0 @@ --std=c11 --Iquantum --Itoolchains\avr-gcc-12.1.0-x64-windows\avr\include --DARCH=ARCH_AVR8 --DBACKLIGHT_ENABLE --DBACKLIGHT_PIN=B7 --DBOARD=BOARD_NONE --DDEVICE_VER=0x3 --DFIXED_CONTROL_ENDPOINT_SIZE=8 --DFIXED_NUM_CONFIGURATIONS=1 --DF_CPU=16000000 --DF_USB=16000000UL --DKEYMAP_C=\\\"keyboards/mntre/keymaps/default/keymap.c\\\" --DLTO_ENABLE --DMANUFACTURER=\\\"OLKB\\\" --DMATRIX_COLS=15 --DMATRIX_ROWS=6 --DOLED_ENABLE --DPRODUCT=\\\"MNTRE\\\" --DPRODUCT_ID=0xAE01 --DPROTOCOL_LUFA --DQMK_KEYBOARD_H="mntre.h" --DUSB_DEVICE_ONLY --DUSE_FLASH_DESCRIPTORS --DUSE_STATIC_OPTIONS=\"(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)\" --DVENDOR_ID=0x03A8 --D__AVR_ATmega32U4__ --Ikeyboards/mntre --Iquantum --Iquantum/logging --Iquantum/keymap_extras --Iquantum/process_keycode --Iquantum/sequencer --Iquantum/bootmagic --Iplatforms --Iplatforms/avr --Itmk_core/protocol --Ilib/lufa --Itmk_core/protocol/lufa --Idrivers --Idrivers/oled --Iplatforms/avr/drivers --Iquantum/backlight --std=gnu11 --flto --Os --Wall --Wstrict-prototypes --fcommon ---param=min-pagesize=0 --funsigned-char --funsigned-bitfields --ffunction-sections --fdata-sections --fpack-struct --fshort-enums --fno-builtin-printf --fno-inline-small-functions --fno-strict-aliasing --include keyboards/mntre/config.h --mmcu=atmega32u4 \ No newline at end of file From a1cb0059816b1bd2a64ad5f9b13021165b763f2a Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 5 Apr 2023 12:59:16 -0400 Subject: [PATCH 23/26] storm commit, chibios exp --- CMakeLists.txt | 1 + chibios_mcu.json | 41 ++++ cmake/Findchibios.cmake | 229 +++++++++++++++++++++++ cmake/ParseMakefile.cmake | 44 +++++ cmake/features/eeprom.cmake | 54 ++++++ cmake/toolchains/arm-none-eabi.cmake | 12 -- platforms/chibios/CMakeLists.txt | 33 +++- quantum/CMakeLists.txt | 4 +- tmk_core/protocol/chibios/CMakeLists.txt | 13 +- 9 files changed, 408 insertions(+), 23 deletions(-) create mode 100644 chibios_mcu.json create mode 100644 cmake/ParseMakefile.cmake create mode 100644 cmake/features/eeprom.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 85e96ebab7..b96b9a3ccc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -101,5 +101,6 @@ add_subdirectory(tmk_core/protocol) include(features/oled) include(features/backlight) +include(features/eeprom) endif() diff --git a/chibios_mcu.json b/chibios_mcu.json new file mode 100644 index 0000000000..9624804932 --- /dev/null +++ b/chibios_mcu.json @@ -0,0 +1,41 @@ +{ + "MKL26Z64" : { + "MCU" : "cortex-m0plus", + "ARMV": 6, + "MCU_FAMILY": "KINETIS", + "MCU_SERIES": "KL2x", + "MCU_LDSCRIPT": "MKL26Z64", + "MCU_STARTUP": "kl2x", + "BOARD": "PJRC_TEENSY_LC" + }, + "MK20DX128" : { + "MCU" : "cortex-m4", + "ARMV": 7, + "MCU_FAMILY": "KINETIS", + "MCU_SERIES": "K20x", + "MCU_LDSCRIPT": "MK20DX128", + "MCU_STARTUP": "k20x5", + "BOARD": "PJRC_TEENSY_3" + }, + "MK20DX256" : { + "MCU" : "cortex-m4", + "ARMV": 7, + "MCU_FAMILY": "KINETIS", + "MCU_SERIES": "K20x", + "MCU_LDSCRIPT": "MK20DX256", + "MCU_STARTUP": "k20x7", + "BOARD": "PJRC_TEENSY_3_1" + }, + "STM32F303" : { + "MCU" : "cortex-m4", + "ARMV": 7, + "MCU_FAMILY": "STM32", + "MCU_SERIES": "STM32F3xx", + "MCU_LDSCRIPT": "STM32F303xC", + "MCU_STARTUP": "stm32f3xx", + "BOARD": "GENERIC_STM32_F303XC", + "USE_FPU": true, + "UF2_FAMILY": "STM32F3", + "STM32_BOOTLOADER_ADDRESS": "0x1FFFD800" + } +} \ No newline at end of file diff --git a/cmake/Findchibios.cmake b/cmake/Findchibios.cmake index e69de29bb2..dc1a663aa2 100644 --- a/cmake/Findchibios.cmake +++ b/cmake/Findchibios.cmake @@ -0,0 +1,229 @@ +include(ParseMakefile) + +set(MCU "cortex-m4") +set(ARMV 7) +set(MCU_FAMILY "STM32") +set(MCU_SERIES "STM32F3xx") +set(MCU_LDSCRIPT "STM32F303xC") +set(MCU_STARTUP "stm32f3xx") +set(BOARD "GENERIC_STM32_F303XC") +set(USE_FPU TRUE) +set(UF2_FAMILY "STM32F3") +set(STM32_BOOTLOADER_ADDRESS 0x1FFFD800) + +set(MCU_PORT_NAME ${MCU_FAMILY}) +set(MCU_ARCH ${MCU}) +set(CHIBIOS_PORT "ARMv${ARMV}-M") +set(PLATFORM_NAME platform) + +set(CHIBIOS ${CMAKE_SOURCE_DIR}/lib/chibios) +set(CHIBIOS_CONTRIB ${CMAKE_SOURCE_DIR}/lib/chibios-contrib) +set(EEPROM_DRIVER "wear_leveling" CACHE STRING "" FORCE) + +# target_compile_definitions(qmk PUBLIC + # __ARM_ARCH_7M__ + # STM32F303xC +# ) + +# F3 sources +set(CHIBIOS_PORT_SRCS + # RT + chcore.c + chcoreasm.S +) +foreach(SRC_FILE ${CHIBIOS_PORT_SRCS}) + set(CHIBIOS_F3_SRC_FILE SRC_FILE-NOTFOUND) + find_file(CHIBIOS_F3_SRC_FILE ${SRC_FILE} + PATHS + ${CHIBIOS}/os/common/ports/ARMv7-M/compilers/GCC + ${CHIBIOS}/os/common/ports/ARMv7-M + CMAKE_FIND_ROOT_PATH_BOTH + ) + + target_sources(qmk PUBLIC ${CHIBIOS_F3_SRC_FILE}) +endforeach() + +target_include_directories(qmk PUBLIC + ${CHIBIOS}/os/common/ports/ARMv7-M + ${CHIBIOS}/os/hal/boards/ST_STM32F3_DISCOVERY +) + +# F3 HAL specific +target_include_directories(qmk PUBLIC + ${CHIBIOS}/os/hal/ports/common/ARMCMx + ${CHIBIOS}/os/hal/include + ${CHIBIOS}/os/hal/ports/STM32/STM32F3xx + + ${CHIBIOS}/os/common/portability/GCC + ${CHIBIOS}/os/common/ports/ARM-common + ${CHIBIOS}/os/common/ports/ARMv7-M + ${CHIBIOS}/os/common/startup/ARMCMx/compilers/GCC + ${CHIBIOS}/os/common/startup/ARMCMx/devices/STM32F3xx + ${CHIBIOS}/os/common/ext/ARM/CMSIS/Core/Include + ${CHIBIOS}/os/common/ext/ST/STM32F3xx + + ${CHIBIOS}/os/hal/ports/STM32/LLD/ADCv3 + ${CHIBIOS}/os/hal/ports/STM32/LLD/CANv1 + ${CHIBIOS}/os/hal/ports/STM32/LLD/DACv1 + ${CHIBIOS}/os/hal/ports/STM32/LLD/DMAv1 + ${CHIBIOS}/os/hal/ports/STM32/LLD/EXTIv1 + ${CHIBIOS}/os/hal/ports/STM32/LLD/GPIOv2 + ${CHIBIOS}/os/hal/ports/STM32/LLD/I2Cv2 + ${CHIBIOS}/os/hal/ports/STM32/LLD/RTCv2 + # ${CHIBIOS}/os/hal/ports/STM32/LLD/SDIOv1 + ${CHIBIOS}/os/hal/ports/STM32/LLD/SPIv1 + ${CHIBIOS}/os/hal/ports/STM32/LLD/SYSTICKv1 + ${CHIBIOS}/os/hal/ports/STM32/LLD/TIMv1 + # ${CHIBIOS}/os/hal/ports/STM32/LLD/USART + ${CHIBIOS}/os/hal/ports/STM32/LLD/USARTv2 + ${CHIBIOS}/os/hal/ports/STM32/LLD/USBv1 + ${CHIBIOS}/os/hal/ports/STM32/LLD/xWDGv1 +) + +# source files for ChibiOS HAL +set(CHIBIOS_HAL_SRCS + + # startup code + crt1.c + vectors.S + crt0_v7m.S + + nvic.c + stm32_isr.c + + # HAL-OSAL files + hal.c + hal_st.c + + hal_buffers.c + hal_queues.c + hal_flash.c + hal_mmcsd.c + + hal_adc.c + hal_can.c + # hal_crypto.c + hal_dac.c + hal_efl.c + hal_gpt.c + hal_i2c.c + hal_i2s.c + hal_icu.c + hal_mac.c + hal_mmc_spi.c + hal_pal.c + hal_pwm.c + hal_rtc.c + hal_sdc.c + hal_serial.c + hal_serial_usb.c + hal_sio.c + hal_spi.c + hal_trng.c + hal_uart.c + hal_usb.c + hal_wdg.c + hal_wspi.c + + # LLD HAL files + hal_lld.c + + hal_adc_lld.c + hal_can_lld.c + hal_crypto_lld.c + hal_dac_lld.c + stm32_dma.c + stm32_exti.c + hal_pal_lld.c + hal_i2c_lld.c + hal_mac_lld.c + hal_usb_lld.c + hal_wspi_lld.c + hal_trng_lld.c + hal_rtc_lld.c + hal_sdc_lld.c + + hal_i2s_lld.c + hal_spi_v2_lld.c + + hal_st_lld.c + hal_gpt_lld.c + hal_icu_lld.c + hal_pwm_lld.c + + hal_serial_lld.c + hal_uart_lld.c + + hal_wdg_lld.c + + # OSAL + osal.c + + board.c +) + +foreach(SRC_FILE ${CHIBIOS_HAL_SRCS}) + + set(CHIBIOS_HAL_SRC_FILE SRC_FILE -NOTFOUND) + + find_file(CHIBIOS_HAL_SRC_FILE ${SRC_FILE} + PATHS + + ${CHIBIOS}/os/common/ports/ARMv7-M/compilers/GCC + ${CHIBIOS}/os/common/startup/ARMCMx/compilers/GCC + + ${CHIBIOS}/os/hal/src + ${CHIBIOS}/os/hal/ports/common/ARMCMx + + ${CHIBIOS}/os/hal/ports/STM32/STM32F3xx + + ${CHIBIOS}/os/hal/ports/STM32/STM32F3xx + ${CHIBIOS}/os/hal/ports/STM32/LLD/ADCv3 + ${CHIBIOS}/os/hal/ports/STM32/LLD/CANv1 + ${CHIBIOS}/os/hal/ports/STM32/LLD/DACv1 + ${CHIBIOS}/os/hal/ports/STM32/LLD/DMAv1 + ${CHIBIOS}/os/hal/ports/STM32/LLD/EXTIv1 + ${CHIBIOS}/os/hal/ports/STM32/LLD/GPIOv2 + ${CHIBIOS}/os/hal/ports/STM32/LLD/I2Cv2 + ${CHIBIOS}/os/hal/ports/STM32/LLD/RTCv2 + ${CHIBIOS}/os/hal/ports/STM32/LLD/SPIv2 + ${CHIBIOS}/os/hal/ports/STM32/LLD/SYSTICKv1 + ${CHIBIOS}/os/hal/ports/STM32/LLD/TIMv1 + ${CHIBIOS}/os/hal/ports/STM32/LLD/USARTv1 + ${CHIBIOS}/os/hal/ports/STM32/LLD/USBv1 + ${CHIBIOS}/os/hal/ports/STM32/LLD/xWDGv1 + + # ${OSHAL_PATH} + + # ${CHIBIOS_BOARD_DEFINITIONS_PATH} + + CMAKE_FIND_ROOT_PATH_BOTH + ) + if(EXISTS "${CHIBIOS_HAL_SRC_FILE}") + target_sources(qmk PUBLIC ${CHIBIOS_HAL_SRC_FILE}) + endif() +endforeach() + +# chibios +target_include_directories(qmk PUBLIC + # ${CHIBIOS}/os/hal/include + # ${CHIBIOS}/os/hal/osal/sb + # ${CHIBIOS}/os/common/portability/GCC + # ${CHIBIOS}/os/sb/user + # ${CHIBIOS}/os/sb/common + + ${CHIBIOS}/os + ${CHIBIOS}/os/license + ${CHIBIOS}/os/hal/ports/common/ARMCMx + ${CHIBIOS}/os/hal/include + ${CHIBIOS}/os/hal/osal/rt-nil + ${CHIBIOS}/os/oslib/include + ${CHIBIOS}/os/rt/include + ${CHIBIOS}/os/hal/ports/STM32/${MCU_SERIES} + ${CHIBIOS}/os/common/ports/ARMv7-M + ${CHIBIOS}/os/common/ports/ARMv7-M/compilers/GCC + ${CHIBIOS}/os/common/abstractions/cmsis_os + ${CHIBIOS}/os/common/startup/ARMCMx/compilers/GCC + ${CHIBIOS}/os/common/ext/CMSIS/include + ${CHIBIOS}/os/common/ext/CMSIS/ST/${MCU_SERIES} +) \ No newline at end of file diff --git a/cmake/ParseMakefile.cmake b/cmake/ParseMakefile.cmake new file mode 100644 index 0000000000..6dee007b13 --- /dev/null +++ b/cmake/ParseMakefile.cmake @@ -0,0 +1,44 @@ +# Simple CMake utility to read variables from MK files +# - Gets contents from given file (name or path) +# - Parses the assignment statements +# - Makes the same assignments in the PARENT_SCOPE + +if(POLICY CMP0007) + cmake_policy(SET CMP0007 NEW) +endif() + +function(ParseMakefile MKFile) + _ParseMakefile(${MKFile}) +endfunction() + +macro(_ParseMakefile MKFile) + file(READ "${MKFile}" FileContents) + string(REPLACE "\\\n" "" FileContents ${FileContents}) + string(REPLACE "\n" ";" FileLines ${FileContents}) + list(REMOVE_ITEM FileLines "") + foreach(line ${FileLines}) + # if(line MATCHES "$\\((.+)\\)") + # string(REPLACE "(${CMAKE_MATCH_1})" "{${CMAKE_MATCH_1}}" line ${line}) + # endif() + # if(line MATCHES "^include (.+)$") + # set(MAKE_CHILD ${CMAKE_MATCH_1}) + # message(STATUS "Reading ${MAKE_CHILD}") + # _ParseMakefile("${MAKE_CHILD}") + # else() + string(REPLACE "=" ";" line_split ${line}) + list(LENGTH line_split count) + if (count LESS 2) + message(STATUS "Skipping ${line}") + continue() + endif() + list(GET line_split -1 value) + string(STRIP ${value} value) + separate_arguments(value) + list(REMOVE_AT line_split -1) + foreach(var_name ${line_split}) + string(STRIP ${var_name} var_name) + set(${var_name} ${value} PARENT_SCOPE) + endforeach() + # endif() + endforeach() +endmacro() \ No newline at end of file diff --git a/cmake/features/eeprom.cmake b/cmake/features/eeprom.cmake new file mode 100644 index 0000000000..294abe5546 --- /dev/null +++ b/cmake/features/eeprom.cmake @@ -0,0 +1,54 @@ +set(EEPROM_DRIVER "vendor" CACHE STRING "EEPROM driver") +set_property(CACHE EEPROM_DRIVER PROPERTY STRINGS vendor custom transient i2c spi wear_leveling legacy_stm32_flash) +set(WEAR_LEVELING_DRIVER "none" CACHE STRING "EEPROM wear-leveling driver") +set_property(CACHE WEAR_LEVELING_DRIVER PROPERTY STRINGS custom embedded_flash spi_flash rp2040_flash legacy) + +if(${EEPROM_DRIVER} STREQUAL "wear_leveling") + target_compile_definitions(qmk PUBLIC + EEPROM_DRIVER + EEPROM_WEAR_LEVELING + ) + target_sources(qmk PUBLIC + drivers/eeprom/eeprom_driver.c + drivers/eeprom/eeprom_wear_leveling.c + ) + target_include_directories(qmk PUBLIC drivers/eeprom) +elseif(${EEPROM_DRIVER} STREQUAL "vendor") + target_compile_definitions(qmk PUBLIC + EEPROM_VENDOR + ) + if(${QMK_PLATFORM} STREQUAL "chibios") + if(${QMK_MCU} MATHCES "STM32F.*") + target_compile_definitions(qmk PUBLIC + EEPROM_DRIVER + EEPROM_WEAR_LEVELING + ) + target_sources(qmk PUBLIC + drivers/eeprom/eeprom_driver.c + drivers/eeprom/eeprom_wear_leveling.c + ) + set(WEAR_LEVELING_DRIVER "embedded_flash" FORCE) + endif() + endif() +endif() + +if(NOT ${WEAR_LEVELING_DRIVER} STREQUAL "none") + target_compile_definitions(qmk PUBLIC + WEAR_LEVELING_ENABLE + WEAR_LEVELING_EMBEDDED_FLASH + ) + target_include_directories(qmk PUBLIC + platforms/${QMK_PLATFORM}/drivers/wear_leveling + drivers/wear_leveling + quantum/wear_leveling + ) + target_sources(qmk PUBLIC wear_leveling.c) + + if(NOT ${WEAR_LEVELING_DRIVER} STREQUAL "embedded_flash") + target_compile_definitions(qmk PUBLIC + HAL_USE_EFL + ) + target_sources(qmk PUBLIC wear_leveling_efl.c) + # post config.h platforms/${QMK_PLATFORM}/drivers/wear_leveling/wear_leveling_efl_config.h + endif() +endif() diff --git a/cmake/toolchains/arm-none-eabi.cmake b/cmake/toolchains/arm-none-eabi.cmake index 94c1dd6142..804c1fdb5d 100644 --- a/cmake/toolchains/arm-none-eabi.cmake +++ b/cmake/toolchains/arm-none-eabi.cmake @@ -68,23 +68,11 @@ add_compile_options( # $<$:-fno-exceptions> ) -add_compile_definitions( - THUMB_PRESENT - THUMB_NO_INTERWORKING - PROTOCOL_CHIBIOS - MCU_${MCU_FAMILY} - PLATFORM_SUPPORTS_SYNCHRONIZATION - PORT_IGNORE_GCC_VERSION_CHECK=1 -) - add_link_options( -Wl,--gc-sections -nostartfiles -Wl,--no-wchar-size-warning --specs=nano.specs - -mthumb - -mno-thumb-interwork - -mno-unaligned-access ) if(${USE_FPU}) diff --git a/platforms/chibios/CMakeLists.txt b/platforms/chibios/CMakeLists.txt index 622e2a5678..4c0b47402f 100644 --- a/platforms/chibios/CMakeLists.txt +++ b/platforms/chibios/CMakeLists.txt @@ -1,6 +1,37 @@ -add_link_options( +find_package(chibios REQUIRED) + +target_link_options(qmk PUBLIC -mcpu=${QMK_MCU} + -mthumb + -mno-thumb-interwork + -mno-unaligned-access ) + +target_compile_definitions(qmk PUBLIC + MCU_${MCU_FAMILY} + THUMB_PRESENT + THUMB_NO_INTERWORKING + PLATFORM_SUPPORTS_SYNCHRONIZATION + PORT_IGNORE_GCC_VERSION_CHECK=1 +) + +if(NOT ${USE_FPU}) + target_compile_options(qmk PUBLIC + -mfloat-abi=hard + -mfpu=fpv4-sp-d16 + -fsingle-precision-constant + ) + target_compile_definitions(qmk PUBLIC + CORTEX_USE_FPU=TRUE + ) +else() + target_compile_definitions(qmk PUBLIC + CORTEX_USE_FPU=FALSE + ) +endif() + # add_library(platforms_chibios) target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/boards/common/configs) +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD}/configs) # target_link_libraries(platforms_chibios ${QMK_TARGET}) \ No newline at end of file diff --git a/quantum/CMakeLists.txt b/quantum/CMakeLists.txt index 736df9073f..e5b5d683bf 100644 --- a/quantum/CMakeLists.txt +++ b/quantum/CMakeLists.txt @@ -35,5 +35,5 @@ target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bootmagic) # target_link_libraries(quantum tmk_core_protocol_${QMK_PROTOCOL}) # if no printf -# target_sources(quantum PRIVATE ${CMAKE_SOURCE_DIR}/lib/printf/src/printf/printf.c) -# target_include_directories(quantum PUBLIC ${CMAKE_SOURCE_DIR}/lib/printf/src/printf) \ No newline at end of file +target_sources(qmk PUBLIC ${CMAKE_SOURCE_DIR}/lib/printf/src/printf/printf.c) +target_include_directories(qmk PUBLIC ${CMAKE_SOURCE_DIR}/lib/printf/src/printf) \ No newline at end of file diff --git a/tmk_core/protocol/chibios/CMakeLists.txt b/tmk_core/protocol/chibios/CMakeLists.txt index 5a4144ccf3..ab80a632d4 100644 --- a/tmk_core/protocol/chibios/CMakeLists.txt +++ b/tmk_core/protocol/chibios/CMakeLists.txt @@ -1,10 +1,10 @@ -add_compile_definitions( +target_compile_definitions(qmk PUBLIC PROTOCOL_CHIBIOS FIXED_CONTROL_ENDPOINT_SIZE=64 FIXED_NUM_CONFIGURATIONS=1 ) -add_library(tmk_core_protocol_chibios +target_sources(qmk PUBLIC usb_main.c chibios.c ../usb_descriptor.c @@ -12,10 +12,7 @@ add_library(tmk_core_protocol_chibios usb_util.c ) -# find_package(lufa REQUIRED) +find_package(chibios REQUIRED) -target_include_directories(tmk_core_protocol_chibios PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(tmk_core_protocol_chibios PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/lufa_utils) - -# target_link_libraries(tmk_core_protocol_chibios PUBLIC lufa) -target_link_libraries(tmk_core_protocol_chibios PUBLIC quantum) \ No newline at end of file +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/lufa_utils) \ No newline at end of file From cc22d67b328f3428e48c76cc84e8bcf34d94ad16 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 5 Apr 2023 18:27:47 -0400 Subject: [PATCH 24/26] some chibios experiments --- cmake/Findchibios.cmake | 381 +++++++++++------------ cmake/ParseMakefile.cmake | 13 +- cmake/chibios/LLD/ADCv3.cmake | 2 + cmake/chibios/LLD/CANv1.cmake | 2 + cmake/chibios/LLD/DACv1.cmake | 2 + cmake/chibios/LLD/DMAv1.cmake | 2 + cmake/chibios/LLD/EXTIv1.cmake | 2 + cmake/chibios/LLD/GPIOv2.cmake | 2 + cmake/chibios/LLD/I2Cv2.cmake | 7 + cmake/chibios/LLD/RTCv2.cmake | 2 + cmake/chibios/LLD/SPIv2.cmake | 5 + cmake/chibios/LLD/SYSTICKv1.cmake | 2 + cmake/chibios/LLD/TIMv1.cmake | 6 + cmake/chibios/LLD/USARTv2.cmake | 9 + cmake/chibios/LLD/USBv1.cmake | 6 + cmake/chibios/LLD/xWDGv1.cmake | 6 + cmake/chibios/ports/ARMv7-M.cmake | 10 + cmake/chibios/ports/STM32F3xx.cmake | 25 ++ platforms/chibios/CMakeLists.txt | 12 +- quantum/CMakeLists.txt | 4 - tmk_core/protocol/chibios/CMakeLists.txt | 8 +- tmk_core/protocol/lufa/CMakeLists.txt | 2 +- 22 files changed, 299 insertions(+), 211 deletions(-) create mode 100644 cmake/chibios/LLD/ADCv3.cmake create mode 100644 cmake/chibios/LLD/CANv1.cmake create mode 100644 cmake/chibios/LLD/DACv1.cmake create mode 100644 cmake/chibios/LLD/DMAv1.cmake create mode 100644 cmake/chibios/LLD/EXTIv1.cmake create mode 100644 cmake/chibios/LLD/GPIOv2.cmake create mode 100644 cmake/chibios/LLD/I2Cv2.cmake create mode 100644 cmake/chibios/LLD/RTCv2.cmake create mode 100644 cmake/chibios/LLD/SPIv2.cmake create mode 100644 cmake/chibios/LLD/SYSTICKv1.cmake create mode 100644 cmake/chibios/LLD/TIMv1.cmake create mode 100644 cmake/chibios/LLD/USARTv2.cmake create mode 100644 cmake/chibios/LLD/USBv1.cmake create mode 100644 cmake/chibios/LLD/xWDGv1.cmake create mode 100644 cmake/chibios/ports/ARMv7-M.cmake create mode 100644 cmake/chibios/ports/STM32F3xx.cmake diff --git a/cmake/Findchibios.cmake b/cmake/Findchibios.cmake index dc1a663aa2..3ca1ee6002 100644 --- a/cmake/Findchibios.cmake +++ b/cmake/Findchibios.cmake @@ -1,5 +1,7 @@ include(ParseMakefile) +# STM32F303 + set(MCU "cortex-m4") set(ARMV 7) set(MCU_FAMILY "STM32") @@ -10,220 +12,207 @@ set(BOARD "GENERIC_STM32_F303XC") set(USE_FPU TRUE) set(UF2_FAMILY "STM32F3") set(STM32_BOOTLOADER_ADDRESS 0x1FFFD800) +set(EEPROM_DRIVER "wear_leveling" CACHE STRING "" FORCE) -set(MCU_PORT_NAME ${MCU_FAMILY}) +# platforms/chibios/platform.mk + +if(NOT DEFINED MCU_PORT_NAME) + set(MCU_PORT_NAME ${MCU_FAMILY}) +endif() set(MCU_ARCH ${MCU}) -set(CHIBIOS_PORT "ARMv${ARMV}-M") -set(PLATFORM_NAME platform) +if(NOT DEFINED CHIBIOS_PORT) + set(CHIBIOS_PORT "ARMv${ARMV}-M") +endif() +if(NOT DEFINED PLATFORM_NAME) + set(PLATFORM_NAME platform) +endif() set(CHIBIOS ${CMAKE_SOURCE_DIR}/lib/chibios) set(CHIBIOS_CONTRIB ${CMAKE_SOURCE_DIR}/lib/chibios-contrib) -set(EEPROM_DRIVER "wear_leveling" CACHE STRING "" FORCE) -# target_compile_definitions(qmk PUBLIC - # __ARM_ARCH_7M__ - # STM32F303xC -# ) +# port*.mk +include(chibios/ports/${CHIBIOS_PORT}) -# F3 sources -set(CHIBIOS_PORT_SRCS - # RT - chcore.c - chcoreasm.S +# platform.mk +include(chibios/ports/${MCU_SERIES}) + +# startup_*.mk - might need to convert these +find_file(STARTUP_MK startup_${MCU_STARTUP}.mk + ${CHIBIOS}/os/common/ports/ARMCMx/compilers/GCC/mk + ${CHIBIOS}/os/common/startup/ARMCMx/compilers/GCC/mk + ${CHIBIOS_CONTRIB}/os/common/startup/ARMCMx/compilers/GCC/mk ) -foreach(SRC_FILE ${CHIBIOS_PORT_SRCS}) - set(CHIBIOS_F3_SRC_FILE SRC_FILE-NOTFOUND) - find_file(CHIBIOS_F3_SRC_FILE ${SRC_FILE} - PATHS - ${CHIBIOS}/os/common/ports/ARMv7-M/compilers/GCC - ${CHIBIOS}/os/common/ports/ARMv7-M - CMAKE_FIND_ROOT_PATH_BOTH - ) +ParseMakefile(${STARTUP_MK}) +target_sources(qmk PUBLIC ${STARTUPSRC} ${STARTUPASM}) +target_include_directories(qmk PUBLIC ${STARTUPINC}) - target_sources(qmk PUBLIC ${CHIBIOS_F3_SRC_FILE}) -endforeach() +# board paths - we should just standardize these +find_path(BOARD_PATH +NAMES + boards/${BOARD}/board.mk + board/board.mk +PATHS + ${QMK_KEYBOARD_FOLDER}/boards/${BOARD} + ${CMAKE_SOURCE_DIR}/platforms/chibios/boards/${BOARD} +) +find_file(BOARD_MK board.mk + ${BOARD_PATH}/boards/${BOARD} + ${BOARD_PATH}/board +) +ParseMakefile(${BOARD_MK}) +target_sources(qmk PUBLIC ${BOARDSRC}) +target_include_directories(qmk PUBLIC ${BOARDINC}) -target_include_directories(qmk PUBLIC - ${CHIBIOS}/os/common/ports/ARMv7-M - ${CHIBIOS}/os/hal/boards/ST_STM32F3_DISCOVERY +# bootloader +if(DEFINED STM32_BOOTLOADER_ADDRESS) + target_compile_definitions(qmk PUBLIC STM32_BOOTLOADER_ADDRESS=${STM32_BOOTLOADER_ADDRESS}) +endif() +if(DEFINED WB32_BOOTLOADER_ADDRESS) + target_compile_definitions(qmk PUBLIC WB32_BOOTLOADER_ADDRESS=${WB32_BOOTLOADER_ADDRESS}) +endif() + +find_file(BOOTLOADER_DEFS_H bootloader_defs.h + ${QMK_KEYBOARD_FOLDER} + ${QMK_KEYBOARD_FOLDER}/boards/${BOARD} + ${BOARD_PATH}/configs +) +if(EXISTS ${BOOTLOADER_DEFS_H}) + target_compile_options(qmk PUBLIC -include ${BOOTLOADER_DEFS_H}) +endif() + +# chconf directories +find_path(CHCONFDIR chconf.h + ${QMK_KEYBOARD_FOLDER} + ${CMAKE_SOURCE_DIR}/platforms/chibios/boards/${BOARD}/configs + ${CMAKE_SOURCE_DIR}/platforms/chibios/boards/common/configs +) +target_include_directories(qmk PUBLIC ${CHCONFDIR}) + +# halconf directories +find_path(HALCONFDIR halconf.h + ${QMK_KEYBOARD_FOLDER} + ${CMAKE_SOURCE_DIR}/platforms/chibios/boards/${BOARD}/configs + ${CMAKE_SOURCE_DIR}/platforms/chibios/boards/common/configs +) +target_include_directories(qmk PUBLIC ${HALCONFDIR}) + +# linker script +find_file(LDSCRIPT ${MCU_LDSCRIPT}.ld + ${QMK_KEYBOARD_FOLDER}/ld + ${CMAKE_SOURCE_DIR}/platforms/chibios/boards/${BOARD}/ld + ${CMAKE_SOURCE_DIR}/platforms/chibios/boards/common/ld ) -# F3 HAL specific +# os/hal/hal.mk +target_sources(qmk PUBLIC + ${CHIBIOS}/os/hal/src/hal.c + ${CHIBIOS}/os/hal/src/hal_st.c + ${CHIBIOS}/os/hal/src/hal_buffers.c + ${CHIBIOS}/os/hal/src/hal_queues.c + ${CHIBIOS}/os/hal/src/hal_flash.c + ${CHIBIOS}/os/hal/src/hal_mmcsd.c + ${CHIBIOS}/os/hal/src/hal_adc.c + ${CHIBIOS}/os/hal/src/hal_can.c + ${CHIBIOS}/os/hal/src/hal_crypto.c + ${CHIBIOS}/os/hal/src/hal_dac.c + ${CHIBIOS}/os/hal/src/hal_efl.c + ${CHIBIOS}/os/hal/src/hal_gpt.c + ${CHIBIOS}/os/hal/src/hal_i2c.c + ${CHIBIOS}/os/hal/src/hal_i2s.c + ${CHIBIOS}/os/hal/src/hal_icu.c + ${CHIBIOS}/os/hal/src/hal_mac.c + ${CHIBIOS}/os/hal/src/hal_mmc_spi.c + ${CHIBIOS}/os/hal/src/hal_pal.c + ${CHIBIOS}/os/hal/src/hal_pwm.c + ${CHIBIOS}/os/hal/src/hal_rtc.c + ${CHIBIOS}/os/hal/src/hal_sdc.c + ${CHIBIOS}/os/hal/src/hal_serial.c + ${CHIBIOS}/os/hal/src/hal_serial_usb.c + ${CHIBIOS}/os/hal/src/hal_sio.c + ${CHIBIOS}/os/hal/src/hal_spi.c + ${CHIBIOS}/os/hal/src/hal_trng.c + ${CHIBIOS}/os/hal/src/hal_uart.c + ${CHIBIOS}/os/hal/src/hal_usb.c + ${CHIBIOS}/os/hal/src/hal_wdg.c + ${CHIBIOS}/os/hal/src/hal_wspi.c +) target_include_directories(qmk PUBLIC - ${CHIBIOS}/os/hal/ports/common/ARMCMx ${CHIBIOS}/os/hal/include - ${CHIBIOS}/os/hal/ports/STM32/STM32F3xx - - ${CHIBIOS}/os/common/portability/GCC - ${CHIBIOS}/os/common/ports/ARM-common - ${CHIBIOS}/os/common/ports/ARMv7-M - ${CHIBIOS}/os/common/startup/ARMCMx/compilers/GCC - ${CHIBIOS}/os/common/startup/ARMCMx/devices/STM32F3xx - ${CHIBIOS}/os/common/ext/ARM/CMSIS/Core/Include - ${CHIBIOS}/os/common/ext/ST/STM32F3xx - - ${CHIBIOS}/os/hal/ports/STM32/LLD/ADCv3 - ${CHIBIOS}/os/hal/ports/STM32/LLD/CANv1 - ${CHIBIOS}/os/hal/ports/STM32/LLD/DACv1 - ${CHIBIOS}/os/hal/ports/STM32/LLD/DMAv1 - ${CHIBIOS}/os/hal/ports/STM32/LLD/EXTIv1 - ${CHIBIOS}/os/hal/ports/STM32/LLD/GPIOv2 - ${CHIBIOS}/os/hal/ports/STM32/LLD/I2Cv2 - ${CHIBIOS}/os/hal/ports/STM32/LLD/RTCv2 - # ${CHIBIOS}/os/hal/ports/STM32/LLD/SDIOv1 - ${CHIBIOS}/os/hal/ports/STM32/LLD/SPIv1 - ${CHIBIOS}/os/hal/ports/STM32/LLD/SYSTICKv1 - ${CHIBIOS}/os/hal/ports/STM32/LLD/TIMv1 - # ${CHIBIOS}/os/hal/ports/STM32/LLD/USART - ${CHIBIOS}/os/hal/ports/STM32/LLD/USARTv2 - ${CHIBIOS}/os/hal/ports/STM32/LLD/USBv1 - ${CHIBIOS}/os/hal/ports/STM32/LLD/xWDGv1 ) -# source files for ChibiOS HAL -set(CHIBIOS_HAL_SRCS - - # startup code - crt1.c - vectors.S - crt0_v7m.S - - nvic.c - stm32_isr.c - - # HAL-OSAL files - hal.c - hal_st.c - - hal_buffers.c - hal_queues.c - hal_flash.c - hal_mmcsd.c - - hal_adc.c - hal_can.c - # hal_crypto.c - hal_dac.c - hal_efl.c - hal_gpt.c - hal_i2c.c - hal_i2s.c - hal_icu.c - hal_mac.c - hal_mmc_spi.c - hal_pal.c - hal_pwm.c - hal_rtc.c - hal_sdc.c - hal_serial.c - hal_serial_usb.c - hal_sio.c - hal_spi.c - hal_trng.c - hal_uart.c - hal_usb.c - hal_wdg.c - hal_wspi.c - - # LLD HAL files - hal_lld.c - - hal_adc_lld.c - hal_can_lld.c - hal_crypto_lld.c - hal_dac_lld.c - stm32_dma.c - stm32_exti.c - hal_pal_lld.c - hal_i2c_lld.c - hal_mac_lld.c - hal_usb_lld.c - hal_wspi_lld.c - hal_trng_lld.c - hal_rtc_lld.c - hal_sdc_lld.c - - hal_i2s_lld.c - hal_spi_v2_lld.c - - hal_st_lld.c - hal_gpt_lld.c - hal_icu_lld.c - hal_pwm_lld.c - - hal_serial_lld.c - hal_uart_lld.c - - hal_wdg_lld.c - - # OSAL - osal.c - - board.c +# os/hal/osal/rt-nil/osal.mk +target_sources(qmk PUBLIC + ${CHIBIOS}/os/hal/osal/rt-nil/osal.c ) - -foreach(SRC_FILE ${CHIBIOS_HAL_SRCS}) - - set(CHIBIOS_HAL_SRC_FILE SRC_FILE -NOTFOUND) - - find_file(CHIBIOS_HAL_SRC_FILE ${SRC_FILE} - PATHS - - ${CHIBIOS}/os/common/ports/ARMv7-M/compilers/GCC - ${CHIBIOS}/os/common/startup/ARMCMx/compilers/GCC - - ${CHIBIOS}/os/hal/src - ${CHIBIOS}/os/hal/ports/common/ARMCMx - - ${CHIBIOS}/os/hal/ports/STM32/STM32F3xx - - ${CHIBIOS}/os/hal/ports/STM32/STM32F3xx - ${CHIBIOS}/os/hal/ports/STM32/LLD/ADCv3 - ${CHIBIOS}/os/hal/ports/STM32/LLD/CANv1 - ${CHIBIOS}/os/hal/ports/STM32/LLD/DACv1 - ${CHIBIOS}/os/hal/ports/STM32/LLD/DMAv1 - ${CHIBIOS}/os/hal/ports/STM32/LLD/EXTIv1 - ${CHIBIOS}/os/hal/ports/STM32/LLD/GPIOv2 - ${CHIBIOS}/os/hal/ports/STM32/LLD/I2Cv2 - ${CHIBIOS}/os/hal/ports/STM32/LLD/RTCv2 - ${CHIBIOS}/os/hal/ports/STM32/LLD/SPIv2 - ${CHIBIOS}/os/hal/ports/STM32/LLD/SYSTICKv1 - ${CHIBIOS}/os/hal/ports/STM32/LLD/TIMv1 - ${CHIBIOS}/os/hal/ports/STM32/LLD/USARTv1 - ${CHIBIOS}/os/hal/ports/STM32/LLD/USBv1 - ${CHIBIOS}/os/hal/ports/STM32/LLD/xWDGv1 - - # ${OSHAL_PATH} - - # ${CHIBIOS_BOARD_DEFINITIONS_PATH} - - CMAKE_FIND_ROOT_PATH_BOTH - ) - if(EXISTS "${CHIBIOS_HAL_SRC_FILE}") - target_sources(qmk PUBLIC ${CHIBIOS_HAL_SRC_FILE}) - endif() -endforeach() - -# chibios target_include_directories(qmk PUBLIC - # ${CHIBIOS}/os/hal/include - # ${CHIBIOS}/os/hal/osal/sb - # ${CHIBIOS}/os/common/portability/GCC - # ${CHIBIOS}/os/sb/user - # ${CHIBIOS}/os/sb/common - - ${CHIBIOS}/os - ${CHIBIOS}/os/license - ${CHIBIOS}/os/hal/ports/common/ARMCMx - ${CHIBIOS}/os/hal/include ${CHIBIOS}/os/hal/osal/rt-nil - ${CHIBIOS}/os/oslib/include +) + +# os/rt/rt.mk +target_sources(qmk PUBLIC + ${CHIBIOS}/os/rt/src/chsys.c + ${CHIBIOS}/os/rt/src/chrfcu.c + ${CHIBIOS}/os/rt/src/chdebug.c + ${CHIBIOS}/os/rt/src/chtrace.c + ${CHIBIOS}/os/rt/src/chvt.c + ${CHIBIOS}/os/rt/src/chschd.c + ${CHIBIOS}/os/rt/src/chinstances.c + ${CHIBIOS}/os/rt/src/chthreads.c + ${CHIBIOS}/os/rt/src/chsys.c + ${CHIBIOS}/os/rt/src/chrfcu.c + ${CHIBIOS}/os/rt/src/chdebug.c + ${CHIBIOS}/os/rt/src/chtrace.c + ${CHIBIOS}/os/rt/src/chvt.c + ${CHIBIOS}/os/rt/src/chschd.c + ${CHIBIOS}/os/rt/src/chinstances.c + ${CHIBIOS}/os/rt/src/chthreads.c + ${CHIBIOS}/os/rt/src/chtm.c + ${CHIBIOS}/os/rt/src/chstats.c + ${CHIBIOS}/os/rt/src/chregistry.c + ${CHIBIOS}/os/rt/src/chsem.c + ${CHIBIOS}/os/rt/src/chmtx.c + ${CHIBIOS}/os/rt/src/chcond.c + ${CHIBIOS}/os/rt/src/chevents.c + ${CHIBIOS}/os/rt/src/chmsg.c + ${CHIBIOS}/os/rt/src/chdynamic.c +) +target_include_directories(qmk PUBLIC ${CHIBIOS}/os/rt/include - ${CHIBIOS}/os/hal/ports/STM32/${MCU_SERIES} - ${CHIBIOS}/os/common/ports/ARMv7-M - ${CHIBIOS}/os/common/ports/ARMv7-M/compilers/GCC - ${CHIBIOS}/os/common/abstractions/cmsis_os - ${CHIBIOS}/os/common/startup/ARMCMx/compilers/GCC - ${CHIBIOS}/os/common/ext/CMSIS/include - ${CHIBIOS}/os/common/ext/CMSIS/ST/${MCU_SERIES} +) + +# os/oslib/oslib.mk +target_sources(qmk PUBLIC + ${CHIBIOS}/os/oslib/src/chmboxes.c + ${CHIBIOS}/os/oslib/src/chmemcore.c + ${CHIBIOS}/os/oslib/src/chmemheaps.c + ${CHIBIOS}/os/oslib/src/chmempools.c + ${CHIBIOS}/os/oslib/src/chpipes.c + ${CHIBIOS}/os/oslib/src/chobjcaches.c + ${CHIBIOS}/os/oslib/src/chdelegates.c + ${CHIBIOS}/os/oslib/src/chfactory.c +) +target_include_directories(qmk PUBLIC + ${CHIBIOS}/os/oslib/include +) + +# os/hal/lib/streams/streams.mk +target_sources(qmk PUBLIC + ${CHIBIOS}/os/hal/lib/streams/chprintf.c + ${CHIBIOS}/os/hal/lib/streams/chscanf.c + ${CHIBIOS}/os/hal/lib/streams/memstreams.c + ${CHIBIOS}/os/hal/lib/streams/nullstreams.c + ${CHIBIOS}/os/hal/lib/streams/bufstreams.c +) +target_include_directories(qmk PUBLIC + ${CHIBIOS}/os/hal/lib/streams +) + +# resume platform.mk +target_sources(qmk PUBLIC + ${CHIBIOS}/os/various/syscalls.c +) +target_include_directories(qmk PUBLIC + ${CHIBIOS}/os/license + ${CHIBIOS}/os/oslib/include + ${CHIBIOS}/os/various ) \ No newline at end of file diff --git a/cmake/ParseMakefile.cmake b/cmake/ParseMakefile.cmake index 6dee007b13..2e913777a0 100644 --- a/cmake/ParseMakefile.cmake +++ b/cmake/ParseMakefile.cmake @@ -12,14 +12,19 @@ function(ParseMakefile MKFile) endfunction() macro(_ParseMakefile MKFile) + message(STATUS "Parsing ${MKFile}") file(READ "${MKFile}" FileContents) - string(REPLACE "\\\n" "" FileContents ${FileContents}) - string(REPLACE "\n" ";" FileLines ${FileContents}) + string(REGEX REPLACE "\\\\\r?\n *" " " FileContents ${FileContents}) + string(REGEX REPLACE "\r?\n" ";" FileLines ${FileContents}) list(REMOVE_ITEM FileLines "") foreach(line ${FileLines}) - # if(line MATCHES "$\\((.+)\\)") - # string(REPLACE "(${CMAKE_MATCH_1})" "{${CMAKE_MATCH_1}}" line ${line}) + # if(line MATCHES "\\$\\((.+)\\)") + # set(MAKE_VARIABLE "${CMAKE_MATCH_1}") + # string(REPLACE "$(${MAKE_VARIABLE})" "${${MAKE_VARIABLE}}" line ${line}) # endif() + # message(STATUS "From: ${line}") + string(REGEX REPLACE "\\$\\(([^\\(\\)]+)\\)" "${CHIBIOS}" line ${line}) + # message(STATUS "To : ${line}") # if(line MATCHES "^include (.+)$") # set(MAKE_CHILD ${CMAKE_MATCH_1}) # message(STATUS "Reading ${MAKE_CHILD}") diff --git a/cmake/chibios/LLD/ADCv3.cmake b/cmake/chibios/LLD/ADCv3.cmake new file mode 100644 index 0000000000..8eabe28b4c --- /dev/null +++ b/cmake/chibios/LLD/ADCv3.cmake @@ -0,0 +1,2 @@ +target_sources(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/ADCv3/hal_adc_lld.c) +target_include_directories(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/ADCv3) \ No newline at end of file diff --git a/cmake/chibios/LLD/CANv1.cmake b/cmake/chibios/LLD/CANv1.cmake new file mode 100644 index 0000000000..cc4c38730a --- /dev/null +++ b/cmake/chibios/LLD/CANv1.cmake @@ -0,0 +1,2 @@ +target_sources(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/CANv1/hal_can_lld.c) +target_include_directories(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/CANv1) \ No newline at end of file diff --git a/cmake/chibios/LLD/DACv1.cmake b/cmake/chibios/LLD/DACv1.cmake new file mode 100644 index 0000000000..9e38b43095 --- /dev/null +++ b/cmake/chibios/LLD/DACv1.cmake @@ -0,0 +1,2 @@ +target_sources(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/DACv1/hal_dac_lld.c) +target_include_directories(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/DACv1) \ No newline at end of file diff --git a/cmake/chibios/LLD/DMAv1.cmake b/cmake/chibios/LLD/DMAv1.cmake new file mode 100644 index 0000000000..cca7b3ef5f --- /dev/null +++ b/cmake/chibios/LLD/DMAv1.cmake @@ -0,0 +1,2 @@ +target_sources(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/DMAv1/stm32_dma.c) +target_include_directories(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/DMAv1) \ No newline at end of file diff --git a/cmake/chibios/LLD/EXTIv1.cmake b/cmake/chibios/LLD/EXTIv1.cmake new file mode 100644 index 0000000000..f623222046 --- /dev/null +++ b/cmake/chibios/LLD/EXTIv1.cmake @@ -0,0 +1,2 @@ +target_sources(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/EXTIv1/stm32_exti.c) +target_include_directories(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/EXTIv1) \ No newline at end of file diff --git a/cmake/chibios/LLD/GPIOv2.cmake b/cmake/chibios/LLD/GPIOv2.cmake new file mode 100644 index 0000000000..9e01767fdd --- /dev/null +++ b/cmake/chibios/LLD/GPIOv2.cmake @@ -0,0 +1,2 @@ +target_sources(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/GPIOv2/hal_pal_lld.c) +target_include_directories(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/GPIOv2) \ No newline at end of file diff --git a/cmake/chibios/LLD/I2Cv2.cmake b/cmake/chibios/LLD/I2Cv2.cmake new file mode 100644 index 0000000000..19c8916981 --- /dev/null +++ b/cmake/chibios/LLD/I2Cv2.cmake @@ -0,0 +1,7 @@ +if(${USE_HAL_I2C_FALLBACK}) + target_sources(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/I2C/hal_i2c_lld.c) + target_include_directories(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/I2C) +else() + target_sources(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/I2Cv2/hal_i2c_lld.c) + target_include_directories(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/I2Cv2) +endif() \ No newline at end of file diff --git a/cmake/chibios/LLD/RTCv2.cmake b/cmake/chibios/LLD/RTCv2.cmake new file mode 100644 index 0000000000..e07111389a --- /dev/null +++ b/cmake/chibios/LLD/RTCv2.cmake @@ -0,0 +1,2 @@ +target_sources(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/RTCv2/hal_rtc_lld.c) +target_include_directories(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/RTCv2) \ No newline at end of file diff --git a/cmake/chibios/LLD/SPIv2.cmake b/cmake/chibios/LLD/SPIv2.cmake new file mode 100644 index 0000000000..ff34e2e4bb --- /dev/null +++ b/cmake/chibios/LLD/SPIv2.cmake @@ -0,0 +1,5 @@ +target_sources(qmk PUBLIC + ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/SPIv2/hal_i2s_lld.c + ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/SPIv2/hal_spi_v2_lld.c +) +target_include_directories(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/SPIv2) \ No newline at end of file diff --git a/cmake/chibios/LLD/SYSTICKv1.cmake b/cmake/chibios/LLD/SYSTICKv1.cmake new file mode 100644 index 0000000000..dcdb4bb8c4 --- /dev/null +++ b/cmake/chibios/LLD/SYSTICKv1.cmake @@ -0,0 +1,2 @@ +target_sources(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/SYSTICKv1/hal_st_lld.c) +target_include_directories(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/SYSTICKv1) \ No newline at end of file diff --git a/cmake/chibios/LLD/TIMv1.cmake b/cmake/chibios/LLD/TIMv1.cmake new file mode 100644 index 0000000000..7714c08620 --- /dev/null +++ b/cmake/chibios/LLD/TIMv1.cmake @@ -0,0 +1,6 @@ +target_sources(qmk PUBLIC +${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/TIMv1/hal_gpt_lld.c +${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/TIMv1/hal_icu_lld.c +${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/TIMv1/hal_pwm_lld.c +) +target_include_directories(qmk PUBLIC ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/TIMv1) \ No newline at end of file diff --git a/cmake/chibios/LLD/USARTv2.cmake b/cmake/chibios/LLD/USARTv2.cmake new file mode 100644 index 0000000000..aa01d68c6c --- /dev/null +++ b/cmake/chibios/LLD/USARTv2.cmake @@ -0,0 +1,9 @@ +target_sources(qmk PUBLIC + ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/USARTv2/hal_serial_lld.c + ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/USARTv2/hal_sio_lld.c + ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/USARTv2/hal_uart_lld.c +) +target_include_directories(qmk PUBLIC + ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/USART + ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/USARTv2 +) \ No newline at end of file diff --git a/cmake/chibios/LLD/USBv1.cmake b/cmake/chibios/LLD/USBv1.cmake new file mode 100644 index 0000000000..e92690993c --- /dev/null +++ b/cmake/chibios/LLD/USBv1.cmake @@ -0,0 +1,6 @@ +target_sources(qmk PUBLIC + ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/USBv1/hal_usb_lld.c +) +target_include_directories(qmk PUBLIC + ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/USBv1 +) \ No newline at end of file diff --git a/cmake/chibios/LLD/xWDGv1.cmake b/cmake/chibios/LLD/xWDGv1.cmake new file mode 100644 index 0000000000..6c5e40f9c0 --- /dev/null +++ b/cmake/chibios/LLD/xWDGv1.cmake @@ -0,0 +1,6 @@ +target_sources(qmk PUBLIC + ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/xWDGv1/hal_wdg_lld.c +) +target_include_directories(qmk PUBLIC + ${CHIBIOS}/os/hal/ports/${MCU_PORT_NAME}/LLD/xWDGv1 +) \ No newline at end of file diff --git a/cmake/chibios/ports/ARMv7-M.cmake b/cmake/chibios/ports/ARMv7-M.cmake new file mode 100644 index 0000000000..73662b453e --- /dev/null +++ b/cmake/chibios/ports/ARMv7-M.cmake @@ -0,0 +1,10 @@ +# os/common/ports/ARMv7/compilers/GCC/mk/port.mk +target_sources(qmk PUBLIC + ${CHIBIOS}/os/common/ports/ARMv7-M/chcore.c + ${CHIBIOS}/os/common/ports/ARMv7-M/compilers/GCC/chcoreasm.S +) +target_include_directories(qmk PUBLIC + ${CHIBIOS}/os/common/portability/GCC + ${CHIBIOS}/os/common/ports/ARM-common + ${CHIBIOS}/os/common/ports/ARMv7-M +) \ No newline at end of file diff --git a/cmake/chibios/ports/STM32F3xx.cmake b/cmake/chibios/ports/STM32F3xx.cmake new file mode 100644 index 0000000000..5c410e3b58 --- /dev/null +++ b/cmake/chibios/ports/STM32F3xx.cmake @@ -0,0 +1,25 @@ +# os/hal/ports/STM32/STM32F3xx/platform.mk +target_sources(qmk PUBLIC + ${CHIBIOS}/os/hal/ports/common/ARMCMx/nvic.c + ${CHIBIOS}/os/hal/ports/STM32/STM32F3xx/stm32_isr.c + ${CHIBIOS}/os/hal/ports/STM32/STM32F3xx/hal_lld.c + ${CHIBIOS}/os/hal/ports/STM32/STM32F3xx/hal_efl_lld.c +) +target_include_directories(qmk PUBLIC + ${CHIBIOS}/os/hal/ports/common/ARMCMx + ${CHIBIOS}/os/hal/ports/STM32/STM32F3xx +) +include(chibios/LLD/ADCv3) +include(chibios/LLD/CANv1) +include(chibios/LLD/DACv1) +include(chibios/LLD/DMAv1) +include(chibios/LLD/EXTIv1) +include(chibios/LLD/GPIOv2) +include(chibios/LLD/I2Cv2) +include(chibios/LLD/RTCv2) +include(chibios/LLD/SPIv2) +include(chibios/LLD/SYSTICKv1) +include(chibios/LLD/TIMv1) +include(chibios/LLD/USARTv2) +include(chibios/LLD/USBv1) +include(chibios/LLD/xWDGv1) \ No newline at end of file diff --git a/platforms/chibios/CMakeLists.txt b/platforms/chibios/CMakeLists.txt index 4c0b47402f..e68502d773 100644 --- a/platforms/chibios/CMakeLists.txt +++ b/platforms/chibios/CMakeLists.txt @@ -1,4 +1,4 @@ -find_package(chibios REQUIRED) +find_package(Chibios REQUIRED) target_link_options(qmk PUBLIC -mcpu=${QMK_MCU} @@ -30,8 +30,12 @@ else() ) endif() -# add_library(platforms_chibios) +target_sources(qmk PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/syscall-fallbacks.c + ${CMAKE_CURRENT_SOURCE_DIR}/wait.c + ${CMAKE_CURRENT_SOURCE_DIR}/synchronization_util.c +) + target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/boards/common/configs) -target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD}/configs) -# target_link_libraries(platforms_chibios ${QMK_TARGET}) \ No newline at end of file +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD}/configs) \ No newline at end of file diff --git a/quantum/CMakeLists.txt b/quantum/CMakeLists.txt index e5b5d683bf..e00ff015b9 100644 --- a/quantum/CMakeLists.txt +++ b/quantum/CMakeLists.txt @@ -33,7 +33,3 @@ target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bootmagic) # target_link_libraries(quantum platforms_${QMK_PLATFORM}) # target_link_libraries(quantum tmk_core_protocol) # target_link_libraries(quantum tmk_core_protocol_${QMK_PROTOCOL}) - -# if no printf -target_sources(qmk PUBLIC ${CMAKE_SOURCE_DIR}/lib/printf/src/printf/printf.c) -target_include_directories(qmk PUBLIC ${CMAKE_SOURCE_DIR}/lib/printf/src/printf) \ No newline at end of file diff --git a/tmk_core/protocol/chibios/CMakeLists.txt b/tmk_core/protocol/chibios/CMakeLists.txt index ab80a632d4..eca5928607 100644 --- a/tmk_core/protocol/chibios/CMakeLists.txt +++ b/tmk_core/protocol/chibios/CMakeLists.txt @@ -12,7 +12,11 @@ target_sources(qmk PUBLIC usb_util.c ) -find_package(chibios REQUIRED) +find_package(Chibios REQUIRED) target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/lufa_utils) \ No newline at end of file +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/lufa_utils) + +# if no printf +target_sources(qmk PUBLIC ${CMAKE_SOURCE_DIR}/lib/printf/src/printf/printf.c) +target_include_directories(qmk PUBLIC ${CMAKE_SOURCE_DIR}/lib/printf/src/printf) \ No newline at end of file diff --git a/tmk_core/protocol/lufa/CMakeLists.txt b/tmk_core/protocol/lufa/CMakeLists.txt index 690e5a0abb..84012a7bc6 100644 --- a/tmk_core/protocol/lufa/CMakeLists.txt +++ b/tmk_core/protocol/lufa/CMakeLists.txt @@ -19,7 +19,7 @@ target_sources(qmk PUBLIC usb_util.c ) -find_package(lufa REQUIRED) +find_package(Lufa REQUIRED) # target_compile_definitions(lufa PUBLIC ${COMPILE_DEFINITIONS}) target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) From 5dd8efc7c0d8178677462672bdb77c355a33eac9 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Thu, 6 Apr 2023 16:22:14 -0400 Subject: [PATCH 25/26] chibios compiling, layout keymaps --- .clangd | 3 +- .vscode/settings.json | 2 +- .vscode/tasks.json | 12 +- CMakeLists.txt | 156 +++++++++++------------ cmake/AddKeyboard.cmake | 2 +- cmake/ConfigureKeyboard.cmake | 2 +- cmake/Findchibios.cmake | 65 +++++++++- cmake/GetKeymaps.cmake | 51 ++++++++ cmake/ParseMakefile.cmake | 81 +++++++----- cmake/ProcessKeyboard.cmake | 17 +++ cmake/ResolveKeyboard.cmake | 33 +++-- cmake/ResolveToolchain.cmake | 3 + cmake/ValidateJson.cmake | 10 +- cmake/features/backlight.cmake | 2 +- cmake/features/eeprom.cmake | 32 +++-- cmake/features/fnv.cmake | 9 ++ cmake/features/matrix.cmake | 9 ++ cmake/features/oled.cmake | 5 +- cmake/toolchains/arm-none-eabi.cmake | 103 +++++++-------- cmake/toolchains/avr.cmake | 19 +-- keyboards/CMakeLists.txt | 5 +- keyboards/planck/rev6/info.json | 1 + keyboards/planck/rev6_drop/info.json | 1 + platforms/chibios/CMakeLists.txt | 24 +++- quantum/CMakeLists.txt | 4 +- quantum/logging/CMakeLists.txt | 19 +++ tmk_core/protocol/chibios/CMakeLists.txt | 7 +- 27 files changed, 453 insertions(+), 224 deletions(-) create mode 100644 cmake/GetKeymaps.cmake create mode 100644 cmake/ProcessKeyboard.cmake create mode 100644 cmake/features/fnv.cmake create mode 100644 cmake/features/matrix.cmake create mode 100644 quantum/logging/CMakeLists.txt diff --git a/.clangd b/.clangd index dd5cdf855f..18790456cc 100644 --- a/.clangd +++ b/.clangd @@ -1,2 +1,3 @@ CompileFlags: - Remove: -mcall-prologues \ No newline at end of file + Remove: -mcall-prologues + Add: -nostdinc \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index c81ed8140a..1b5fbafd4d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,7 +6,7 @@ "files.exclude": { "**/.build": true, // "**/*.hex": true, - "**/*.bin": true, + // "**/*.bin": true, "**/*.uf2": true }, "files.associations": { diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 14618443d5..f1b4467496 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -16,7 +16,7 @@ { "label": "Only Load Keyboard", "type": "shell", - "command": "cmake -D QMK_KEYBOARD_FOLDER=\"${input:all_keyboards}\" -D QMK_KEYMAP_FOLDER=\"${input:keymap}\" -P ${workspaceFolder}/cmake/ConfigureKeyboard.cmake", + "command": "cmake -D QMK_KEYBOARD_FOLDER=\"${input:all_keyboards}\" -D QMK_KEYMAP_FOLDER=\"${input:keyboard_keymap}\" -P ${workspaceFolder}/cmake/ConfigureKeyboard.cmake", "problemMatcher": [] }, { @@ -100,5 +100,15 @@ "default" ] }, + { + "id": "keyboard_keymap", + "type": "command", + "command": "shellCommand.execute", + "args": { + "command": "cmake -D QMK_KEYBOARD_FOLDER=\"${input:all_keyboards}\" -P ${workspaceFolder}/cmake/GetKeymaps.cmake && type build\\keyboard_keymaps", + "description": "Keymap:", + "default": "" + }, + }, ] } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index b96b9a3ccc..74a4b1c8e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,10 +5,11 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") include(UpdateSubmodule) include(ResolveKeyboard) include(ValidateJson) +include(ProcessKeyboard) set(QMK_KEYBOARDS_FOLDER "${CMAKE_SOURCE_DIR}/keyboards") -function (_get_all_cmake_targets out_var current_dir) +function(_get_all_cmake_targets out_var current_dir) get_property(targets DIRECTORY ${current_dir} PROPERTY BUILDSYSTEM_TARGETS) get_property(subdirs DIRECTORY ${current_dir} PROPERTY SUBDIRECTORIES) @@ -21,86 +22,85 @@ function (_get_all_cmake_targets out_var current_dir) endfunction() if(NOT DEFINED QMK_KEYBOARD) + # configure step - populate targets + project(qmk_firmware) -# configure step - populate targets - -project(qmk_firmware) - -add_subdirectory(keyboards) + add_subdirectory(keyboards) else() + # build step + if(NOT DEFINED QMK_KEYMAP_FOLDER) + set(QMK_KEYMAP_FOLDER "default") + endif() -# build step - -if(NOT DEFINED QMK_KEYMAP_FOLDER) - set(QMK_KEYMAP_FOLDER "default") -endif() - -resolve_keyboard(${QMK_KEYBOARD_FOLDER} QMK_KEYBOARD_FOLDER_ABS) -cmake_path(IS_PREFIX QMK_KEYBOARDS_FOLDER "${QMK_KEYBOARD_FOLDER_ABS}" IS_KEYBOARDS_FOLDER) -resolve_config_h(${QMK_KEYBOARD_FOLDER_ABS} QMK_KEYBOARD_CONFIG_H) -resolve_keyboard_h(${QMK_KEYBOARD_FOLDER_ABS} QMK_KEYBOARD_H) -resolve_keymap_c(${QMK_KEYBOARD_FOLDER_ABS} ${QMK_KEYMAP_FOLDER} QMK_KEYMAP_C) - -message(STATUS "config.h: ${QMK_KEYBOARD_CONFIG_H}") -message(STATUS "keyboard.h: ${QMK_KEYBOARD_H}") -message(STATUS "keymap.c: ${QMK_KEYMAP_C}") - -validate_json(${QMK_KEYBOARD_FOLDER_ABS}/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) - -project(${QMK_KEYBOARD} - LANGUAGES C CXX ASM - HOMEPAGE_URL ${URL} - VERSION ${DEVICE_VER}) - -string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" VERSION_MATCH ${DEVICE_VER}) -set(VERSION_MAJOR ${CMAKE_MATCH_1}) -set(VERSION_MINOR ${CMAKE_MATCH_2}) -set(VERSION_PATCH ${CMAKE_MATCH_3}) -math(EXPR VERSION_C_EVAL "${VERSION_MAJOR} * 10000 + ${VERSION_MINOR} * 100 + ${VERSION_PATCH}" OUTPUT_FORMAT HEXADECIMAL) - -add_compile_options( - -include ${QMK_KEYBOARD_CONFIG_H} -) - -add_compile_definitions( - QMK_KEYBOARD_H="${QMK_KEYBOARD_H}" - KEYMAP_C="${QMK_KEYMAP_C}" - MATRIX_ROWS=6 - MATRIX_COLS=15 - VENDOR_ID=${VENDOR_ID} - PRODUCT_ID=${PRODUCT_ID} - DEVICE_VER=${VERSION_C_EVAL} - MANUFACTURER="${MANUFACTURER}" - PRODUCT="${KEYBOARD_NAME}" -) - -# if(EXISTS ${QMK_KEYBOARD_FOLDER_ABS}/CMakeLists.txt) - # add_subdirectory(${QMK_KEYBOARD_FOLDER_ABS}) -# else() - file(GLOB KEYBOARD_SRC "${QMK_KEYBOARD_FOLDER_ABS}/*.c") - list(REMOVE_ITEM KEYBOARD_SRC "${QMK_KEYBOARD_KEYMAP}") - add_qmk_executable(${TARGET_NAME} ${KEYBOARD_SRC}) -# endif() - -add_library(qmk) - -resolve_keyboard_includes(${QMK_KEYBOARD_FOLDER_ABS}) - -add_subdirectory(quantum) -add_subdirectory(platforms) -add_subdirectory(tmk_core/protocol) - -include(features/oled) -include(features/backlight) -include(features/eeprom) + resolve_keyboard(${QMK_KEYBOARD_FOLDER} QMK_KEYBOARD_FOLDER_ABS) + process_keyboard() + cmake_path(IS_PREFIX QMK_KEYBOARDS_FOLDER "${QMK_KEYBOARD_FOLDER_ABS}" IS_KEYBOARDS_FOLDER) + resolve_config_h(${QMK_KEYBOARD_FOLDER_ABS} QMK_KEYBOARD_CONFIG_H) + resolve_keyboard_h(${QMK_KEYBOARD_FOLDER_ABS} QMK_KEYBOARD_H) + resolve_keymap_c(${QMK_KEYBOARD_FOLDER_ABS} ${QMK_KEYMAP_FOLDER} QMK_KEYMAP_C) + message(STATUS "config.h: ${QMK_KEYBOARD_CONFIG_H}") + message(STATUS "keyboard.h: ${QMK_KEYBOARD_H}") + message(STATUS "keymap.c: ${QMK_KEYMAP_C}") + + + project(${QMK_KEYBOARD} + LANGUAGES C CXX ASM + HOMEPAGE_URL ${URL} + VERSION ${DEVICE_VER}) + + string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" VERSION_MATCH ${DEVICE_VER}) + set(VERSION_MAJOR ${CMAKE_MATCH_1}) + set(VERSION_MINOR ${CMAKE_MATCH_2}) + set(VERSION_PATCH ${CMAKE_MATCH_3}) + math(EXPR VERSION_C_EVAL "${VERSION_MAJOR} * 10000 + ${VERSION_MINOR} * 100 + ${VERSION_PATCH}" OUTPUT_FORMAT HEXADECIMAL) + + # add_compile_options( + # -include ${QMK_KEYBOARD_CONFIG_H} + # ) + add_compile_definitions( + QMK_KEYBOARD_H="${QMK_KEYBOARD_H}" + KEYBOARD_${QMK_KEYBOARD} + KEYMAP_C="${QMK_KEYMAP_C}" + MATRIX_ROWS=8 + MATRIX_COLS=6 + VENDOR_ID=${VENDOR_ID} + PRODUCT_ID=${PRODUCT_ID} + DEVICE_VER=${VERSION_C_EVAL} + MANUFACTURER="${MANUFACTURER}" + PRODUCT="${KEYBOARD_NAME}" + ) + + if(DEFINED DIODE_DIRECTION) + add_compile_definitions(DIODE_DIRECTION=${DIODE_DIRECTION}) + endif() + + include_directories(${CMAKE_SOURCE_DIR}) + + # if(EXISTS ${QMK_KEYBOARD_FOLDER_ABS}/CMakeLists.txt) + # add_subdirectory(${QMK_KEYBOARD_FOLDER_ABS}) + # else() + file(GLOB KEYBOARD_SRC "${QMK_KEYBOARD_FOLDER_ABS}/*.c") + list(REMOVE_ITEM KEYBOARD_SRC "${QMK_KEYMAP_C}") + add_qmk_executable(${TARGET_NAME} ${KEYBOARD_SRC}) + + # endif() + # add_library(qmk) + + target_precompile_headers(qmk PUBLIC + ${QMK_KEYBOARD_CONFIG_H} + ) + + resolve_keyboard_includes(${QMK_KEYBOARD_FOLDER_ABS}) + + add_subdirectory(quantum) + add_subdirectory(platforms) + add_subdirectory(tmk_core/protocol) + + include(features/oled) + include(features/backlight) + include(features/eeprom) + include(features/matrix) + include(features/fnv) endif() diff --git a/cmake/AddKeyboard.cmake b/cmake/AddKeyboard.cmake index a18110b772..6605afef29 100644 --- a/cmake/AddKeyboard.cmake +++ b/cmake/AddKeyboard.cmake @@ -61,7 +61,7 @@ macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER) STAMP_DIR ${CMAKE_SOURCE_DIR}/build/stamp LOG_DIR ${CMAKE_SOURCE_DIR}/build/log INSTALL_DIR ${CMAKE_SOURCE_DIR}/build/install - INSTALL_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/build/${TARGET_NAME}.hex ${CMAKE_SOURCE_DIR}/${TARGET_NAME}.hex + INSTALL_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/build/${TARGET_NAME}${QMK_EXTENSION} ${CMAKE_SOURCE_DIR}/${TARGET_NAME}${QMK_EXTENSION} # this seems to work well for all systems so far - not sure if it'd be useful to customize CMAKE_GENERATOR "Unix Makefiles" CMAKE_ARGS diff --git a/cmake/ConfigureKeyboard.cmake b/cmake/ConfigureKeyboard.cmake index f6d084725a..aba7f3d1aa 100644 --- a/cmake/ConfigureKeyboard.cmake +++ b/cmake/ConfigureKeyboard.cmake @@ -39,6 +39,6 @@ endif() string(JSON MANUFACTURER GET ${JSON_STRING} manufacturer) set(TARGET_NAME "${KEYBOARD_SLUG}_${KEYMAP_NAME}") -file(APPEND "${CMAKE_SOURCE_DIR}/build/targets" "${TARGET_NAME}|${KEYBOARD_NAME} with ${QMK_KEYMAP_FOLDER}|${QMK_KEYBOARD_FOLDER}|Made by: ${MANUFACTURER}\n") +file(APPEND "${CMAKE_SOURCE_DIR}/build/targets" "${TARGET_NAME}|${KEYBOARD_NAME} with ${QMK_KEYMAP_FOLDER}|${QMK_KEYBOARD_FOLDER}:${QMK_KEYMAP_FOLDER}|Made by: ${MANUFACTURER}\n") message(STATUS "Added keyboard '${QMK_KEYBOARD_FOLDER}' with keymap '${QMK_KEYMAP_FOLDER}'") diff --git a/cmake/Findchibios.cmake b/cmake/Findchibios.cmake index 3ca1ee6002..7e924f4e46 100644 --- a/cmake/Findchibios.cmake +++ b/cmake/Findchibios.cmake @@ -6,16 +6,44 @@ set(MCU "cortex-m4") set(ARMV 7) set(MCU_FAMILY "STM32") set(MCU_SERIES "STM32F3xx") +string(TOUPPER ${MCU_SERIES} MCU_SERIES_UPPER) set(MCU_LDSCRIPT "STM32F303xC") set(MCU_STARTUP "stm32f3xx") set(BOARD "GENERIC_STM32_F303XC") set(USE_FPU TRUE) set(UF2_FAMILY "STM32F3") set(STM32_BOOTLOADER_ADDRESS 0x1FFFD800) -set(EEPROM_DRIVER "wear_leveling" CACHE STRING "" FORCE) +set(EEPROM_DRIVER "wear_leveling" FORCE) +set(WEAR_LEVELING_DRIVER "embedded_flash" FORCE) + +target_compile_definitions(qmk PUBLIC + QMK_MCU_FAMILY_${MCU_FAMILY} + QMK_MCU_SERIES_${MCU_SERIES_UPPER} +) + +target_compile_options(qmk PUBLIC + -march=armv7-m +) + +target_compile_definitions(qmk PUBLIC + MCU_${MCU_FAMILY} + __ARM_ARCH_7M__ +) # platforms/chibios/platform.mk +if(NOT DEFINED USE_PROCESS_STACKSIZE) + set(USE_PROCESS_STACKSIZE 0x800) +endif() + +if(NOT DEFINED USE_EXCEPTIONS_STACKSIZE) + set(USE_EXCEPTIONS_STACKSIZE 0x400) +endif() + +target_link_options(qmk PUBLIC + -Wl,--defsym=__process_stack_size__=${USE_PROCESS_STACKSIZE},--defsym=__main_stack_size__=${USE_EXCEPTIONS_STACKSIZE} +) + if(NOT DEFINED MCU_PORT_NAME) set(MCU_PORT_NAME ${MCU_FAMILY}) endif() @@ -42,6 +70,7 @@ find_file(STARTUP_MK startup_${MCU_STARTUP}.mk ${CHIBIOS}/os/common/startup/ARMCMx/compilers/GCC/mk ${CHIBIOS_CONTRIB}/os/common/startup/ARMCMx/compilers/GCC/mk ) +get_filename_component(STARTUP_DIR ${STARTUP_MK} DIRECTORY) ParseMakefile(${STARTUP_MK}) target_sources(qmk PUBLIC ${STARTUPSRC} ${STARTUPASM}) target_include_directories(qmk PUBLIC ${STARTUPINC}) @@ -54,15 +83,42 @@ NAMES PATHS ${QMK_KEYBOARD_FOLDER}/boards/${BOARD} ${CMAKE_SOURCE_DIR}/platforms/chibios/boards/${BOARD} + ${CHIBIOS}/os/hal/ + ${CHIBIOS_CONTRIB}/os/hal/ ) +# if(EXISTS ${BOARD_PATH}/rules.mk) +# ParseMakefile(${BOARD_PATH}/rules.mk) +# endif() + +if(EXISTS ${BOARD_PATH}/configs/config.h) +target_precompile_headers(qmk PUBLIC + ${BOARD_PATH}/configs/config.h +) +endif() + +if(EXISTS ${BOARD_PATH}/configs/post_config.h) + target_precompile_headers(qmk PUBLIC + ${BOARD_PATH}/configs/post_config.h + ) +endif() + find_file(BOARD_MK board.mk ${BOARD_PATH}/boards/${BOARD} ${BOARD_PATH}/board ) ParseMakefile(${BOARD_MK}) + target_sources(qmk PUBLIC ${BOARDSRC}) target_include_directories(qmk PUBLIC ${BOARDINC}) +# allow board.c to be overriden +file(RELATIVE_PATH INIT_HOOK_RELATIVE ${CMAKE_BINARY_DIR} + "${CMAKE_SOURCE_DIR}/tmk_core/protocol/chibios/init_hooks.h") +set_source_files_properties(${BOARDSRC} TARGET_DIRECTORY qmk PROPERTIES + # COMPILE_OPTIONS "-include ../../../tmk_core/protocol/chibios/init_hooks.h" + COMPILE_OPTIONS "-include ${INIT_HOOK_RELATIVE}" +) + # bootloader if(DEFINED STM32_BOOTLOADER_ADDRESS) target_compile_definitions(qmk PUBLIC STM32_BOOTLOADER_ADDRESS=${STM32_BOOTLOADER_ADDRESS}) @@ -101,6 +157,13 @@ find_file(LDSCRIPT ${MCU_LDSCRIPT}.ld ${QMK_KEYBOARD_FOLDER}/ld ${CMAKE_SOURCE_DIR}/platforms/chibios/boards/${BOARD}/ld ${CMAKE_SOURCE_DIR}/platforms/chibios/boards/common/ld + ${STARTUPLD} + ${STARTUPLD_CONTRIB} +) +get_filename_component(LDSCRIPT_PATH ${LDSCRIPT} DIRECTORY) +target_link_options(qmk PUBLIC + -T ${LDSCRIPT} + -L ${LDSCRIPT_PATH} ) # os/hal/hal.mk diff --git a/cmake/GetKeymaps.cmake b/cmake/GetKeymaps.cmake new file mode 100644 index 0000000000..31602b58f3 --- /dev/null +++ b/cmake/GetKeymaps.cmake @@ -0,0 +1,51 @@ +cmake_minimum_required(VERSION 3.20) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") + +include(ResolveKeyboard) +include(ValidateJson) + +set(QMK_KEYBOARDS_FOLDER "${CMAKE_SOURCE_DIR}/keyboards") +set(CMAKE_MESSAGE_INDENT "") + +resolve_keyboard(${QMK_KEYBOARD_FOLDER} KEYBOARD_FOLDER_ABS) +validate_json(${KEYBOARD_FOLDER_ABS}/info.json keyboard JSON_STR) +cmake_path(IS_PREFIX QMK_KEYBOARDS_FOLDER "${KEYBOARD_FOLDER_ABS}" IS_KEYBOARDS_FOLDER) + +file(WRITE "${CMAKE_SOURCE_DIR}/build/keyboard_keymaps" "") +if(${IS_KEYBOARDS_FOLDER}) + file(RELATIVE_PATH RELATIVE_KEYBOARD_FOLDER ${QMK_KEYBOARDS_FOLDER} ${KEYBOARD_FOLDER_ABS}) + while(NOT ${RELATIVE_KEYBOARD_FOLDER} STREQUAL "") + file(GLOB KEYMAPS "${QMK_KEYBOARDS_FOLDER}/${RELATIVE_KEYBOARD_FOLDER}/keymaps/*/keymap.c") + foreach(KEYMAP ${KEYMAPS}) + file(RELATIVE_PATH KEYMAP_C "${QMK_KEYBOARDS_FOLDER}/${RELATIVE_KEYBOARD_FOLDER}/keymaps" "${KEYMAP}") + get_filename_component(KEYMAP_FOLDER ${KEYMAP_C} DIRECTORY) + # message(STATUS "${KEYMAP_FOLDER}") + file(APPEND "${CMAKE_SOURCE_DIR}/build/keyboard_keymaps" "${KEYMAP_FOLDER}\n") + endforeach() + 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) + elseif(EXISTS "${KEYBOARD_FOLDER_ABS}/keymaps/${KEYMAP_FOLDER}/keymap.c") + set(${KEYMAP_C_STR} "${KEYBOARD_FOLDER_ABS}/keymaps/${KEYMAP_FOLDER}/keymap.c" PARENT_SCOPE) + endif() +endif() + +string(JSON COMMUNITY_LAYOUTS ERROR_VARIABLE NO_COMMUNITY_LAYOUTS GET ${JSON_STR} community_layouts) + +if(${NO_COMMUNITY_LAYOUTS} STREQUAL "NOTFOUND") + string(JSON NUM_LAYOUTS LENGTH ${COMMUNITY_LAYOUTS}) + math(EXPR MAX "${NUM_LAYOUTS} - 1") + foreach(IDX RANGE ${MAX}) + string(JSON LAYOUT GET ${COMMUNITY_LAYOUTS} ${IDX}) + file(GLOB KEYMAPS "${CMAKE_SOURCE_DIR}/layouts/community/${LAYOUT}/*/keymap.c") + foreach(KEYMAP ${KEYMAPS}) + file(RELATIVE_PATH KEYMAP_C "${CMAKE_SOURCE_DIR}/layouts/community/${LAYOUT}" "${KEYMAP}") + get_filename_component(KEYMAP_FOLDER ${KEYMAP_C} DIRECTORY) + # message(STATUS "${KEYMAP_FOLDER}") + file(APPEND "${CMAKE_SOURCE_DIR}/build/keyboard_keymaps" "${KEYMAP_FOLDER}\n") + endforeach() + endforeach() +endif() \ No newline at end of file diff --git a/cmake/ParseMakefile.cmake b/cmake/ParseMakefile.cmake index 2e913777a0..0e7f51480c 100644 --- a/cmake/ParseMakefile.cmake +++ b/cmake/ParseMakefile.cmake @@ -1,10 +1,10 @@ # Simple CMake utility to read variables from MK files -# - Gets contents from given file (name or path) -# - Parses the assignment statements -# - Makes the same assignments in the PARENT_SCOPE +# - Gets contents from given file (name or path) +# - Parses the assignment statements +# - Makes the same assignments in the PARENT_SCOPE if(POLICY CMP0007) - cmake_policy(SET CMP0007 NEW) + cmake_policy(SET CMP0007 NEW) endif() function(ParseMakefile MKFile) @@ -12,38 +12,61 @@ function(ParseMakefile MKFile) endfunction() macro(_ParseMakefile MKFile) - message(STATUS "Parsing ${MKFile}") - file(READ "${MKFile}" FileContents) - string(REGEX REPLACE "\\\\\r?\n *" " " FileContents ${FileContents}) - string(REGEX REPLACE "\r?\n" ";" FileLines ${FileContents}) - list(REMOVE_ITEM FileLines "") - foreach(line ${FileLines}) - # if(line MATCHES "\\$\\((.+)\\)") - # set(MAKE_VARIABLE "${CMAKE_MATCH_1}") - # string(REPLACE "$(${MAKE_VARIABLE})" "${${MAKE_VARIABLE}}" line ${line}) - # endif() - # message(STATUS "From: ${line}") - string(REGEX REPLACE "\\$\\(([^\\(\\)]+)\\)" "${CHIBIOS}" line ${line}) - # message(STATUS "To : ${line}") - # if(line MATCHES "^include (.+)$") - # set(MAKE_CHILD ${CMAKE_MATCH_1}) - # message(STATUS "Reading ${MAKE_CHILD}") - # _ParseMakefile("${MAKE_CHILD}") - # else() - string(REPLACE "=" ";" line_split ${line}) - list(LENGTH line_split count) - if (count LESS 2) - message(STATUS "Skipping ${line}") + message(VERBOSE "Parsing ${MKFile}") + file(READ "${MKFile}" FileContents) + string(REGEX REPLACE "\\\\\r?\n *" " " FileContents ${FileContents}) + string(REGEX REPLACE "(\r?\n)+" ";" FileLines ${FileContents}) + list(REMOVE_ITEM FileLines "") + + foreach(line ${FileLines}) + # if(line MATCHES "\\$\\((.+)\\)") + # set(MAKE_VARIABLE "${CMAKE_MATCH_1}") + # string(REPLACE "$(${MAKE_VARIABLE})" "${${MAKE_VARIABLE}}" line ${line}) + # endif() + # message(STATUS "From: ${line}") + string(REGEX REPLACE "#.*" "" line ${line}) + + if("${line}" STREQUAL "") continue() endif() + + string(REGEX REPLACE "\\$\\(([^\\(\\)]+)\\)" "${CHIBIOS}" line ${line}) + + # message(STATUS "To : ${line}") + # if(line MATCHES "^include (.+)$") + # set(MAKE_CHILD ${CMAKE_MATCH_1}) + # message(STATUS "Reading ${MAKE_CHILD}") + # _ParseMakefile("${MAKE_CHILD}") + # else() + string(REPLACE "=" ";" line_split ${line}) + list(LENGTH line_split count) + + if(count LESS 2) + message(VERBOSE "Skipping ${line}") + continue() + endif() + list(GET line_split -1 value) string(STRIP ${value} value) separate_arguments(value) list(REMOVE_AT line_split -1) + foreach(var_name ${line_split}) string(STRIP ${var_name} var_name) - set(${var_name} ${value} PARENT_SCOPE) + if(${var_name} MATCHES "([^ \\+]+) *\\+") + message(VERBOSE "Appending '${CMAKE_MATCH_1}' with '${value}'") + set(${CMAKE_MATCH_1} ${${CMAKE_MATCH_1}} ${value} PARENT_SCOPE) + else() + if(DEFINED CACHE${${var_name}}) + message(VERBOSE "Caching '${var_name}' to '${value}'") + set(${var_name} ${value} CACHE INTERNAL "") + else() + message(VERBOSE "Setting '${var_name}' to '${value}'") + set(${var_name} ${value} PARENT_SCOPE) + endif() + endif() endforeach() - # endif() - endforeach() + + # endif() + endforeach() endmacro() \ No newline at end of file diff --git a/cmake/ProcessKeyboard.cmake b/cmake/ProcessKeyboard.cmake new file mode 100644 index 0000000000..a3938d38e7 --- /dev/null +++ b/cmake/ProcessKeyboard.cmake @@ -0,0 +1,17 @@ +include(ParseMakefile) + +macro(process_keyboard) + validate_json(${QMK_KEYBOARD_FOLDER_ABS}/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) + string(JSON DIODE_DIRECTION ERROR_VARIABLE _ GET ${QMK_KEYBOARD_INFO_JSON_STRING} diode_direction) + string(JSON BOOTLOADER ERROR_VARIABLE _ GET ${QMK_KEYBOARD_INFO_JSON_STRING} bootloader) + + ParseMakefile(${QMK_KEYBOARD_FOLDER_ABS}/rules.mk) +endmacro() \ No newline at end of file diff --git a/cmake/ResolveKeyboard.cmake b/cmake/ResolveKeyboard.cmake index 27ca55b7e3..4f7b3d40e2 100644 --- a/cmake/ResolveKeyboard.cmake +++ b/cmake/ResolveKeyboard.cmake @@ -1,24 +1,24 @@ function(resolve_keyboard KEYBOARD KEYBOAD_FOLDER_ABS_STR) - message(STATUS "Resolving ${KEYBOARD}") + message(VERBOSE "Resolving ${KEYBOARD}") if(EXISTS "${CMAKE_SOURCE_DIR}/keyboards/${KEYBOARD}") - message(STATUS "Found in repo: ${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(STATUS "Already checked out: ${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(STATUS "Found ${KEYBOARD_SLUG}") + 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(STATUS "Cloning ${GIT_SLUG}") + message(VERBOSE "Cloning ${GIT_SLUG}") find_package(Git QUIET) if(GIT_FOUND) file(MAKE_DIRECTORY "${CMAKE_SOURCE_DIR}/build/keyboard_repository/${KEYBOARD}") @@ -88,8 +88,7 @@ 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) - else() - message(FATAL_ERROR "Could not find keymap.c in ${KEYMAP_FOLDER}") + return() endif() else() if(${IS_KEYBOARDS_FOLDER}) @@ -102,17 +101,31 @@ function(resolve_keymap_c KEYBOARD_FOLDER_ABS KEYMAP_FOLDER KEYMAP_C_STR) endif() get_filename_component(RELATIVE_KEYBOARD_FOLDER ${RELATIVE_KEYBOARD_FOLDER} DIRECTORY) endwhile() - message(FATAL_ERROR "Could not find keymap.c in ${KEYBOARD_FOLDER_ABS}") 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) - else() - message(FATAL_ERROR "Could not find keymap.c in ${KEYBOARD_FOLDER_ABS}") + 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(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) diff --git a/cmake/ResolveToolchain.cmake b/cmake/ResolveToolchain.cmake index b71b1770d3..ff25d586ab 100644 --- a/cmake/ResolveToolchain.cmake +++ b/cmake/ResolveToolchain.cmake @@ -4,6 +4,7 @@ function(resolve_toolchain PROCESSOR TOOLCHAIN_STR) ${PROCESSOR} MATCHES "^at.*" ) set(${TOOLCHAIN_STR} "avr" PARENT_SCOPE) + set(QMK_EXTENSION ".hex" PARENT_SCOPE) include(FindAVRToolchain) find_avr_toolchain() elseif( @@ -14,12 +15,14 @@ function(resolve_toolchain PROCESSOR TOOLCHAIN_STR) ${PROCESSOR} MATCHES "^GD32.*" ) set(${TOOLCHAIN_STR} "arm-none-eabi" PARENT_SCOPE) + set(QMK_EXTENSION ".bin" PARENT_SCOPE) include(FindARMToolchain) find_arm_toolchain() elseif( ${PROCESSOR} MATCHES "risc-v" ) set(${TOOLCHAIN_STR} "riscv32-unknown-elf" PARENT_SCOPE) + set(QMK_EXTENSION ".bin" PARENT_SCOPE) else() message(FATAL_ERROR "Could not find toolchain for ${PROCESSOR}") endif() diff --git a/cmake/ValidateJson.cmake b/cmake/ValidateJson.cmake index 51b96fb249..478dd0487b 100644 --- a/cmake/ValidateJson.cmake +++ b/cmake/ValidateJson.cmake @@ -1,6 +1,6 @@ function(validate_json JSON_FILE SCHEMA_NAME JSON_STRING_STR) unset(${JSON_STRING_STR} PARENT_SCOPE) - message(STATUS "Validating ${JSON_FILE} with '${SCHEMA_NAME}' schema") + message(VERBOSE "Validating ${JSON_FILE} with '${SCHEMA_NAME}' schema") file(READ ${JSON_FILE} JSON_STRING) file(READ ${CMAKE_SOURCE_DIR}/data/schemas/${SCHEMA_NAME}.jsonschema SCHEMA_STRING) string(JSON SCHEMA_ID GET ${SCHEMA_STRING} $id) @@ -19,7 +19,7 @@ function(validate_json JSON_FILE SCHEMA_NAME JSON_STRING_STR) # foreach(IDX RANGE ${MAX}) # string(JSON DEFINITION_NAME MEMBER ${SCHEMA_DEFINITIONS} ${IDX}) # string(JSON DEFINITION GET ${SCHEMA_DEFINITIONS} ${DEFINITION_NAME}) - # message(DEBUG "Loading local definition '${DEFINITION_NAME}'") + # message(VERBOSE "Loading local definition '${DEFINITION_NAME}'") # string(JSON DEFINITIONS_STRING SET ${DEFINITIONS_STRING} ${DEFINITION_NAME} ${DEFINITION}) # endforeach() endif() @@ -51,7 +51,7 @@ function(validate_object JSON_STRING SCHEMA_STRING OBJECT_ERROR_STR) foreach(IDX RANGE ${MAX}) string(JSON PROPERTY_NAME MEMBER ${JSON_STRING} ${IDX}) list(REMOVE_ITEM REQUIRED_LIST ${PROPERTY_NAME}) - message(DEBUG "Validating property '${PROPERTY_NAME}'") + message(VERBOSE "Validating property '${PROPERTY_NAME}'") if(${PROPERTY_NAMES_ERROR} STREQUAL "NOTFOUND") validate_property(${PROPERTY_NAME} ${PROPERTY_NAME_SCHEMA} PROPERTY_NAME_ERROR) if(DEFINED PROPERTY_NAME_ERROR) @@ -90,7 +90,7 @@ function(validate_property PROPERTY PROPERTY_SCHEMA PROPERTY_ERROR_STR) endif() string(JSON PROPERTY_TYPE ERROR_VARIABLE JSON_ERROR GET ${PROPERTY_SCHEMA} type) if(${JSON_ERROR} STREQUAL "NOTFOUND") - message(DEBUG "Validating property type '${PROPERTY_TYPE}'") + message(VERBOSE "Validating property type '${PROPERTY_TYPE}'") if(${PROPERTY_TYPE} STREQUAL "object") validate_object(${PROPERTY} ${PROPERTY_SCHEMA} OBJECT_ERROR) if(DEFINED OBJECT_ERROR) @@ -172,7 +172,7 @@ function(validate_property PROPERTY PROPERTY_SCHEMA PROPERTY_ERROR_STR) endif() endif() else() - message(STATUS "Unknown type '${PROPERTY_TYPE}'") + message(VERBOSE "Unknown type '${PROPERTY_TYPE}'") endif() else() string(JSON PROPERTY_ONEOF ERROR_VARIABLE JSON_ERROR GET ${PROPERTY_SCHEMA} oneOf) diff --git a/cmake/features/backlight.cmake b/cmake/features/backlight.cmake index 07c5b53757..e48e2cffcf 100644 --- a/cmake/features/backlight.cmake +++ b/cmake/features/backlight.cmake @@ -3,7 +3,7 @@ set(BACKLIGHT_DRIVER "pwm" CACHE STRING "Backlight driver") set_property(CACHE BACKLIGHT_DRIVER PROPERTY STRINGS pwm timer software custom) string(JSON BACKLIGHT_PIN ERROR_VARIABLE NO_BACKLIGHT_PIN GET ${QMK_KEYBOARD_INFO_JSON_STRING} backlight pin) -if(${BACKLIGHT_ENABLE} AND NOT ${NO_BACKLIGHT_PIN} STREQUAL "backlight-NOTFOUND") +if(${BACKLIGHT_ENABLE} AND NOT ${BACKLIGHT_PIN} STREQUAL "backlight-NOTFOUND") target_sources(qmk PUBLIC quantum/backlight/backlight.c quantum/process_keycode/process_backlight.c diff --git a/cmake/features/eeprom.cmake b/cmake/features/eeprom.cmake index 294abe5546..5d3121c046 100644 --- a/cmake/features/eeprom.cmake +++ b/cmake/features/eeprom.cmake @@ -3,6 +3,15 @@ set_property(CACHE EEPROM_DRIVER PROPERTY STRINGS vendor custom transient i2c sp set(WEAR_LEVELING_DRIVER "none" CACHE STRING "EEPROM wear-leveling driver") set_property(CACHE WEAR_LEVELING_DRIVER PROPERTY STRINGS custom embedded_flash spi_flash rp2040_flash legacy) +target_compile_definitions(qmk PUBLIC + EEPROM_ENABLE +) +target_include_directories(qmk PUBLIC + platforms/${QMK_PLATFORM}/drivers/eeprom + drivers/eeprom + platforms/common +) + if(${EEPROM_DRIVER} STREQUAL "wear_leveling") target_compile_definitions(qmk PUBLIC EEPROM_DRIVER @@ -12,13 +21,12 @@ if(${EEPROM_DRIVER} STREQUAL "wear_leveling") drivers/eeprom/eeprom_driver.c drivers/eeprom/eeprom_wear_leveling.c ) - target_include_directories(qmk PUBLIC drivers/eeprom) elseif(${EEPROM_DRIVER} STREQUAL "vendor") target_compile_definitions(qmk PUBLIC EEPROM_VENDOR ) if(${QMK_PLATFORM} STREQUAL "chibios") - if(${QMK_MCU} MATHCES "STM32F.*") + if(${QMK_MCU} MATCHES "STM32F[1-9].*" OR ${QMK_MCU} MATCHES "WB32.*" OR ${QMK_MCU} MATCHES "GD32.*") target_compile_definitions(qmk PUBLIC EEPROM_DRIVER EEPROM_WEAR_LEVELING @@ -27,28 +35,36 @@ elseif(${EEPROM_DRIVER} STREQUAL "vendor") drivers/eeprom/eeprom_driver.c drivers/eeprom/eeprom_wear_leveling.c ) - set(WEAR_LEVELING_DRIVER "embedded_flash" FORCE) + set(WEAR_LEVELING_DRIVER "embedded_flash") endif() endif() endif() if(NOT ${WEAR_LEVELING_DRIVER} STREQUAL "none") + set(FNV_ENABLE TRUE) target_compile_definitions(qmk PUBLIC WEAR_LEVELING_ENABLE - WEAR_LEVELING_EMBEDDED_FLASH ) target_include_directories(qmk PUBLIC platforms/${QMK_PLATFORM}/drivers/wear_leveling drivers/wear_leveling quantum/wear_leveling ) - target_sources(qmk PUBLIC wear_leveling.c) + target_sources(qmk PUBLIC quantum/wear_leveling/wear_leveling.c) - if(NOT ${WEAR_LEVELING_DRIVER} STREQUAL "embedded_flash") + if(${WEAR_LEVELING_DRIVER} STREQUAL "embedded_flash") target_compile_definitions(qmk PUBLIC HAL_USE_EFL + WEAR_LEVELING_EMBEDDED_FLASH + ) + target_sources(qmk PUBLIC + platforms/${QMK_PLATFORM}/drivers/wear_leveling/wear_leveling_efl.c + ) + # target_compile_options(qmk PUBLIC + # -include ${CMAKE_SOURCE_DIR}/platforms/${QMK_PLATFORM}/drivers/wear_leveling/wear_leveling_efl_config.h + # ) + target_precompile_headers(qmk PUBLIC + ${CMAKE_SOURCE_DIR}/platforms/${QMK_PLATFORM}/drivers/wear_leveling/wear_leveling_efl_config.h ) - target_sources(qmk PUBLIC wear_leveling_efl.c) - # post config.h platforms/${QMK_PLATFORM}/drivers/wear_leveling/wear_leveling_efl_config.h endif() endif() diff --git a/cmake/features/fnv.cmake b/cmake/features/fnv.cmake new file mode 100644 index 0000000000..1a05dc5654 --- /dev/null +++ b/cmake/features/fnv.cmake @@ -0,0 +1,9 @@ +if(${FNV_ENABLE}) + target_compile_definitions(qmk PUBLIC FNV_ENABLE) + target_include_directories(qmk PUBLIC lib/fnv) + target_sources(qmk PUBLIC + lib/fnv/qmk_fnv_type_validation.c + lib/fnv/hash_32a.c + lib/fnv/hash_64a.c + ) +endif() \ No newline at end of file diff --git a/cmake/features/matrix.cmake b/cmake/features/matrix.cmake new file mode 100644 index 0000000000..a215df66fd --- /dev/null +++ b/cmake/features/matrix.cmake @@ -0,0 +1,9 @@ +message(STATUS "Custom Matrix: ${CUSTOM_MATRIX}") +set(CUSTOM_MATRIX "no" CACHE STRING "Custom matrix-scanning") +set_property(CACHE CUSTOM_MATRIX PROPERTY STRINGS yes lite no) +if(NOT ${CUSTOM_MATRIX} STREQUAL yes) + target_sources(qmk PUBLIC quantum/matrix_common.c) + if(NOT ${CUSTOM_MATRIX} STREQUAL lite) + target_sources(qmk PUBLIC quantum/matrix.c) + endif() +endif() \ No newline at end of file diff --git a/cmake/features/oled.cmake b/cmake/features/oled.cmake index ac7a4b5c58..bc0928b563 100644 --- a/cmake/features/oled.cmake +++ b/cmake/features/oled.cmake @@ -1,4 +1,4 @@ -option(OLED_ENABLE "" TRUE) +option(OLED_ENABLE "" OFF) if(${OLED_ENABLE}) target_sources(qmk PUBLIC drivers/oled/ssd1306_sh1106.c @@ -7,7 +7,4 @@ if(${OLED_ENABLE}) target_include_directories(qmk PUBLIC drivers) target_include_directories(qmk PUBLIC drivers/oled) target_include_directories(qmk PUBLIC platforms/${QMK_PLATFORM}/drivers) - # target_link_libraries(oled qmk) - # target_link_libraries(oled ${QMK_TARGET}) - # target_link_libraries(oled platforms) endif() diff --git a/cmake/toolchains/arm-none-eabi.cmake b/cmake/toolchains/arm-none-eabi.cmake index 804c1fdb5d..8db6062549 100644 --- a/cmake/toolchains/arm-none-eabi.cmake +++ b/cmake/toolchains/arm-none-eabi.cmake @@ -5,6 +5,7 @@ include(ResolveToolchain) set(QMK_TOOLCHAIN "arm-none-eabi") set(QMK_PLATFORM "chibios") set(QMK_PROTOCOL "chibios") +set(QMK_EXTENSION ".bin") if(UNIX) set(OS_SUFFIX "") @@ -28,7 +29,7 @@ set(CMAKE_OBJCOPY "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-objcopy${OS_SUFFIX}" set(CMAKE_OBJDUMP "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-objdump${OS_SUFFIX}" CACHE PATH "objdump" FORCE) set(CMAKE_STRIP "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-strip${OS_SUFFIX}" CACHE PATH "strip" FORCE) set(CMAKE_RANLIB "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-ranlib${OS_SUFFIX}" CACHE PATH "ranlib" FORCE) -set(AVR_SIZE "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-size${OS_SUFFIX}" CACHE PATH "size" FORCE) +set(CMAKE_SIZE "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-size${OS_SUFFIX}" CACHE PATH "size" FORCE) find_program(CMAKE_MAKE_PROGRAM NAME make PATHS @@ -73,89 +74,71 @@ add_link_options( -nostartfiles -Wl,--no-wchar-size-warning --specs=nano.specs + -lm ) -if(${USE_FPU}) - add_compile_definitions( - CORTEX_USE_FPU=TRUE - ) - add_link_options( - -mfloat-abi=hard - -mfpu=fpv4-sp-d16 - -fsingle-precision-constant - ) -else() - add_compile_definitions( - CORTEX_USE_FPU=FALSE - ) -endif() - macro(add_qmk_executable target_name) set(elf_file ${target_name}.elf) set(map_file ${target_name}.map) - set(hex_file ${target_name}.hex) + set(bin_file ${target_name}.bin) set(lst_file ${target_name}.lst) - # create elf file - add_executable(${elf_file} ${ARGN}) + add_link_options( + -Wl,-Map=${map_file},--cref + ) - target_link_libraries(${elf_file} qmk) + # create elf file + add_executable(qmk ${ARGN}) + # add_executable(${elf_file} ${ARGN}) + # target_link_libraries(${elf_file} qmk) + + set_target_properties(qmk + PROPERTIES + OUTPUT_NAME ${elf_file} + ) # generate the lst file add_custom_command( OUTPUT ${lst_file} - - COMMAND - ${CMAKE_OBJDUMP} -h -S ${elf_file} > ${lst_file} - - DEPENDS ${elf_file} + COMMAND ${CMAKE_OBJDUMP} -h -S ${elf_file} > ${lst_file} + DEPENDS qmk ) - # create hex file - add_custom_command( - OUTPUT ${hex_file} + # add_custom_command( + # OUTPUT "print-size-${elf_file}" - COMMAND - ${CMAKE_OBJCOPY} -j .text -j .data -O ihex ${elf_file} ${hex_file} + # COMMAND + # ${CMAKE_SIZE} ${elf_file} - DEPENDS ${elf_file} - ) + # DEPENDS ${elf_file} + # ) + + # add_custom_command( + # OUTPUT "print-size-${bin_file}" + + # COMMAND + # ${CMAKE_SIZE} ${bin_file} sizeafter + + # DEPENDS ${bin_file} + # ) add_custom_command( - OUTPUT "print-size-${elf_file}" - - COMMAND - ${AVR_SIZE} ${elf_file} - - DEPENDS ${elf_file} - ) - - add_custom_command( - OUTPUT "print-size-${hex_file}" - - COMMAND - ${AVR_SIZE} ${hex_file} - - DEPENDS ${hex_file} - ) - - add_custom_target(copy_hex - COMMAND ${CMAKE_COMMAND} -E copy $ ${CMAKE_SOURCE_DIR}/build/${target_name}.hex - DEPENDS ${hex_file} + TARGET qmk + POST_BUILD + COMMAND ${CMAKE_OBJCOPY} -O binary ${elf_file} ${CMAKE_SOURCE_DIR}/build/${bin_file} + # COMMAND ${CMAKE_COMMAND} -E copy ${elf_file} ${CMAKE_SOURCE_DIR}/build/${elf_file} + # COMMAND ${CMAKE_COMMAND} -E copy ${lst_file} ${CMAKE_SOURCE_DIR}/build/${lst_file} + # COMMAND ${CMAKE_COMMAND} -E copy ${map_file} ${CMAKE_SOURCE_DIR}/build/${map_file} ) # build the intel hex file for the device - add_custom_target( - ${target_name} - ALL - DEPENDS ${hex_file} ${lst_file} "print-size-${elf_file}" "print-size-${hex_file}" copy_hex + add_custom_target(${target_name} ALL + DEPENDS ${elf_file} ${lst_file} ) - set_target_properties( - ${target_name} - + set_target_properties(${target_name} PROPERTIES - OUTPUT_NAME ${elf_file} + OUTPUT_NAME ${bin_file} ) endmacro(add_qmk_executable) diff --git a/cmake/toolchains/avr.cmake b/cmake/toolchains/avr.cmake index 01e80be74e..7797ba8784 100644 --- a/cmake/toolchains/avr.cmake +++ b/cmake/toolchains/avr.cmake @@ -11,6 +11,7 @@ include(ResolveToolchain) set(QMK_TOOLCHAIN "avr") set(QMK_PLATFORM "avr") set(QMK_PROTOCOL "lufa") +set(QMK_EXTENSION ".hex") if(UNIX) set(OS_SUFFIX "") @@ -114,14 +115,15 @@ macro(add_qmk_executable target_name) ) # create elf file - add_executable(${elf_file} ${ARGN}) + # add_executable(${elf_file} ${ARGN}) + # target_link_libraries(${elf_file} qmk) - # add_executable(qmk ${ARGN}) - # set_target_properties(qmk - # PROPERTIES OUTPUT_NAME ${elf_file} - # ) + add_executable(qmk ${ARGN}) + set_target_properties(qmk + PROPERTIES + OUTPUT_NAME ${elf_file} + ) - target_link_libraries(${elf_file} qmk) # set_target_properties(${elf_file} # PROPERTIES @@ -162,7 +164,7 @@ macro(add_qmk_executable target_name) ) add_custom_target(copy_hex - COMMAND ${CMAKE_COMMAND} -E copy $ ${CMAKE_SOURCE_DIR}/build/${target_name}.hex + COMMAND ${CMAKE_COMMAND} -E copy ${hex_file} ${CMAKE_SOURCE_DIR}/build/${hex_file} DEPENDS ${hex_file} ) @@ -172,7 +174,8 @@ macro(add_qmk_executable target_name) ) set_target_properties(${target_name} - PROPERTIES OUTPUT_NAME ${elf_file} + PROPERTIES + OUTPUT_NAME ${hex_file} ) diff --git a/keyboards/CMakeLists.txt b/keyboards/CMakeLists.txt index b9f068fb21..161b8089a4 100644 --- a/keyboards/CMakeLists.txt +++ b/keyboards/CMakeLists.txt @@ -24,9 +24,10 @@ file(STRINGS "${CMAKE_SOURCE_DIR}/build/targets" TARGETS) while(TARGETS) list(POP_FRONT TARGETS LINE) - if (LINE MATCHES "(.+)\\|(.+)\\|(.+)\\|(.+)") + if (LINE MATCHES "(.+)\\|(.+)\\|(.+):(.+)\\|(.+)") set(KEYBOARD_FOLDER ${CMAKE_MATCH_3}) - add_keyboard(${KEYBOARD_FOLDER} "default") + set(KEYMAP_FOLDER ${CMAKE_MATCH_4}) + add_keyboard(${KEYBOARD_FOLDER} ${KEYMAP_FOLDER}) endif() endwhile() diff --git a/keyboards/planck/rev6/info.json b/keyboards/planck/rev6/info.json index 9cc60ab5f0..af6ae49780 100644 --- a/keyboards/planck/rev6/info.json +++ b/keyboards/planck/rev6/info.json @@ -16,6 +16,7 @@ "processor": "STM32F303", "bootloader": "stm32-dfu", "board": "QMK_PROTON_C", + "diode_direction": "COL2ROW", "community_layouts": ["ortho_4x12", "planck_mit"], "layouts": { "LAYOUT_ortho_4x12": { diff --git a/keyboards/planck/rev6_drop/info.json b/keyboards/planck/rev6_drop/info.json index 828f0c20b8..3a73712173 100644 --- a/keyboards/planck/rev6_drop/info.json +++ b/keyboards/planck/rev6_drop/info.json @@ -15,6 +15,7 @@ }, "processor": "STM32F303", "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", "community_layouts": ["ortho_4x12", "planck_mit"], "layouts": { "LAYOUT_ortho_4x12": { diff --git a/platforms/chibios/CMakeLists.txt b/platforms/chibios/CMakeLists.txt index e68502d773..5b68191462 100644 --- a/platforms/chibios/CMakeLists.txt +++ b/platforms/chibios/CMakeLists.txt @@ -1,7 +1,7 @@ find_package(Chibios REQUIRED) target_link_options(qmk PUBLIC - -mcpu=${QMK_MCU} + -mcpu=${MCU} -mthumb -mno-thumb-interwork -mno-unaligned-access @@ -30,12 +30,26 @@ else() ) endif() +# bootloader +if(${BOOTLOADER} STREQUAL "stm32-dfu") + target_compile_definitions(qmk PUBLIC BOOTLOADER_STM32_DFU) + set(BOOTLOADER_TYPE stm32_dfu) +endif() + target_sources(qmk PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR}/syscall-fallbacks.c - ${CMAKE_CURRENT_SOURCE_DIR}/wait.c - ${CMAKE_CURRENT_SOURCE_DIR}/synchronization_util.c + syscall-fallbacks.c + wait.c + synchronization_util.c + hardware_id.c + platform.c + suspend.c + timer.c + bootloaders/${BOOTLOADER_TYPE}.c ) target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/boards/common/configs) -target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD}/configs) \ No newline at end of file +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD}/configs) + +# mabye this should be in a different place +add_subdirectory(${CMAKE_SOURCE_DIR}/quantum/logging logging) \ No newline at end of file diff --git a/quantum/CMakeLists.txt b/quantum/CMakeLists.txt index e00ff015b9..70f84f4db2 100644 --- a/quantum/CMakeLists.txt +++ b/quantum/CMakeLists.txt @@ -15,17 +15,15 @@ target_sources(qmk PUBLIC sync_timer.c logging/debug.c logging/sendchar.c - matrix_common.c - matrix.c debounce/sym_defer_g.c bootmagic/magic.c ) target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/logging) target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/keymap_extras) target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/process_keycode) target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/sequencer) +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/logging) target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bootmagic) # target_link_libraries(quantum ${QMK_TARGET}) diff --git a/quantum/logging/CMakeLists.txt b/quantum/logging/CMakeLists.txt new file mode 100644 index 0000000000..09d185aa89 --- /dev/null +++ b/quantum/logging/CMakeLists.txt @@ -0,0 +1,19 @@ +set(PRINTF_PATH ${CMAKE_SOURCE_DIR}/lib/printf/src) + +target_sources(qmk PUBLIC + print.c + ${PRINTF_PATH}/printf/printf.c +) +target_include_directories(qmk PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + ${PRINTF_PATH}/printf + ${PRINTF_PATH} +) +target_compile_definitions(qmk PUBLIC + PRINTF_SUPPORT_DECIMAL_SPECIFIERS=0 + PRINTF_SUPPORT_EXPONENTIAL_SPECIFIERS=0 + PRINTF_SUPPORT_LONG_LONG=0 + PRINTF_SUPPORT_WRITEBACK_SPECIFIER=0 + SUPPORT_MSVC_STYLE_INTEGER_SPECIFIERS=0 + PRINTF_ALIAS_STANDARD_FUNCTION_NAMES=1 +) \ No newline at end of file diff --git a/tmk_core/protocol/chibios/CMakeLists.txt b/tmk_core/protocol/chibios/CMakeLists.txt index eca5928607..353bd2d638 100644 --- a/tmk_core/protocol/chibios/CMakeLists.txt +++ b/tmk_core/protocol/chibios/CMakeLists.txt @@ -13,10 +13,7 @@ target_sources(qmk PUBLIC ) find_package(Chibios REQUIRED) +# include(FindChibios) target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/lufa_utils) - -# if no printf -target_sources(qmk PUBLIC ${CMAKE_SOURCE_DIR}/lib/printf/src/printf/printf.c) -target_include_directories(qmk PUBLIC ${CMAKE_SOURCE_DIR}/lib/printf/src/printf) \ No newline at end of file +target_include_directories(qmk PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/lufa_utils) \ No newline at end of file From 92005dee3554a6c748a7133dff58f8337fc83de2 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 7 Apr 2023 16:25:51 -0400 Subject: [PATCH 26/26] using data/mappings for processing --- CMakeLists.txt | 15 ++----- cmake/Findchibios.cmake | 3 +- cmake/ParseHeader.cmake | 64 +++++++++++++++++++++++++++++ cmake/ParseMakefile.cmake | 72 +++++++++++++++++++++----------- cmake/ProcessKeyboard.cmake | 73 ++++++++++++++++++++++++++++++--- cmake/ResolveKeyboard.cmake | 26 +++++++----- cmake/Utils.cmake | 25 +++++++++++ data/mappings/info_config.hjson | 2 +- 8 files changed, 226 insertions(+), 54 deletions(-) create mode 100644 cmake/ParseHeader.cmake create mode 100644 cmake/Utils.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 74a4b1c8e0..29829c16b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,7 @@ cmake_minimum_required(VERSION 3.20) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "") + list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") include(UpdateSubmodule) @@ -34,9 +36,9 @@ else() endif() resolve_keyboard(${QMK_KEYBOARD_FOLDER} QMK_KEYBOARD_FOLDER_ABS) - process_keyboard() cmake_path(IS_PREFIX QMK_KEYBOARDS_FOLDER "${QMK_KEYBOARD_FOLDER_ABS}" IS_KEYBOARDS_FOLDER) resolve_config_h(${QMK_KEYBOARD_FOLDER_ABS} QMK_KEYBOARD_CONFIG_H) + process_keyboard() resolve_keyboard_h(${QMK_KEYBOARD_FOLDER_ABS} QMK_KEYBOARD_H) resolve_keymap_c(${QMK_KEYBOARD_FOLDER_ABS} ${QMK_KEYMAP_FOLDER} QMK_KEYMAP_C) @@ -50,12 +52,6 @@ else() HOMEPAGE_URL ${URL} VERSION ${DEVICE_VER}) - string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" VERSION_MATCH ${DEVICE_VER}) - set(VERSION_MAJOR ${CMAKE_MATCH_1}) - set(VERSION_MINOR ${CMAKE_MATCH_2}) - set(VERSION_PATCH ${CMAKE_MATCH_3}) - math(EXPR VERSION_C_EVAL "${VERSION_MAJOR} * 10000 + ${VERSION_MINOR} * 100 + ${VERSION_PATCH}" OUTPUT_FORMAT HEXADECIMAL) - # add_compile_options( # -include ${QMK_KEYBOARD_CONFIG_H} # ) @@ -65,11 +61,6 @@ else() KEYMAP_C="${QMK_KEYMAP_C}" MATRIX_ROWS=8 MATRIX_COLS=6 - VENDOR_ID=${VENDOR_ID} - PRODUCT_ID=${PRODUCT_ID} - DEVICE_VER=${VERSION_C_EVAL} - MANUFACTURER="${MANUFACTURER}" - PRODUCT="${KEYBOARD_NAME}" ) if(DEFINED DIODE_DIRECTION) diff --git a/cmake/Findchibios.cmake b/cmake/Findchibios.cmake index 7e924f4e46..3fb5744b1c 100644 --- a/cmake/Findchibios.cmake +++ b/cmake/Findchibios.cmake @@ -72,7 +72,8 @@ find_file(STARTUP_MK startup_${MCU_STARTUP}.mk ) get_filename_component(STARTUP_DIR ${STARTUP_MK} DIRECTORY) ParseMakefile(${STARTUP_MK}) -target_sources(qmk PUBLIC ${STARTUPSRC} ${STARTUPASM}) +target_sources(qmk PUBLIC ${STARTUPSRC}) +target_sources(qmk PUBLIC ${STARTUPASM}) target_include_directories(qmk PUBLIC ${STARTUPINC}) # board paths - we should just standardize these diff --git a/cmake/ParseHeader.cmake b/cmake/ParseHeader.cmake new file mode 100644 index 0000000000..98c0718f20 --- /dev/null +++ b/cmake/ParseHeader.cmake @@ -0,0 +1,64 @@ +# Simple CMake utility to read variables from MK files +# - Gets contents from given file (name or path) +# - Parses the assignment statements +# - Makes the same assignments in the PARENT_SCOPE + +if(POLICY CMP0007) + cmake_policy(SET CMP0007 NEW) +endif() + +function(ParseHeader HeaderFile Prefix) + _ParseHeader(${HeaderFile} ${Prefix}) +endfunction() + +macro(_ParseHeader HeaderFile Prefix) + message(CHECK_START "Parsing Header") + list(APPEND CMAKE_MESSAGE_INDENT " ") + message(STATUS "Reading \"${HeaderFile}\"") + + file(READ "${HeaderFile}" FileContents) + string(REGEX REPLACE "/\\*.*\\*/" "" FileContents ${FileContents}) + # replace the \ newlines with spaces + string(REGEX REPLACE "\\\\\r?\n *" " " FileContents ${FileContents}) + # turn each line into an item in a list + string(REGEX REPLACE "\r?\n" ";" FileLines ${FileContents}) + list(REMOVE_ITEM FileLines "") + + foreach(line ${FileLines}) + # remove comments from the ends of each line + string(REGEX REPLACE "//.*" "" line ${line}) + + # remove now-empty lines + if("${line}" STREQUAL "") + continue() + endif() + + # try to process includes, if the file exists + if(line MATCHES "^#include \"(.+)\"") + set(INCLUDED_HEADER ${CMAKE_MATCH_1}) + if(EXISTS ${INCLUDED_HEADER}) + _ParseHeader("${INCLUDED_HEADER}" ${Prefix}) + else() + message(STATUS "Could not read ${INCLUDED_HEADER}") + endif() + continue() + endif() + + # array + if(line MATCHES "#define ([A-Za-z0-9_]+) {(.*)}") + set(VARIABLE_NAME ${CMAKE_MATCH_1}) + set(VARIABLE_VALUE ${CMAKE_MATCH_2}) + set(${Prefix}${VARIABLE_NAME} ${VARIABLE_VALUE}) + endif() + + # regular variable + if(line MATCHES "#define ([A-Za-z0-9_]+) (.*)") + set(VARIABLE_NAME ${CMAKE_MATCH_1}) + set(VARIABLE_VALUE ${CMAKE_MATCH_2}) + set(${Prefix}${VARIABLE_NAME} ${VARIABLE_VALUE}) + endif() + endforeach() + + list(POP_BACK CMAKE_MESSAGE_INDENT) + message(CHECK_PASS "Complete") +endmacro() \ No newline at end of file diff --git a/cmake/ParseMakefile.cmake b/cmake/ParseMakefile.cmake index 0e7f51480c..6c59633f61 100644 --- a/cmake/ParseMakefile.cmake +++ b/cmake/ParseMakefile.cmake @@ -8,65 +8,91 @@ if(POLICY CMP0007) endif() function(ParseMakefile MKFile) - _ParseMakefile(${MKFile}) + _ParseMakefile(${MKFile} ${ARGN}) endfunction() macro(_ParseMakefile MKFile) - message(VERBOSE "Parsing ${MKFile}") + message(CHECK_START "Parsing Makefile") + list(APPEND CMAKE_MESSAGE_INDENT " ") + message(STATUS "Reading \"${MKFile}\"") + file(READ "${MKFile}" FileContents) + # replace the \ newlines with spaces string(REGEX REPLACE "\\\\\r?\n *" " " FileContents ${FileContents}) - string(REGEX REPLACE "(\r?\n)+" ";" FileLines ${FileContents}) + # turn each line into an item in a list + string(REGEX REPLACE "\r?\n" ";" FileLines ${FileContents}) list(REMOVE_ITEM FileLines "") foreach(line ${FileLines}) - # if(line MATCHES "\\$\\((.+)\\)") - # set(MAKE_VARIABLE "${CMAKE_MATCH_1}") - # string(REPLACE "$(${MAKE_VARIABLE})" "${${MAKE_VARIABLE}}" line ${line}) - # endif() - # message(STATUS "From: ${line}") + # remove comments from the ends of each line string(REGEX REPLACE "#.*" "" line ${line}) + # remove now-empty lines if("${line}" STREQUAL "") continue() endif() - string(REGEX REPLACE "\\$\\(([^\\(\\)]+)\\)" "${CHIBIOS}" line ${line}) + # try to process includes, if the file exists + if(line MATCHES "^-?include (.+)$") + set(MAKE_CHILD ${CMAKE_MATCH_1}) + if(EXISTS ${MAKE_CHILD}) + _ParseMakefile("${MAKE_CHILD}" ${ARGN}) + else() + message(STATUS "Could not read ${MAKE_CHILD}") + endif() + continue() + endif() - # message(STATUS "To : ${line}") - # if(line MATCHES "^include (.+)$") - # set(MAKE_CHILD ${CMAKE_MATCH_1}) - # message(STATUS "Reading ${MAKE_CHILD}") - # _ParseMakefile("${MAKE_CHILD}") - # else() + # turn the assignment into a list with the first item being the variable name string(REPLACE "=" ";" line_split ${line}) list(LENGTH line_split count) if(count LESS 2) - message(VERBOSE "Skipping ${line}") + message(STATUS "Skipping ${line}") continue() endif() list(GET line_split -1 value) string(STRIP ${value} value) - separate_arguments(value) + # separate_arguments(value) + # string(REPLACE " " ";" value ${value}) list(REMOVE_AT line_split -1) foreach(var_name ${line_split}) string(STRIP ${var_name} var_name) + # replace $(?) with the variable ? from cmake + if(value MATCHES "\\$\\(([^\\(\\)]+)\\)") + set(MAKE_VARIABLE "${CMAKE_MATCH_1}") + string(REPLACE "$(${MAKE_VARIABLE})" "${${MAKE_VARIABLE}}" value ${value}) + endif() + + # look for +, assuming it used to be += if(${var_name} MATCHES "([^ \\+]+) *\\+") - message(VERBOSE "Appending '${CMAKE_MATCH_1}' with '${value}'") - set(${CMAKE_MATCH_1} ${${CMAKE_MATCH_1}} ${value} PARENT_SCOPE) + message(STATUS "Appending \"${CMAKE_MATCH_1}\" with \"${value}\"") + # read parent variable in local & append + set(LOCAL_${CMAKE_MATCH_1} ${CMAKE_MATCH_1}) + # APPEND accepts spaces between values + list(APPEND LOCAL_${CMAKE_MATCH_1} ${value}) + set(${CMAKE_MATCH_1} ${LOCAL_${CMAKE_MATCH_1}}) + set(${CMAKE_MATCH_1} ${LOCAL_${CMAKE_MATCH_1}} PARENT_SCOPE) else() + # set needs ; between elements to be considered a list + string(REGEX REPLACE " +" ";" value ${value}) + # try to find variable in cache and FORCE wtih INTERNAL if it exists if(DEFINED CACHE${${var_name}}) - message(VERBOSE "Caching '${var_name}' to '${value}'") + message(STATUS "Caching \"${var_name}\" to \"${value}\"") + # set locally so replacement still work + set(${var_name} ${value}) set(${var_name} ${value} CACHE INTERNAL "") else() - message(VERBOSE "Setting '${var_name}' to '${value}'") + message(STATUS "Setting \"${var_name}\" to \"${value}\"") + set(${var_name} ${value}) set(${var_name} ${value} PARENT_SCOPE) endif() endif() endforeach() - - # endif() endforeach() + + list(POP_BACK CMAKE_MESSAGE_INDENT) + message(CHECK_PASS "Complete") endmacro() \ No newline at end of file diff --git a/cmake/ProcessKeyboard.cmake b/cmake/ProcessKeyboard.cmake index a3938d38e7..7e453ccf04 100644 --- a/cmake/ProcessKeyboard.cmake +++ b/cmake/ProcessKeyboard.cmake @@ -1,17 +1,78 @@ include(ParseMakefile) +include(Utils) macro(process_keyboard) + message(CHECK_START "Processing keyboard") + list(APPEND CMAKE_MESSAGE_INDENT " ") + validate_json(${QMK_KEYBOARD_FOLDER_ABS}/info.json keyboard QMK_KEYBOARD_INFO_JSON_STRING) + # process rules from info.json + file(READ ${CMAKE_SOURCE_DIR}/data/mappings/info_rules.hjson JSON_STRING) + string(JSON MAPPING_LENGTH LENGTH ${JSON_STRING}) + math(EXPR MAX "${MAPPING_LENGTH} - 1") + foreach(IDX RANGE ${MAX}) + string(JSON RULE_KEY MEMBER ${JSON_STRING} ${IDX}) + # string(JSON INFO_KEY GET ${JSON_STRING} ${RULE_KEY} info_key) + json_get_with_default(INFO_KEY ${JSON_STRING} _ ${RULE_KEY} info_key) + string(REPLACE "." " " INFO_KEYS ${INFO_KEY}) + string(JSON RULE_VALUE ERROR_VARIABLE RULE_KEY_NOT_FOUND GET ${QMK_KEYBOARD_INFO_JSON_STRING} ${INFO_KEYS}) + if(${RULE_KEY_NOT_FOUND} STREQUAL "NOTFOUND") + json_get_with_default(VALUE_TYPE ${JSON_STRING} raw ${RULE_KEY} value_type) + if(${VALUE_TYPE} STREQUAL "list") + string(JSON NUM_VALUES LENGTH ${RULE_VALUE}) + math(EXPR MAX "${NUM_VALUES} - 1") + foreach(IDX RANGE ${MAX}) + string(JSON VALUE GET ${RULE_VALUE} ${IDX}) + list(APPEND ${RULE_KEY} ${VALUE}) + endforeach() + message(STATUS "Found rule '${INFO_KEY}': '${${RULE_KEY}}' assigned to '${RULE_KEY}'") + else() + set(${RULE_KEY} ${RULE_VALUE}) + message(STATUS "Found rule '${INFO_KEY}': '${RULE_VALUE}' assigned to '${RULE_KEY}'") + endif() + endif() + endforeach() + + # process definitions from info.json + file(READ ${CMAKE_SOURCE_DIR}/data/mappings/info_config.hjson JSON_STRING) + string(JSON MAPPING_LENGTH LENGTH ${JSON_STRING}) + math(EXPR MAX "${MAPPING_LENGTH} - 1") + foreach(IDX RANGE ${MAX}) + string(JSON CONFIG_KEY MEMBER ${JSON_STRING} ${IDX}) + json_get_with_default(INFO_KEY ${JSON_STRING} _ ${CONFIG_KEY} info_key) + string(REPLACE "." ";" INFO_KEYS ${INFO_KEY}) + # string(JSON CONFIG_VALUE ERROR_VARIABLE CONFIG_KEY_NOT_FOUND GET ${QMK_KEYBOARD_INFO_JSON_STRING} ${INFO_KEYS}) + json_get_with_default(CONFIG_VALUE ${QMK_KEYBOARD_INFO_JSON_STRING} NOTFOUND ${INFO_KEYS}) + if(NOT CONFIG_VALUE STREQUAL "NOTFOUND") + set(${CONFIG_KEY} ${CONFIG_VALUE}) + json_get_with_default(VALUE_TYPE ${JSON_STRING} raw ${CONFIG_KEY} value_type) + if(${VALUE_TYPE} STREQUAL "str") + add_compile_definitions(${CONFIG_KEY}="${CONFIG_VALUE}") + message(STATUS "Found definition '${INFO_KEY}': '\"${CONFIG_VALUE}\"' assigned to '${CONFIG_KEY}'") + elseif(${VALUE_TYPE} STREQUAL "bcd_version") + string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" VERSION_MATCH ${CONFIG_VALUE}) + set(VERSION_MAJOR ${CMAKE_MATCH_1}) + set(VERSION_MINOR ${CMAKE_MATCH_2}) + set(VERSION_PATCH ${CMAKE_MATCH_3}) + math(EXPR BCD_VERSION "${VERSION_MAJOR} * 10000 + ${VERSION_MINOR} * 100 + ${VERSION_PATCH}" OUTPUT_FORMAT HEXADECIMAL) + add_compile_definitions(${CONFIG_KEY}=${BCD_VERSION}) + message(STATUS "Found definition '${INFO_KEY}': '${BCD_VERSION}' assigned to '${CONFIG_KEY}'") + else() + add_compile_definitions(${CONFIG_KEY}=${CONFIG_VALUE}) + message(STATUS "Found definition '${INFO_KEY}': '${CONFIG_VALUE}' assigned to '${CONFIG_KEY}'") + endif() + endif() + endforeach() + 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) - string(JSON DIODE_DIRECTION ERROR_VARIABLE _ GET ${QMK_KEYBOARD_INFO_JSON_STRING} diode_direction) - string(JSON BOOTLOADER ERROR_VARIABLE _ GET ${QMK_KEYBOARD_INFO_JSON_STRING} bootloader) - ParseMakefile(${QMK_KEYBOARD_FOLDER_ABS}/rules.mk) + list(POP_BACK CMAKE_MESSAGE_INDENT) + message(CHECK_PASS "info.json validated and loaded") + + + ParseMakefile(${QMK_KEYBOARD_FOLDER_ABS}/rules.mk) endmacro() \ No newline at end of file diff --git a/cmake/ResolveKeyboard.cmake b/cmake/ResolveKeyboard.cmake index 4f7b3d40e2..796dbac3b0 100644 --- a/cmake/ResolveKeyboard.cmake +++ b/cmake/ResolveKeyboard.cmake @@ -1,3 +1,5 @@ +include(Utils) + function(resolve_keyboard KEYBOARD KEYBOAD_FOLDER_ABS_STR) message(VERBOSE "Resolving ${KEYBOARD}") if(EXISTS "${CMAKE_SOURCE_DIR}/keyboards/${KEYBOARD}") @@ -42,17 +44,19 @@ function(resolve_keyboard KEYBOARD KEYBOAD_FOLDER_ABS_STR) 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") - set(${CONFIG_H_STR} "${QMK_KEYBOARDS_FOLDER}/${RELATIVE_KEYBOARD_FOLDER}/config.h" PARENT_SCOPE) - return() + 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}") + # 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) @@ -112,26 +116,26 @@ function(resolve_keymap_c KEYBOARD_FOLDER_ABS KEYMAP_FOLDER KEYMAP_C_STR) endif() endif() - string(JSON COMMUNITY_LAYOUTS ERROR_VARIABLE NO_COMMUNITY_LAYOUTS GET ${QMK_KEYBOARD_INFO_JSON_STRING} community_layouts) + # 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(IDX RANGE ${MAX}) - string(JSON LAYOUT GET ${COMMUNITY_LAYOUTS} ${IDX}) + # 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() + # 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}) - # get the deepest config.h 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) diff --git a/cmake/Utils.cmake b/cmake/Utils.cmake new file mode 100644 index 0000000000..3b4b91d8d4 --- /dev/null +++ b/cmake/Utils.cmake @@ -0,0 +1,25 @@ +macro(json_get_with_default KEY_STR JSON_STR DEFAULT) + # message(STATUS "Getting ${ARGN} for ${KEY_STR}") + string(JSON ${KEY_STR} ERROR_VARIABLE JSON_ERROR GET ${JSON_STR} ${ARGN}) + if(NOT ${JSON_ERROR} STREQUAL "NOTFOUND") + set(${KEY_STR} ${DEFAULT}) + endif() +endmacro() + +macro(json_get KEY_STR JSON_STR) + # message(STATUS "Getting ${ARGN} for ${KEY_STR}") + string(JSON ${KEY_STR} ERROR_VARIABLE JSON_ERROR GET ${JSON_STR} ${ARGN}) + if(NOT ${JSON_ERROR} STREQUAL "NOTFOUND") + unset(${KEY_STR}) + endif() +endmacro() + +macro(parent_list ACTION LIST_STR) + set(ARGS ${ARGN}) + string(REPLACE ";" " " ARGS ${ARGS}) + set(LOCAL_LIST ${${LIST_STR}}) + list(${ACTION} LOCAL_LIST ${ARGS}) + # set in current scope too + set(${LIST_STR} ${LOCAL_LIST}) + set(${LIST_STR} ${LOCAL_LIST} PARENT_SCOPE) +endmacro() \ No newline at end of file diff --git a/data/mappings/info_config.hjson b/data/mappings/info_config.hjson index 46108e6fe6..f82b706ef6 100644 --- a/data/mappings/info_config.hjson +++ b/data/mappings/info_config.hjson @@ -129,7 +129,7 @@ "TAPPING_FORCE_HOLD": {"info_key": "tapping.force_hold", "value_type": "bool", "deprecated": true}, "TAPPING_FORCE_HOLD_PER_KEY": {"info_key": "tapping.force_hold_per_key", "value_type": "bool", "deprecated": true}, "IGNORE_MOD_TAP_INTERRUPT": {"info_key": "_deprecated.ignore_mod_tap_interrupt", "value_type": "bool", "deprecated": true}, - "IGNORE_MOD_TAP_INTERRUPT_PER_KEY": {"info_key": "_invalid.ignore_mod_tap_interrupt_per_key", "invalid": true} + "IGNORE_MOD_TAP_INTERRUPT_PER_KEY": {"info_key": "_invalid.ignore_mod_tap_interrupt_per_key", "invalid": true}, // USB params, need to mark as failure when specified in config.h, rather than deprecated "PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.pid` in info.json"},