Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for CMake find_package and imported targets #1476

Open
asasine opened this issue Aug 15, 2023 · 9 comments
Open

Support for CMake find_package and imported targets #1476

asasine opened this issue Aug 15, 2023 · 9 comments
Assignees
Milestone

Comments

@asasine
Copy link

asasine commented Aug 15, 2023

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 like pico_sdk_init(). A limited example would look like this:

project(my_project)
find_package(pico-sdk REQUIRED)
add_executable(hello_world src/hello.cpp)
target_include_directories(hello_world include)
target_link_libraries(hello_world pico_sdk::pico_stdlib)

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.cmake before the project(...) call allows users to write their own FindPicoSdk.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:

  1. During the pico-sdk build, create and install(...) a CMake export set and a package configuration file (version files optional but good too).
  2. Provide new installation instructions for adding pico-sdk via CMake config mode, such as cloning to the local administrator path (/usr/local/) or elsewhere (e.g., /opt or ~/.local/); or ship a system package pico-sdk-dev that 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.

@kilograham kilograham added this to the 2.0 milestone Dec 14, 2023
@kilograham
Copy link
Contributor

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

@asasine
Copy link
Author

asasine commented Dec 15, 2023

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).

@kilograham
Copy link
Contributor

A few random thoughts about how things could work better.

  1. we need to set some stuff up before the PROJECT statement (otherwise the user would have to specify a bunch of command line flags to infer stuff we do before setting up the compiler)
  2. Is there any mechanism for the "found" package to perform initialization when it is included via "find-package"... or is that all in the Findpico-sdk.cmake which would be less helpful)

@kilograham kilograham self-assigned this May 19, 2024
@asasine
Copy link
Author

asasine commented May 19, 2024

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 where find_package(...) is called before project(...) and I'm curious what sort of flags and things need to be inferred before setting up the compiler and before the project(...) 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 own pico-sdk-config.cmake file, which can contain any initialization necessary for the package, install it to the [relocatable] lib/cmake/pico-sdk directory, and find_package(pico-sdk) will search for pico-sdk-config.cmake within several predefined locations on the user's filesystem and invoke whatever is in that pico-sdk-config.cmake file. 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.

@kilograham
Copy link
Contributor

I'm curious what sort of flags and things need to be inferred before setting up the compiler and before the project(...) call?

Most (non-capatably?) we do select (default) the toolchain file based on the PICO_PLATFORM and or PICO_BOARD variable... we then do a bunch of other configuration (including the toolchain) but that is maybe fine.

@asasine
Copy link
Author

asasine commented May 20, 2024

I think it's typical to specify toolchain files when invoking the cmake executable with --toolchain path/to/toolchain.cmake or -DCMAKE_TOOLCHAIN_FILE=path/to/toolchain.cmake.

@lurch
Copy link
Contributor

lurch commented May 20, 2024

I think it's typical to specify toolchain files when invoking the cmake executable with --toolchain path/to/toolchain.cmake or -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 to cmake --toolchain path/to/toolchain.cmake .. ? (which is obviously somewhat less user-friendly)

@asasine
Copy link
Author

asasine commented May 22, 2024

Or setting the CMAKE_TOOLCHAIN_FILE environment variable once and running CMAKE_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 be cmake ..

@kilograham kilograham modified the milestones: 2.0, 2.0.0, 2.1.0 Aug 8, 2024
@kilograham kilograham assigned will-v-pi and unassigned kilograham Aug 9, 2024
@will-v-pi
Copy link

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_package call after the project). I'll have a go and open up a PR

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants