diff --git a/src/rp2_common/pico_standard_link/CMakeLists.txt b/src/rp2_common/pico_standard_link/CMakeLists.txt index a428eb69d..a89f15c3e 100644 --- a/src/rp2_common/pico_standard_link/CMakeLists.txt +++ b/src/rp2_common/pico_standard_link/CMakeLists.txt @@ -30,6 +30,51 @@ if (NOT TARGET pico_standard_link) set_target_properties(${TARGET} PROPERTIES PICO_TARGET_BINARY_TYPE ${TYPE}) endfunction() + function(pico_set_modified_binary_type TARGET TYPE) + set(multiValueArgs RAM SCRATCH_X SCRATCH_Y) + cmake_parse_arguments(PARSE_ARGV 0 args + "" "" "${multiValueArgs}" + ) + + pico_set_binary_type(${TARGET} ${TYPE}) + + # Scripts that will be created by this function + set(LINKER_CMAKE_SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/memmap_${TARGET}.cmake") + set(LINKER_LD_SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/memmap_${TARGET}.ld") + + # Configure memmap_${TARGET}.cmake script file to create memmap_${TARGET}.ld + if (args_RAM) + list(POP_FRONT args_RAM ORIGIN LENGTH) + set(RAM "string(REGEX REPLACE \"RAM\\\\(rwx\\\\) *: *ORIGIN *= *[0-9xX]*, *LENGTH *= *[0-9kKmM]*\\n\" \"RAM(rwx) : ORIGIN = ${ORIGIN}, LENGTH = ${LENGTH}\\n\" LINKER_SCRIPT \"\${LINKER_SCRIPT}\")\n") + endif() + if (args_SCRATCH_X) + list(POP_FRONT args_SCRATCH_X ORIGIN LENGTH) + set(SCRATCH_X "string(REGEX REPLACE \"SCRATCH_X\\\\(rwx\\\\) *: *ORIGIN *= *[0-9xX]*, *LENGTH *= *[0-9kKmM]*\\n\" \"SCRATCH_X(rwx) : ORIGIN = ${ORIGIN}, LENGTH = ${LENGTH}\\n\" LINKER_SCRIPT \"\${LINKER_SCRIPT}\")\n") + endif() + if (args_SCRATCH_Y) + list(POP_FRONT args_SCRATCH_Y ORIGIN LENGTH) + set(SCRATCH_Y "string(REGEX REPLACE \"SCRATCH_Y\\\\(rwx\\\\) *: *ORIGIN *= *[0-9xX]*, *LENGTH *= *[0-9kKmM]*\\n\" \"SCRATCH_Y(rwx) : ORIGIN = ${ORIGIN}, LENGTH = ${LENGTH}\\n\" LINKER_SCRIPT \"\${LINKER_SCRIPT}\")\n") + endif() + if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.17.0") + # CMAKE_CURRENT_FUNCTION_LIST_DIR added in 3.17.0 + configure_file(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/memmap_script.template.cmake ${LINKER_CMAKE_SCRIPT} @ONLY) + else() + configure_file(${PICO_SDK_PATH}src/rp2_common/pico_standard_link/memmap_script.template.cmake ${LINKER_CMAKE_SCRIPT} @ONLY) + endif() + + # Add command to run this script whenever it or memmap_${TYPE}.ld changes + add_custom_command(OUTPUT ${LINKER_LD_SCRIPT} + COMMAND ${CMAKE_COMMAND} + -DPICO_LINKER_SCRIPT_PATH:PATH=${PICO_LINKER_SCRIPT_PATH} + -Doutput_file:FILEPATH=${LINKER_LD_SCRIPT} + -P "${LINKER_CMAKE_SCRIPT}" + DEPENDS ${PICO_LINKER_SCRIPT_PATH}/memmap_${TYPE}.ld ${LINKER_CMAKE_SCRIPT}) + add_custom_target(memmap_${TARGET}_ld DEPENDS ${LINKER_LD_SCRIPT}) + add_dependencies(${TARGET} memmap_${TARGET}_ld) + + pico_set_linker_script(${TARGET} ${CMAKE_CURRENT_BINARY_DIR}/memmap_${TARGET}.ld) + endfunction() + if (NOT PICO_DEFAULT_BINARY_TYPE) if (PICO_NO_FLASH) set(PICO_DEFAULT_BINARY_TYPE no_flash) diff --git a/src/rp2_common/pico_standard_link/memmap_script.template.cmake b/src/rp2_common/pico_standard_link/memmap_script.template.cmake new file mode 100644 index 000000000..533dbd2a5 --- /dev/null +++ b/src/rp2_common/pico_standard_link/memmap_script.template.cmake @@ -0,0 +1,5 @@ +file(READ ${PICO_LINKER_SCRIPT_PATH}/memmap_@TYPE@.ld LINKER_SCRIPT) +@RAM@ +@SCRATCH_X@ +@SCRATCH_Y@ +file(WRITE ${output_file} "${LINKER_SCRIPT}")