AddKeyboard.cmake 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. include(ResolveKeyboard)
  2. include(ValidateJson)
  3. include(ResolveToolchain)
  4. macro(add_keyboard KEYBOARD_FOLDER KEYMAP_FOLDER)
  5. # not entirely sure why this is necessary
  6. # set(TEMP_PATH ${KEYBOARD_FOLDER})
  7. # cmake_path(IS_RELATIVE TEMP_PATH IS_KEYBOARD_FOLDER_RELATIVE)
  8. # if(${IS_KEYBOARD_FOLDER_RELATIVE})
  9. # set(KEYBOARD_FOLDER_ABS ${CMAKE_SOURCE_DIR}/keyboards/${KEYBOARD_FOLDER})
  10. # if(NOT EXISTS ${KEYBOARD_FOLDER_ABS})
  11. # # message(FATAL_ERROR "Keyboard does not exist in QMK - try using an absolute path to the keyboard folder")
  12. # resolve_keyboard(${KEYBOARD_FOLDER} KEYBOARD_FOLDER_ABS)
  13. # endif()
  14. # else()
  15. # set(KEYBOARD_FOLDER_ABS ${KEYBOARD_FOLDER})
  16. # if(NOT EXISTS ${KEYBOARD_FOLDER_ABS})
  17. # message(FATAL_ERROR "Absolute path to keyboard does not exist")
  18. # endif()
  19. # endif()
  20. resolve_keyboard(${KEYBOARD_FOLDER} KEYBOARD_FOLDER_ABS)
  21. set(TEMP_PATH ${KEYBOARD_FOLDER})
  22. cmake_path(IS_RELATIVE TEMP_PATH IS_KEYBOARD_FOLDER_RELATIVE)
  23. set(TEMP_PATH ${KEYMAP_FOLDER})
  24. cmake_path(IS_RELATIVE TEMP_PATH IS_KEYMAP_FOLDER_RELATIVE)
  25. if(${IS_KEYMAP_FOLDER_RELATIVE})
  26. set(KEYMAP_NAME ${KEYMAP_FOLDER})
  27. else()
  28. if(WIN32)
  29. set(KEYMAP_NAME $ENV{USERNAME})
  30. else()
  31. set(KEYMAP_NAME $ENV{USE})
  32. endif()
  33. endif()
  34. # find the right toolchain
  35. # not sure we need to validate here
  36. validate_json(${KEYBOARD_FOLDER_ABS}/info.json keyboard JSON_STRING)
  37. string(JSON PROCESSOR GET ${JSON_STRING} processor)
  38. resolve_toolchain(${PROCESSOR} TOOLCHAIN)
  39. string(JSON KEYBOARD_NAME GET ${JSON_STRING} keyboard_name)
  40. if(${IS_KEYBOARD_FOLDER_RELATIVE})
  41. string(MAKE_C_IDENTIFIER ${KEYBOARD_FOLDER} KEYBOARD_SLUG)
  42. else()
  43. string(MAKE_C_IDENTIFIER ${KEYBOARD_NAME} KEYBOARD_SLUG)
  44. endif()
  45. string(JSON MANUFACTURER GET ${JSON_STRING} manufacturer)
  46. set(TARGET_NAME "${KEYBOARD_SLUG}_${KEYMAP_NAME}")
  47. ExternalProject_Add(${TARGET_NAME}
  48. SOURCE_DIR ${CMAKE_SOURCE_DIR}
  49. # PREFIX ${CMAKE_SOURCE_DIR}/build/keyboards/${KEYBOARD_FOLDER}
  50. TMP_DIR ${CMAKE_SOURCE_DIR}/build/tmp
  51. DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/build/download
  52. BINARY_DIR ${CMAKE_SOURCE_DIR}/build/keyboards/${TARGET_NAME}
  53. STAMP_DIR ${CMAKE_SOURCE_DIR}/build/stamp
  54. LOG_DIR ${CMAKE_SOURCE_DIR}/build/log
  55. INSTALL_DIR ${CMAKE_SOURCE_DIR}/build/install
  56. INSTALL_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/build/${TARGET_NAME}${QMK_EXTENSION} ${CMAKE_SOURCE_DIR}/${TARGET_NAME}${QMK_EXTENSION}
  57. # this seems to work well for all systems so far - not sure if it'd be useful to customize
  58. CMAKE_GENERATOR "Unix Makefiles"
  59. CMAKE_ARGS
  60. -DCMAKE_TOOLCHAIN_FILE=${CMAKE_SOURCE_DIR}/cmake/toolchains/${TOOLCHAIN}.cmake
  61. -DQMK_KEYBOARD=${KEYBOARD_SLUG}
  62. -DQMK_KEYBOARD_FOLDER=${KEYBOARD_FOLDER}
  63. -DQMK_KEYMAP_FOLDER=${KEYMAP_FOLDER}
  64. -DTARGET_NAME=${TARGET_NAME}
  65. )
  66. ExternalProject_Add_Step(${TARGET_NAME} copy_compile_commands
  67. DEPENDEES configure
  68. DEPENDERS build
  69. COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/build/keyboards/${TARGET_NAME}/compile_commands.json ${CMAKE_SOURCE_DIR}/compile_commands.json
  70. # BYPRODUCTS ${CMAKE_SOURCE_DIR}/compile_commands.json
  71. ALWAYS TRUE
  72. )
  73. # file(APPEND "${CMAKE_SOURCE_DIR}/build/targets" "${TARGET_NAME}|${KEYBOARD_NAME} with ${KEYMAP_FOLDER}|${KEYBOARD_FOLDER}|Made by: ${MANUFACTURER}\n")
  74. endmacro(add_keyboard)