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