Collection of modern CMake find modules.
- Find modules are based on CMake 3.x targets (no CMake 2.x global variables)
find_package_handle_standard_args
used to check for all required variables (including version variable)- Uses
pkg-config
by default to discover system-wide libraries - Sets
VERSION
target property according to meta data provided bypkg-config
or a known header file - Sets
INTERFACE_COMPILE_OPTIONS
target property according toCFLAGS
provided bypkg-config
- Attempts to find a corresponding
dll
dynamic library for a discoveredlib
import library (Windows only)- The import library will be retained via the
Libx264_IMPLIB
target property - The DLL will be retained via the
IMPORTED_LOCATION
target property - Target
TYPE
will beSTATIC
if just an import library exists, orSHARED
otherwise
- The import library will be retained via the
- Attempts to set the
IMPORTED_SONAME
target property (macOS and Linux only) - Sets description text and URL for use with the
FeatureSummary
module
Copy desired find modules into a directory in a CMake project (e.g. cmake
), then add this directory to existing CMAKE_MODULE_PATH
:
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
Appending ensures that any pre-existing module paths are retained, also path variables should be contained in double quotes to avoid unintended list tokenisation due to space characters.
Note: CMake will iterate through all existing module paths in order, with the earliest discovered find module "winning". If you need to ensure your own find modules take precedence, create a new list prepending your own module path to the existing one, then overwrite the variable with this new list.
This repository is open for contributions: To add CMake find modules, use one of the existing modules as a template and adjust appropriately.
- Every finder must be formatted using
cmake-format
(the included cmake-format file will ensure compliance) - Every finder must be linted using
cmake-lint
,C0103
andC0301
are acceptable to be disabled - Every finder must have a full doc header including a license note
- File names for find modules are case-sensitive: To use
find_package(MyLib)
the find module must be namedFindMyLib.cmake
- Variables used within the finder are case-sensitive as well, i.e. use
MyLib_FOUND
,MyLib_VERSION
, etc. - Target name should match package name, i.e.
MyLib::MyLib
. For modules with multiple components use the package name as the namespace, i.e.MyLib::MyComponent
- Unset helper variables at the end of the find modules
- A version variable must be set (if no proper semver can be found, set it to
0.0.0
with an accompanying warning) - If a package is only available for a specific operating system, OS-specific features can be omitted (e.g. searching for a DLL as part of a finder for a Linux-only library)
- Try to use the shortest possible description text for
FeatureSummary
, usually the first sentence of the official distribution's description or subtitle will suffice
Reasonable exceptions to these critera are possible - as an example: If a library is part of a wider known software package, it makes sense to use that package as the namespace (e.g. VLC::LibVLC
).