Support for CMake find_package and imported targets #1476
Labels
No labels
bazel
bluetooth
board settings
boot_stage2
bug
build
c++
can't reproduce
clang
clib-interface
cmsis
code cleanliness
code size
compiler version issues
cyw43_driver
debug
discussion
documentation
duplicate
dynamic_clock
elf2uf2
enhancement
errata
filesystem
flash layout
floating point
FreeRTOS
hardware_adc
hardware_claim
hardware_clocks
hardware_dma
hardware_exception
hardware_flash
hardware_gpio
hardware_i2c
hardware_irq
hardware_pio
hardware_pwm
hardware_rcp
hardware_rtc
hardware_spi
hardware_sync
hardware_uart
hardware_vreg
hardware_watchdog
hardware_xosc
help wanted
host
IAR
installation
invalid
linker scripts
lto
lwip
mbedtls
missing API
needs reporter detail
networking
newlib
newlib-multicore
non-c
non-cmake
non-gcc
openocd
orphan PR
OS integration
pico_async_context
pico_base
pico_binary_info
pico_flash
picolibc
pico_lwip
pico_malloc
pico_multicore
pico_printf
pico_runtime
pico_stdio
pico_stdio_usb
pico_sync
pico_time
pico_util
pioasm
port
question
review
review2
rtos interop
runtime init
static library
svd
test
tinyusb
vscode
wifi integration
wontfix
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
gh-raspberrypi/pico-sdk#1476
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
I'm curious and wondering if the maintainers are open to adopting a more standard approach to pico-sdk's CMake integration based on the CMake's guides for package maintainers, including Using Dependencies, Import and Exporting, and Finding Packages. Finding and linking to libraries in a modern CMake project typically utilizes
find_package(...)calls, linking to namespaced imported targets, and doesn't require library-specific CMake macro/function calls to "fully initialize" the dependency likepico_sdk_init(). A limited example would look like this:As I see it, only one change is required to get this to work with some lifting on the user's part. Removing the requirement to include
pico_sdk_init.cmakebefore theproject(...)call allows users to write their ownFindPicoSdk.cmake, thus gaining a similar experience to pico-sdk shipping CMake configuration files. If anyone knows why, I'd love to know what in that CMake file makes this a requirement; nothing obvious stood out to me when I read through it.Optionally, pico-sdk can fully support CMake conventions with some additional changes:
install(...)a CMake export set and a package configuration file (version files optional but good too)./usr/local/) or elsewhere (e.g.,/optor~/.local/); or ship a system packagepico-sdk-devthat installs sources to system paths directly (/usr/)Let me know what you think about this proposal. I have experience writing and maintaining CMake packages and would be happy to jump in to making improvements and fixes.
We are certainly interested in being more standards compliant.... seems like it might be a bit of a backwards incompatibility so positing a 2.0 SDK release
2.0 seems fine to me. What's the process to get this contributed? There'll need to be some decisions made on where/how installation is performed (e.g., src or binary distribution, installation path).
A few random thoughts about how things could work better.
Compiler flags are typically set up on the exported library target that you set up in the the pico-sdk CMakeLists.txt. These flags will continue on with the target when the user imports the target via the
find_package(pico-sdk)call. I've never seen a case wherefind_package(...)is called beforeproject(...)and I'm curious what sort of flags and things need to be inferred before setting up the compiler and before theproject(...)call?Regarding a mechanism to perform initialization when the user
find_package(pico-sdk), that's entirely up to the library authors. When creating the package configuration file, you have complete flexibility in what is performed. The general process is you write your ownpico-sdk-config.cmakefile, which can contain any initialization necessary for the package, install it to the [relocatable]lib/cmake/pico-sdkdirectory, andfind_package(pico-sdk)will search forpico-sdk-config.cmakewithin several predefined locations on the user's filesystem and invoke whatever is in thatpico-sdk-config.cmakefile. This is specifically called "config mode" and is set up by packages that natively support CMake, as opposed to "module mode" or "find modules," which is intended for supporting packages without native CMake support.Most (non-capatably?) we do select (default) the toolchain file based on the
PICO_PLATFORMand orPICO_BOARDvariable... we then do a bunch of other configuration (including the toolchain) but that is maybe fine.I think it's typical to specify toolchain files when invoking the cmake executable with
--toolchain path/to/toolchain.cmakeor-DCMAKE_TOOLCHAIN_FILE=path/to/toolchain.cmake.Does that mean that everywhere in https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf where we do
cmake ..we'd need to change it tocmake --toolchain path/to/toolchain.cmake ..? (which is obviously somewhat less user-friendly)Or setting the
CMAKE_TOOLCHAIN_FILEenvironment variable once and runningCMAKE_TOOLCHAIN_FILE=path/to/file cmake ... This gets persisted to the CMake cache so is only necessary on the first call so subsequent calls can becmake ..I've had a look into this, and I don't think we'd want to switch to this being the recommended way to do things due to needing to specify the toolchain file, but it should be possible to support doing it this way (with a toolchain file, and then a
find_packagecall after the project). I'll have a go and open up a PR