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

Two way compatibility between MODULE and CONFIG detection #93

Open
MathiasMagnus opened this issue Nov 29, 2023 · 0 comments
Open

Two way compatibility between MODULE and CONFIG detection #93

MathiasMagnus opened this issue Nov 29, 2023 · 0 comments

Comments

@MathiasMagnus
Copy link
Collaborator

Ever since this SDK has cleared up some of the long-standing issues around the underdefinition of some SDK components (primarily the C++ headers) while also adding new functionality, two new CMake-related issues arose:

  • People wanting to use the new features introduced in the SDK's Package Config have to explicitly opt-in via an all-or-nothing variable, CMAKE_FIND_PACKAGE_PREFER_CONFIG because CMake chose its default behavior in the name of compatibility, and the Find Module shipping with CMake always takes precedence.
  • People finding the SDK via Package Config may still want to use the legacy variables defined by the Find Module. OpenCL_INCLUDE_DIRS and OpenCL_LIBRARIES are not set. #85

The solution to these two problems lay in two different repos.

  • The imported targets introduced by the SDK also need to be exposed by CMake's Find Module: FindOpenCL.cmake
  • The SDK's Package Config needs to expose the same legacy variables which the canonical Find Module sets.

Proposed solution

The number of sensible ways to consume an OpenCL SDK explode almost combinatorically; almost because some combination of builds are not possible, or simply way too complicated to make it worthwhile supporting. The repository Test-FindOpenCL aims on exploring this phase space.

The repo tests Windows/Linux/MacOS with a myriad combinations of building and consuming all the different components. Sample projects are oblivious to the means of how each SDK component is supplied: provided from separate builds of each or in a unified fashion from an SDK build.

Some notable absentees from the matrix:

  • Consuming the utility libraries using variables is not possible, as they are shipped as both debug and release binaries (especially important for the UtilsCpp.lib where the ABI changes. While adding the XYZ_DEBUG set of variables is possible, it makes matters particularly complicated when an SDK only ships one of them. If a project builds/installs all the components in Release, is that considered a complete installation? Should the Find Module reject such an install even if consumers are never interested in the Debug libraries?
  • Windows builds have extra dependencies when the ICD Loader is built as a static lib. Those extra deps manifest as $<LINK_ONLY:xyz.lib> entries in INTERFACE_LINK_LIBRARIES, but augmenting the Find Module to try_compile a sample program and see if those deps (which may change in the future) are required is brittle and doesn't scale.
  • Consuming the C++ headers via variables, as this was specifically one of the blind spots of the existing Find Module.

Notes

The proposed changes require a few changes not yet upstreamed, but hoping to land each and every one. The set of required changes can be found here:

  • Upstream CMake changes required are in this branch.
  • OpenCL-SDK changes can be found here.
  • The changes needed for each of the SDK components are also inside working branches signified by the options supplied to Test-FindOpenCL here, most importantly
    • on Windows a fix for static builds of the ICD loader
    • on MacOS a fix for avoiding the inclusion of the system OpenCL framework headers, because they aren't compatible with opencl.hpp anymore.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant