AddKeyboard.cmake 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER)
  2. # not entirely sure why this is necessary
  3. set(TEMP_PATH ${KEYBOARD_FOLDER})
  4. cmake_path(IS_RELATIVE TEMP_PATH IS_KEYBOARD_FOLDER_RELATIVE)
  5. if(${IS_KEYBOARD_FOLDER_RELATIVE})
  6. set(KEYBOARD_FOLDER_ABS ${CMAKE_SOURCE_DIR}/keyboards/${KEYBOARD_FOLDER})
  7. if(NOT EXISTS ${KEYBOARD_FOLDER_ABS})
  8. message(FATAL_ERROR "Keyboard does not exist in QMK - try using an absolute path to the keyboard folder")
  9. endif()
  10. else()
  11. set(KEYBOARD_FOLDER_ABS ${KEYBOARD_FOLDER})
  12. if(NOT EXISTS ${KEYBOARD_FOLDER_ABS})
  13. message(FATAL_ERROR "Absolute path to keyboard does not exist")
  14. endif()
  15. endif()
  16. set(TEMP_PATH ${KEYMAP_FOLDER})
  17. cmake_path(IS_RELATIVE TEMP_PATH IS_KEYMAP_FOLDER_RELATIVE)
  18. if(${IS_KEYMAP_FOLDER_RELATIVE})
  19. set(KEYMAP_NAME ${KEYMAP_FOLDER})
  20. else()
  21. if(WIN32)
  22. set(KEYMAP_NAME $ENV{USERNAME})
  23. else()
  24. set(KEYMAP_NAME $ENV{USE})
  25. endif()
  26. endif()
  27. # find the right toolchain
  28. # not sure we need to validate here
  29. include(ValidateJSON)
  30. validate_json(${KEYBOARD_FOLDER_ABS}/info.json keyboard JSON_STRING)
  31. string(JSON PROCESSOR GET ${JSON_STRING} processor)
  32. if(${PROCESSOR} MATCHES "^at.*")
  33. set(PLATFORM "avr")
  34. include(FindAVRToolchain)
  35. find_avr_toolchain()
  36. elseif(
  37. ${PROCESSOR} MATCHES "^STM.*" OR
  38. ${PROCESSOR} MATCHES "^WB32.*" OR
  39. ${PROCESSOR} MATCHES "^MK.*" OR
  40. ${PROCESSOR} MATCHES "RP2040" OR
  41. ${PROCESSOR} MATCHES "^GD32.*")
  42. set(PLATFORM "chibios")
  43. include(FindARMToolchain)
  44. find_arm_toolchain()
  45. endif()
  46. if(NOT DEFINED PLATFORM)
  47. message(FATAL_ERROR "Could not find platform for ${KEYBOARD_FOLDER}")
  48. endif()
  49. if(${IS_KEYBOARD_FOLDER_RELATIVE})
  50. string(REPLACE "/" "_" KEYBOARD_NAME ${KEYBOARD_FOLDER})
  51. else()
  52. string(JSON KEYBOARD_NAME GET ${JSON_STRING} keyboard_name)
  53. string(REPLACE " " "_" KEYBOARD_NAME ${KEYBOARD_NAME})
  54. endif()
  55. ExternalProject_Add(${KEYBOARD_NAME}_${KEYMAP_NAME}
  56. SOURCE_DIR ${CMAKE_SOURCE_DIR}
  57. PREFIX ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}
  58. TMP_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/tmp
  59. DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Download
  60. BINARY_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Build
  61. STAMP_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Stamp
  62. LOG_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Log
  63. INSTALL_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}/Install
  64. INSTALL_COMMAND cmake -E echo "No install needed"
  65. # this seems to work well for all systems so far - not sure if it'd be useful to customize
  66. CMAKE_GENERATOR "Unix Makefiles"
  67. CMAKE_ARGS
  68. -DCMAKE_TOOLCHAIN_FILE=${CMAKE_SOURCE_DIR}/platforms/${PLATFORM}/toolchain.cmake
  69. -DTOOLCHAIN_ROOT=${TOOLCHAIN_ROOT}
  70. -DMAKE_ROOT=${MAKE_ROOT}
  71. -DQMK_KEYBOARD=${KEYBOARD_NAME}
  72. -DQMK_KEYBOARD_FOLDER=${KEYBOARD_FOLDER}
  73. -DQMK_KEYMAP_FOLDER=${KEYMAP_FOLDER}
  74. )
  75. endmacro(add_keyboard)