-
Notifications
You must be signed in to change notification settings - Fork 108
/
CMakeLists.txt
306 lines (270 loc) · 11.4 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
cmake_minimum_required(VERSION 3.12)
project(picotool)
if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
if (DEFINED ENV{PICO_SDK_PATH} AND (NOT PICO_SDK_PATH))
set(PICO_SDK_PATH $ENV{PICO_SDK_PATH})
message("Using PICO_SDK_PATH from environment ('${PICO_SDK_PATH}')")
endif ()
if (NOT PICO_SDK_PATH)
message(FATAL_ERROR "PICO_SDK_PATH is not defined")
endif()
get_filename_component(PICO_SDK_PATH "${PICO_SDK_PATH}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}")
if (NOT EXISTS ${PICO_SDK_PATH})
message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' not found")
endif ()
include(${PICO_SDK_PATH}/pico_sdk_version.cmake)
if (PICO_SDK_VERSION_STRING VERSION_LESS "2.0.0")
message(FATAL_ERROR "Raspberry Pi Pico SDK version 2.0.0 (or later) required. Your version is ${PICO_SDK_VERSION_STRING}")
endif()
# Set PICOTOOL_CODE_OTP to compile OTP definitions in - otherwise, they are included from JSON
if (NOT PICOTOOL_CODE_OTP)
set(PICOTOOL_CODE_OTP 0)
endif()
# allow installing to flat dir
include(GNUInstallDirs)
if (PICOTOOL_FLAT_INSTALL)
set(INSTALL_CONFIGDIR picotool)
set(INSTALL_DATADIR picotool)
set(INSTALL_BINDIR picotool)
else()
set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/picotool)
set(INSTALL_DATADIR ${CMAKE_INSTALL_DATADIR}/picotool)
set(INSTALL_BINDIR ${CMAKE_INSTALL_BINDIR})
endif()
# todo better install paths for this
set(DATA_LOCS "./" "${CMAKE_INSTALL_PREFIX}/${INSTALL_DATADIR}/")
message(${DATA_LOCS})
string(REGEX REPLACE ";" "\",\"" DATA_LOCS_VEC "${DATA_LOCS}")
configure_file(data_locs.template.cpp ${CMAKE_CURRENT_BINARY_DIR}/data_locs.cpp)
include(ExternalProject)
if (MSVC)
set(CMAKE_CXX_STANDARD 20)
else()
set(CMAKE_CXX_STANDARD 14)
endif()
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake)
if (NOT PICOTOOL_NO_LIBUSB)
# compile xip_ram_perms.elf
if (NOT DEFINED USE_PRECOMPILED)
set(USE_PRECOMPILED true)
endif()
ExternalProject_Add(xip_ram_perms
PREFIX xip_ram_perms
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/xip_ram_perms
BINARY_DIR ${CMAKE_BINARY_DIR}/xip_ram_perms
CMAKE_ARGS
"-DCMAKE_MAKE_PROGRAM:FILEPATH=${CMAKE_MAKE_PROGRAM}"
"-DPICO_SDK_PATH:FILEPATH=${PICO_SDK_PATH}"
"-DUSE_PRECOMPILED:BOOL=${USE_PRECOMPILED}"
BUILD_ALWAYS 1 # todo remove this
INSTALL_COMMAND ""
)
set(XIP_RAM_PERMS_ELF ${CMAKE_BINARY_DIR}/xip_ram_perms/xip_ram_perms.elf)
add_executable(xip_ram_perms_elf IMPORTED)
add_dependencies(xip_ram_perms_elf xip_ram_perms)
set_property(TARGET xip_ram_perms_elf PROPERTY IMPORTED_LOCATION ${XIP_RAM_PERMS_ELF})
# copy xip_ram_perms.elf into build directory
add_custom_command(TARGET xip_ram_perms
COMMAND ${CMAKE_COMMAND} -E copy ${XIP_RAM_PERMS_ELF} ${CMAKE_BINARY_DIR}/xip_ram_perms.elf
DEPENDS xip_ram_perms
)
# We want to generate headers from WELCOME.HTM etc.
ExternalProject_Add(otp_header_parser
PREFIX otp_header_parser
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/otp_header_parser
BINARY_DIR ${CMAKE_BINARY_DIR}/otp_header_parser
CMAKE_ARGS "-DCODE_OTP=${PICOTOOL_CODE_OTP}"
BUILD_ALWAYS 1 # todo remove this
DOWNLOAD_COMMAND ""
INSTALL_COMMAND ""
)
add_executable(otp_header_parse IMPORTED)
# think this is the best way to do this - this should work in MSVC now, and possibly Xcode but that's untested
add_dependencies(otp_header_parse otp_header_parser)
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if (is_multi_config)
# use the first config
list(GET CMAKE_CONFIGURATION_TYPES 0 tmp_config)
set_property(TARGET otp_header_parse PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/otp_header_parser/${tmp_config}/otp_header_parse)
else()
set_property(TARGET otp_header_parse PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/otp_header_parser/otp_header_parse)
endif()
if (PICOTOOL_CODE_OTP)
set(GENERATED_H ${CMAKE_CURRENT_BINARY_DIR}/otp_contents.h)
add_custom_target(generate_otp_header DEPENDS ${GENERATED_H})
add_custom_command(OUTPUT ${GENERATED_H}
COMMENT "Generating ${GENERATED_H}"
DEPENDS ${PICO_SDK_PATH}/src/rp2350/hardware_regs/include/hardware/regs/otp_data.h
COMMAND otp_header_parse ${PICO_SDK_PATH}/src/rp2350/hardware_regs/include/hardware/regs/otp_data.h ${GENERATED_H}
)
elseif(MSVC)
set(GENERATED_JSON ${CMAKE_CURRENT_BINARY_DIR}/rp2350_otp_contents.json)
add_custom_target(generate_otp_header DEPENDS ${GENERATED_JSON})
add_custom_command(OUTPUT ${GENERATED_JSON}
COMMENT "Generating ${GENERATED_JSON}"
DEPENDS ${PICO_SDK_PATH}/src/rp2350/hardware_regs/include/hardware/regs/otp_data.h
COMMAND otp_header_parse ${PICO_SDK_PATH}/src/rp2350/hardware_regs/include/hardware/regs/otp_data.h ${GENERATED_JSON}
)
# Cannot include json in the binary, as the string is too long, so needs to use pre-generated xxd output
configure_file(${CMAKE_CURRENT_LIST_DIR}/otp_header_parser/rp2350.json.h ${CMAKE_CURRENT_BINARY_DIR}/rp2350.json.h COPYONLY)
else()
set(GENERATED_JSON ${CMAKE_CURRENT_BINARY_DIR}/rp2350_otp_contents.json)
add_custom_target(generate_otp_header DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/rp2350.json.h)
add_custom_command(OUTPUT ${GENERATED_JSON}
COMMENT "Generating ${GENERATED_JSON}"
DEPENDS ${PICO_SDK_PATH}/src/rp2350/hardware_regs/include/hardware/regs/otp_data.h
COMMAND otp_header_parse ${PICO_SDK_PATH}/src/rp2350/hardware_regs/include/hardware/regs/otp_data.h ${GENERATED_JSON}
)
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/rp2350.json.h
COMMAND ${CMAKE_COMMAND}
-D GENERATED_JSON=${GENERATED_JSON}
-P ${CMAKE_CURRENT_LIST_DIR}/cmake/jsonh.cmake
DEPENDS ${GENERATED_JSON}
COMMENT "Configuring rp2350.json.h"
VERBATIM)
endif()
endif()
add_custom_target(binary_data DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/rp2350.rom.h ${CMAKE_CURRENT_BINARY_DIR}/xip_ram_perms_elf.h)
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/rp2350.rom.h
COMMAND ${CMAKE_COMMAND}
-D BINARY_FILE=${CMAKE_CURRENT_LIST_DIR}/bootrom.end.bin
-D OUTPUT_NAME=rp2350.rom
-P ${CMAKE_CURRENT_LIST_DIR}/cmake/binh.cmake
COMMENT "Configuring rp2350.rom.h"
VERBATIM)
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/xip_ram_perms_elf.h
COMMAND ${CMAKE_COMMAND}
-D BINARY_FILE=${XIP_RAM_PERMS_ELF}
-D OUTPUT_NAME=xip_ram_perms_elf
-P ${CMAKE_CURRENT_LIST_DIR}/cmake/binh.cmake
DEPENDS xip_ram_perms
COMMENT "Configuring xip_ram_perms_elf.h"
VERBATIM)
add_subdirectory(errors)
add_subdirectory(picoboot_connection)
add_subdirectory(elf)
add_subdirectory(elf2uf2)
# To configure mbedtls
# todo make the configuration better
set(MBEDTLS_CONFIG_FILE "mbedtls_config.h")
add_compile_options(-I${CMAKE_SOURCE_DIR}/lib/include)
add_subdirectory(lib)
add_subdirectory(bintool)
if (NOT PICOTOOL_NO_LIBUSB)
find_package(LIBUSB)
set(OTP_EXE otp.cpp)
else()
set(OTP_EXE no_otp.cpp)
endif()
add_subdirectory(${PICO_SDK_PATH}/src/common/pico_binary_info pico_binary_info)
add_subdirectory(${PICO_SDK_PATH}/src/common/boot_uf2_headers boot_uf2_headers)
add_subdirectory(${PICO_SDK_PATH}/src/common/boot_picoboot_headers boot_picoboot_headers)
add_subdirectory(${PICO_SDK_PATH}/src/common/boot_picobin_headers boot_picobin_headers)
add_subdirectory(${PICO_SDK_PATH}/src/common/pico_usb_reset_interface_headers pico_usb_reset_interface_headers)
add_subdirectory(${PICO_SDK_PATH}/src/host/pico_platform pico_platform)
add_library(pico_bootrom_headers INTERFACE)
target_include_directories(pico_bootrom_headers INTERFACE ${PICO_SDK_PATH}/src/rp2_common/pico_bootrom/include)
add_library(regs_headers INTERFACE)
target_include_directories(regs_headers INTERFACE ${PICO_SDK_PATH}/src/rp2350/hardware_regs/include)
# Main picotool executable
add_executable(picotool
data_locs.cpp
${OTP_EXE}
main.cpp)
if (NOT PICOTOOL_NO_LIBUSB)
target_sources(picotool PRIVATE xip_ram_perms.cpp)
add_dependencies(picotool generate_otp_header xip_ram_perms_elf binary_data)
endif()
set(PROJECT_VERSION 2.0.0)
set(PICOTOOL_VERSION 2.0.0)
set(SYSTEM_VERSION "${CMAKE_SYSTEM_NAME}")
set(COMPILER_INFO "${CMAKE_C_COMPILER_ID}-${CMAKE_C_COMPILER_VERSION}, ${CMAKE_BUILD_TYPE}")
target_compile_definitions(picotool PRIVATE
PICOTOOL_VERSION="${PICOTOOL_VERSION}"
SYSTEM_VERSION="${SYSTEM_VERSION}"
COMPILER_INFO="${COMPILER_INFO}"
SUPPORT_A2=1
CODE_OTP=${PICOTOOL_CODE_OTP}
)
# for OTP info
target_include_directories(picotool PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
# todo, this is a bit of an abstraction failure; but don't want to rev the SDK just for this right now
target_include_directories(picotool PRIVATE ${PICO_SDK_PATH}/src/rp2_common/pico_stdio_usb/include)
target_link_libraries(picotool
pico_binary_info
boot_uf2_headers
boot_picoboot_headers
boot_picobin_headers
pico_bootrom_headers
pico_platform_headers
pico_usb_reset_interface_headers
regs_headers
bintool
elf2uf2
errors
nlohmann_json
whereami)
if (NOT TARGET mbedtls)
message("mbedtls not found - no signing/hashing support will be built")
target_compile_definitions(picotool PRIVATE HAS_MBEDTLS=0)
else()
target_compile_definitions(picotool PRIVATE HAS_MBEDTLS=1)
endif()
if (NOT LIBUSB_FOUND)
message("libUSB is not found - no USB support will be built")
target_compile_definitions(picotool PRIVATE HAS_LIBUSB=0)
target_link_libraries(picotool
picoboot_connection_header)
else()
target_include_directories(picotool PRIVATE ${LIBUSB_INCLUDE_DIR})
target_compile_definitions(picotool PRIVATE HAS_LIBUSB=1)
target_link_libraries(picotool
picoboot_connection_cxx
${LIBUSB_LIBRARIES})
endif()
# allow `make install`
install(TARGETS picotool
EXPORT picotool-targets
RUNTIME DESTINATION ${INSTALL_BINDIR}
)
#Export the targets to a script
install(EXPORT picotool-targets
FILE
picotoolTargets.cmake
DESTINATION
${INSTALL_CONFIGDIR}
)
#Create a ConfigVersion.cmake file
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/picotoolConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion
ARCH_INDEPENDENT
)
configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/cmake/picotoolConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/picotoolConfig.cmake
INSTALL_DESTINATION ${INSTALL_CONFIGDIR}
)
#Install the config and configversion
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/picotoolConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/picotoolConfigVersion.cmake
DESTINATION ${INSTALL_CONFIGDIR}
)
if (NOT PICOTOOL_NO_LIBUSB)
if (NOT PICOTOOL_CODE_OTP)
#Install the otp json
install(FILES
${GENERATED_JSON}
DESTINATION ${INSTALL_DATADIR}
)
endif()
#Install xip_ram_perms.elf
install(FILES
${XIP_RAM_PERMS_ELF}
DESTINATION ${INSTALL_DATADIR}
)
endif()