How to install your custom CMake-Find module

76,315

Solution 1

You can set CMAKE_MODULE_PATH and distribute your custom FindFoo.cmake with your project. For example:

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")

Solution 2

The CMake module directory is part of the install tree of CMake itself, and as such you shouldn't be trying to add anything there.

The CMake module directory contains modules which have been written or at least reviewed by Kitware, and adding your own there would give the impression to users of your project that this was the case for your project also.

You'd be better to just install FindMyLib.cmake to one of the places searched by find_package:

<prefix>/                                               (Windows)
<prefix>/(cmake|CMake)/                                 (Windows)
<prefix>/<name>*/                                       (Windows)
<prefix>/<name>*/(cmake|CMake)/                         (Windows)
<prefix>/(lib/<arch>|lib|share)/cmake/<name>*/          (Unix)
<prefix>/(lib/<arch>|lib|share)/<name>*/                (Unix)
<prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/  (Unix)
<prefix>/<name>.framework/Resources/                    (Apple)
<prefix>/<name>.framework/Resources/CMake/              (Apple)
<prefix>/<name>.framework/Versions/*/Resources/         (Apple)
<prefix>/<name>.framework/Versions/*/Resources/CMake/   (Apple)
<prefix>/<name>.app/Contents/Resources/                 (Apple)
<prefix>/<name>.app/Contents/Resources/CMake/           (Apple)


See the documentation for find_package for the full details of how find_package searches. Also the CMake packaging tutorial is useful in this case.

Solution 3

The best way to allow

future developers can simply specify FIND_PACKAGE(MyLib) to use my library

is to write a package config file (-config.cmake) , not a Find module. The package config file should then be installed in one of the folders where the FindPackage module looks for (something like /lib/package/ or /lib/cmake/package the second being preferred)

The FindPackage module will automatically load the config file if it can find it there.

The CMake wiki has more detailed instructions at https://gitlab.kitware.com/cmake/community/wikis/doc/tutorials/Packaging

Share:
76,315
goocreations
Author by

goocreations

Updated on July 05, 2022

Comments

  • goocreations
    goocreations almost 2 years

    I configure and package my library using CMake and CPack. I have written my own find-module: FindMyLib.cmake.

    How do I tell CMake/CPack to add this file to the CMake module directory, so that future developers can simply specify FIND_PACKAGE(MyLib) to use my library?

  • jackyalcine
    jackyalcine almost 11 years
    You should mark this as the right answer @goocreations. Also, this is too nifty of a solution.
  • Vincenzo Pii
    Vincenzo Pii about 10 years
    This is also the approach suggested here: cmake.org/Wiki/…
  • Alexis Wilke
    Alexis Wilke almost 9 years
    That's not an answer to the question. The idea is not how users of MyLib could include his FindMyLib.cmake, but how to install it so end users could make use of it as is. What you are describing requires users of MyLib to copy the .cmake file under their own development directory tree...
  • Joey Dumont
    Joey Dumont over 8 years
    This did not work for me (using cmake 3.3.1). According to the docs, " CMake searches for a file called Find<package>.cmake in the CMAKE_MODULE_PATH followed by the CMake installation". However, I can't seem to find what that is. It searches the paths you listed above for Package Configurations files, not CMake-Find modules.
  • nn0p
    nn0p over 7 years
    How is the value of <prefix> determined by CMake?
  • Fraser
    Fraser over 7 years
  • einpoklum
    einpoklum over 7 years
    Is there some special reason for the capital M in Modules?
  • veio
    veio almost 4 years
    I think these paths only work for the <name>Config.cmake files, not for find<name>.cmake