1# include targets for all for PICO on device 2 3enable_language(ASM) 4 5function(pico_get_runtime_output_directory TARGET output_path_name) 6 get_target_property(${TARGET}_runtime_directory ${TARGET} RUNTIME_OUTPUT_DIRECTORY) 7 if (${TARGET}_runtime_directory) 8 get_filename_component(output_path "${${TARGET}_runtime_directory}" 9 REALPATH BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}") 10 file(MAKE_DIRECTORY "${output_path}") 11 set(output_path "${output_path}/") 12 else() 13 set(output_path "") 14 endif() 15 set(${output_path_name} ${output_path} PARENT_SCOPE) 16endfunction() 17 18function(pico_add_hex_output TARGET) 19 pico_get_runtime_output_directory(${TARGET} output_path) 20 add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${TARGET}> ${output_path}$<IF:$<BOOL:$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>>,$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>,$<TARGET_PROPERTY:${TARGET},NAME>>.hex VERBATIM) 21endfunction() 22 23function(pico_add_bin_output TARGET) 24 pico_get_runtime_output_directory(${TARGET} output_path) 25 add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${TARGET}> ${output_path}$<IF:$<BOOL:$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>>,$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>,$<TARGET_PROPERTY:${TARGET},NAME>>.bin VERBATIM) 26endfunction() 27 28function(pico_add_dis_output TARGET) 29 pico_get_runtime_output_directory(${TARGET} output_path) 30 31 # PICO_CMAKE_CONFIG: PICO_NO_COPRO_DIS, Disable disassembly listing postprocessing that disassembles RP2350 coprocessor instructions, type=bool, default=0, group=build 32 if (NOT (PICO_NO_COPRO_DIS OR PICO_NO_PICOTOOL OR PICO_RISCV OR PICO_RP2040)) 33 # Don't run coprocessor dissassembly on Risc-V or RP2040, as those don't have the RP2350 coprocessors 34 pico_init_picotool() 35 if(picotool_FOUND) 36 # add custom disassembly if we have picotool 37 set(EXTRA_COMMAND COMMAND picotool coprodis --quiet ${output_path}$<IF:$<BOOL:$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>>,$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>,$<TARGET_PROPERTY:${TARGET},NAME>>.dis ${output_path}$<IF:$<BOOL:$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>>,$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>,$<TARGET_PROPERTY:${TARGET},NAME>>.dis) 38 endif() 39 endif() 40 41 add_custom_command(TARGET ${TARGET} POST_BUILD 42 COMMAND ${CMAKE_OBJDUMP} -h $<TARGET_FILE:${TARGET}> > ${output_path}$<IF:$<BOOL:$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>>,$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>,$<TARGET_PROPERTY:${TARGET},NAME>>.dis 43 COMMAND ${CMAKE_OBJDUMP} -d $<TARGET_FILE:${TARGET}> >> ${output_path}$<IF:$<BOOL:$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>>,$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>,$<TARGET_PROPERTY:${TARGET},NAME>>.dis 44 ${EXTRA_COMMAND} 45 VERBATIM 46 ) 47endfunction() 48 49function(pico_add_extra_outputs TARGET) 50 # Disassembly will be nonsense for encrypted binaries, 51 # so disassemble before picotool processing 52 pico_add_dis_output(${TARGET}) 53 54 # Picotool processing (signing/encrypting/etc) 55 # PICO_CMAKE_CONFIG: PICO_NO_PICOTOOL, Disable use/requirement for picotool meaning that UF2 output and signing/hashing and coprocoessor disassembly will all be unavailable, type=bool, default=0, group=build 56 if (NOT PICO_NO_PICOTOOL) 57 picotool_postprocess_binary(${TARGET} IS_ENCRYPTED) 58 endif() 59 60 if (PICO_32BIT) 61 pico_add_hex_output(${TARGET}) 62 endif() 63 pico_add_bin_output(${TARGET}) 64 pico_add_map_output(${TARGET}) 65 66 # PICO_CMAKE_CONFIG: PICO_NO_TARGET_NAME, Don't define PICO_TARGET_NAME, type=bool, default=0, group=build 67 # PICO_BUILD_DEFINE: PICO_TARGET_NAME, Name of the build target being compiled (unless PICO_NO_TARGET_NAME set in build), type=string, default=target name, group=build 68 if (NOT PICO_NO_TARGET_NAME) 69 target_compile_definitions(${TARGET} PRIVATE 70 PICO_TARGET_NAME="${TARGET}" 71 ) 72 endif() 73 74 if (PICO_SYMLINK_ELF_AS_FILENAME) 75 add_custom_target(${TARGET}_symlinked) 76 add_dependencies(${TARGET}_symlinked ${TARGET}) 77 78 add_custom_command(TARGET ${TARGET}_symlinked POST_BUILD 79 COMMAND rm -f "${PICO_SYMLINK_ELF_AS_FILENAME}" 80 COMMAND ln -s -r $<TARGET_FILE:${TARGET}> "${PICO_SYMLINK_ELF_AS_FILENAME}" 81 COMMENT "Symlinking from ${PICO_SYMLINK_ELF_AS_FILENAME} to ${TARGET}" 82 ) 83 endif () 84 # PICO_CMAKE_CONFIG: PICO_NO_UF2, Disable UF2 output, type=bool, default=0, group=build 85 if (NOT (PICO_NO_UF2 OR PICO_NO_PICOTOOL)) 86 pico_add_uf2_output(${TARGET}) 87 endif() 88endfunction() 89 90# PICO_CMAKE_CONFIG: PICO_NO_HARDWARE, Option as to whether the build is not targeting an RP2040 or RP2350 device, type=bool, default=1 when PICO_PLATFORM is host, 0 otherwise, group=build 91# PICO_BUILD_DEFINE: PICO_NO_HARDWARE, Whether the build is not targeting an RP2040 or RP2350 device, type=bool, default=1 when PICO_PLATFORM is host, 0 otherwise, group=build 92set(PICO_NO_HARDWARE "0" CACHE INTERNAL "") 93# PICO_CMAKE_CONFIG: PICO_ON_DEVICE, Option as to whether the build is targeting an RP2040 or RP2350 device, type=bool, default=0 when PICO_PLATFORM is host, 1 otherwise, group=build 94# PICO_BUILD_DEFINE: PICO_ON_DEVICE, Whether the build is targeting an RP2040 or RP2350 device, type=bool, default=0 when PICO_PLATFORM is host, 1 otherwise, group=build 95set(PICO_ON_DEVICE "1" CACHE INTERNAL "") 96 97set(CMAKE_EXECUTABLE_SUFFIX .elf) 98set(CMAKE_EXECUTABLE_SUFFIX "${CMAKE_EXECUTABLE_SUFFIX}" PARENT_SCOPE) 99