CMake Packaging Guidelines

This document provides best practices for the usage of the CMake build system in Fedora packages.

Build Dependencies

You MUST add following BuildRequires:

BuildRequires: cmake

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 %cmake_kf5 that defines multiple KDE-related variables (shipped in kf5 package).

It is rarely necessary (but permissible) to use or alter these:

%__cmake

The path to the cmake executable.

%__ctest

The path to the ctest executable.

%__cmake_in_source_build

Controls whether builds are done in-source (when defined) or out-of-source (when undefined). See the Defining source and build directories for more information.

Example usage in the spec file

%build
%cmake
%cmake_build

%install
%cmake_install

%check
%ctest

Notes

Since Fedora 33, %__cmake_in_source_build is not defined so if you want to have consistent behavior across different releases, make sure to %define or %undefine it accordingly.

NOTE: -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.

NOTE: CMake has good documentation in two places: