CMake Packaging Guidelines
This document provides best practices for the usage of the CMake build system in Fedora packages.
Available Macros
You will generally make use of these in your specs:
%cmake
-
Defines CFLAGS, LDFLAGS, etc. and calls
%__cmake
with appropriate parameters (-DCMAKE_INSTALL_PREFIX:PATH=/usr
and such). You can pass-Doption=value
to this macro in order to set options for the buildsystem. %cmake_build
-
Builds the project (using
%__cmake --build
). %cmake_install
-
Installs the built project (using
%__cmake --install
). %ctest
-
Runs the tests that are defined with
add_test()
in project (using%__ctest
).
When packaging KDE software, you most likely would replace %cmake
with either %cmake_kf5
or %cmake_kf6
. For more information, see KDE Packaging Guidelines.
It is rarely necessary (but permissible) to use or alter these:
All macros starting with double underscore is meant to be private, NOT stable and likely to be removed in the future. |
%__cmake
-
The path to the cmake executable.
%__ctest
-
The path to the ctest executable.
%__cmake_in_source_build
-
Controls whether builds are done out-of-source (when undefined, the default) or in-source (when defined). Whenever possible, using out-of-source builds is advised, as this is the direction both Fedora and CMake upstream are moving.
%__cmake_builddir
-
Holds the location of the actual directory where the build was made. When making out-of-source builds, this macro is the same as %_vpath_builddir. When doing in-source builds, this macro will hold the actual location that was used for the build.
This macro is suitable only for rare compatibility reasons. For normal out-of-source builds, this macro is the same as %_vpath_builddir
. It may be removed in the future.
Notes
-DCMAKE_SKIP_RPATH:BOOL=ON
. With recent cmake-2.4, it should not be used. This CMake version should handle RPATHs issues correctly (set them in build-dir, remove them during installation). Setting CMAKE_SKIP_RPATH
for this version would avoid RPATHs in build-dir too. This might link binaries against system-libraries (e.g. when a previous version of the package was installed) instead of the libraries which were created by the build.
Nevertheless, RPATH issues might arise when CMake was used improperly. For example, installing a target with INSTALL(FILES ... RENAME ...)
will not strip rpaths; in this case INSTALL(TARGETS ...)
must be used in combination with changing the OUTPUT_NAME
property.
CMake has good documentation in two places:
Want to help? Learn how to contribute to Fedora Docs ›