@@ -30,6 +30,51 @@ if (NOT TARGET pico_standard_link)
3030 set_target_properties (${TARGET} PROPERTIES PICO_TARGET_BINARY_TYPE ${TYPE} )
3131 endfunction ()
3232
33+ function (pico_set_modified_binary_type TARGET TYPE )
34+ set (multiValueArgs RAM SCRATCH_X SCRATCH_Y)
35+ cmake_parse_arguments (PARSE_ARGV 0 args
36+ "" "" "${multiValueArgs} "
37+ )
38+
39+ pico_set_binary_type(${TARGET} ${TYPE} )
40+
41+ # Scripts that will be created by this function
42+ set (LINKER_CMAKE_SCRIPT "${CMAKE_CURRENT_BINARY_DIR} /memmap_${TARGET} .cmake" )
43+ set (LINKER_LD_SCRIPT "${CMAKE_CURRENT_BINARY_DIR} /memmap_${TARGET} .ld" )
44+
45+ # Configure memmap_${TARGET}.cmake script file to create memmap_${TARGET}.ld
46+ if (args_RAM)
47+ list (POP_FRONT args_RAM ORIGIN LENGTH )
48+ 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 " )
49+ endif ()
50+ if (args_SCRATCH_X)
51+ list (POP_FRONT args_SCRATCH_X ORIGIN LENGTH )
52+ 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 " )
53+ endif ()
54+ if (args_SCRATCH_Y)
55+ list (POP_FRONT args_SCRATCH_Y ORIGIN LENGTH )
56+ 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 " )
57+ endif ()
58+ if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.17.0" )
59+ # CMAKE_CURRENT_FUNCTION_LIST_DIR added in 3.17.0
60+ configure_file (${CMAKE_CURRENT_FUNCTION_LIST_DIR} /memmap_script.template.cmake ${LINKER_CMAKE_SCRIPT} @ONLY)
61+ else ()
62+ configure_file (${PICO_SDK_PATH} src/rp2_common/pico_standard_link/memmap_script.template.cmake ${LINKER_CMAKE_SCRIPT} @ONLY)
63+ endif ()
64+
65+ # Add command to run this script whenever it or memmap_${TYPE}.ld changes
66+ add_custom_command (OUTPUT ${LINKER_LD_SCRIPT}
67+ COMMAND ${CMAKE_COMMAND}
68+ -DPICO_LINKER_SCRIPT_PATH:PATH =${PICO_LINKER_SCRIPT_PATH}
69+ -Doutput_file:FILEPATH =${LINKER_LD_SCRIPT}
70+ -P "${LINKER_CMAKE_SCRIPT} "
71+ DEPENDS ${PICO_LINKER_SCRIPT_PATH} /memmap_${TYPE} .ld ${LINKER_CMAKE_SCRIPT} )
72+ add_custom_target (memmap_${TARGET} _ld DEPENDS ${LINKER_LD_SCRIPT} )
73+ add_dependencies (${TARGET} memmap_${TARGET} _ld)
74+
75+ pico_set_linker_script(${TARGET} ${CMAKE_CURRENT_BINARY_DIR} /memmap_${TARGET} .ld)
76+ endfunction ()
77+
3378 if (NOT PICO_DEFAULT_BINARY_TYPE)
3479 if (PICO_NO_FLASH)
3580 set (PICO_DEFAULT_BINARY_TYPE no_flash)
0 commit comments