CMakeLists.txt 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. function(_pico_init_pioasm)
  2. if (NOT Pioasm_FOUND)
  3. # Assemble the version string from components instead of using PICO_SDK_VERSION_STRING, because the version string
  4. # potentially has a PRE_RELEASE_ID suffix, which will trip up the find_package call.
  5. find_package(pico-sdk-tools "${PICO_SDK_VERSION_MAJOR}.${PICO_SDK_VERSION_MINOR}.${PICO_SDK_VERSION_REVISION}" QUIET CONFIG CMAKE_FIND_ROOT_PATH_BOTH)
  6. if (NOT Pioasm_FOUND)
  7. set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PICO_SDK_PATH}/tools)
  8. # todo CMAKE_CURRENT_FUNCTION_LIST_DIR ... what version?
  9. find_package(Pioasm REQUIRED)
  10. endif()
  11. endif()
  12. endfunction()
  13. # PICO_CMAKE_CONFIG: PICO_DEFAULT_PIOASM_OUTPUT_FORMAT, default output format used by pioasm when using pico_generate_pio_header, default=c-sdk, group=build
  14. function(pico_generate_pio_header TARGET PIO)
  15. _pico_init_pioasm()
  16. cmake_parse_arguments(pico_generate_pio_header "" "OUTPUT_FORMAT;OUTPUT_DIR" "" ${ARGN} )
  17. if (pico_generate_pio_header_OUTPUT_FORMAT)
  18. set(OUTPUT_FORMAT "${pico_generate_pio_header_OUTPUT_FORMAT}")
  19. elseif(DEFINED PICO_DEFAULT_PIOASM_OUTPUT_FORMAT)
  20. set(OUTPUT_FORMAT "${PICO_DEFAULT_PIOASM_OUTPUT_FORMAT}")
  21. else()
  22. set(OUTPUT_FORMAT "c-sdk")
  23. endif()
  24. if (pico_generate_pio_header_OUTPUT_DIR)
  25. get_filename_component(HEADER_DIR ${pico_generate_pio_header_OUTPUT_DIR} ABSOLUTE)
  26. else()
  27. set(HEADER_DIR "${CMAKE_CURRENT_BINARY_DIR}")
  28. endif()
  29. get_filename_component(PIO_NAME ${PIO} NAME)
  30. set(HEADER "${HEADER_DIR}/${PIO_NAME}.h")
  31. #message("Will generate ${HEADER}")
  32. get_filename_component(HEADER_GEN_TARGET ${PIO} NAME_WE)
  33. set(HEADER_GEN_TARGET "${TARGET}_${HEADER_GEN_TARGET}_pio_h")
  34. add_custom_target(${HEADER_GEN_TARGET} DEPENDS ${HEADER})
  35. add_custom_command(OUTPUT ${HEADER}
  36. DEPENDS ${PIO}
  37. COMMAND Pioasm -o ${OUTPUT_FORMAT} ${PIO} ${HEADER}
  38. VERBATIM)
  39. add_dependencies(${TARGET} ${HEADER_GEN_TARGET})
  40. get_target_property(target_type ${TARGET} TYPE)
  41. if ("INTERFACE_LIBRARY" STREQUAL "${target_type}")
  42. target_include_directories(${TARGET} INTERFACE ${HEADER_DIR})
  43. else()
  44. target_include_directories(${TARGET} PUBLIC ${HEADER_DIR})
  45. endif()
  46. endfunction()
  47. function(pico_add_uf2_output TARGET)
  48. get_target_property(${TARGET}_archive_directory ${TARGET} ARCHIVE_OUTPUT_DIRECTORY)
  49. if (${TARGET}_archive_directory)
  50. get_filename_component(output_path "${${TARGET}_archive_directory}"
  51. REALPATH BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
  52. file(MAKE_DIRECTORY "${output_path}")
  53. set(output_path "${output_path}/")
  54. else()
  55. set(output_path "")
  56. endif()
  57. if (NOT ELF2UF2_FOUND)
  58. find_package(pico-sdk-tools "${PICO_SDK_VERSION_MAJOR}.${PICO_SDK_VERSION_MINOR}.${PICO_SDK_VERSION_REVISION}" QUIET CONFIG CMAKE_FIND_ROOT_PATH_BOTH)
  59. if (NOT ELF2UF2_FOUND)
  60. set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PICO_SDK_PATH}/tools)
  61. find_package(ELF2UF2)
  62. endif()
  63. endif()
  64. if (ELF2UF2_FOUND)
  65. add_custom_command(TARGET ${TARGET} POST_BUILD
  66. COMMAND ELF2UF2 $<TARGET_FILE:${TARGET}> ${output_path}$<IF:$<BOOL:$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>>,$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>,$<TARGET_PROPERTY:${TARGET},NAME>>.uf2
  67. VERBATIM)
  68. endif()
  69. endfunction()