CMake changelog for older versions
CMake 3.26 adds CMake environment variable CTEST_NO_TESTS_ACTION that is good for CI to avoid missing unwanted no test detection. Helpful for debugging is the elimination of CMakeOutput.log and CMakeError.log, replaced by CMakeConfigureLog.yaml. message(CONFIGURE_LOG) allows easy logging to CMakeConfigureLog.yaml.
CMake 3.25 adds workflow presets, making configure-build-test a single command.
CMake
3.24
adds the long-awaited cmake -Bbuild --fresh
option to clean the build directory first.
The LINK_GROUP
generator expression is excellent for resolving complex link dependencies.
The
CMAKE_COMPILE_WARNING_AS_ERROR
boolean option sets most compilers to error if a compile warning occurs, which is generally a good setting for CI systems.
CMAKE_COLOR_DIAGNOSTICS
environment variable is useful to colorize build system and compiler output.
CMake 3.23 further enhances –debug-find to allow debugging all find_* command, or specific find_package or find_* variables. Header files can be more cleanly installed/affiliated with targets, particularly relevant for packaging and installing with target_sources file sets.
CMake 3.22 adds several CMake Environment Variables that are generally useful. CMAKE_BUILD_TYPE default for single configuration build systems. CMAKE_CONFIGURATION_TYPES defaults available configurations for multi-config build systems like Ninja Multi-Config. CMAKE_INSTALL_MODE makes symlinks with copy fallback a good choice for installing programs from CMake. For CTest, the new ENVIRONMENT_MODIFICATION test property makes modifying environment variables for test(s) much easier.
CMake
3.21
adds more preset features, including making “generator” optional–the default CMake behavior will be used to determine generator.
cmake –install-prefix
can be used instead of cmake -DCMAKE_INSTALL_PREFIX=
.
PROJECT_IS_TOP_LEVEL
and <PROJECT-NAME>_IS_TOP_LEVEL
identify if a project is at the top of the project hierarchy.
ctest --output-junit
gives test output in standard tooling format.
CMake
3.20
adds support for Intel LLVM compiler and NVIDIA HPC compiler.
ExternalProject_Add() learned CONFIGURE_HANDLED_BY_BUILD
which avoids CMake commanding a reconfigure on each build.
try_compile(... WORKING_DIRECTORY)
parameter was added.
CMake presets in CMakePresets.json now covers configure, build and test, allowing many parameters to be declared with inheritance in JSON.
CMake presets are a key feature for CI, as well as user configurations.
ctest --test-dir build
option avoids the need to manually cd build
.
cmake_path
allows path manipulation and introspection without actually touching the filesystem.
CMake 3.19 added support for ISPC language. string(JSON GET|SET) parsing is very useful to avoid hard-coding parameters. FindPython/find_package accepts version ranges. Intel oneAPI works with CMake ≥ 3.19.6. Emits warning for cmake_minimum_required(VERSION) < 2.8.12. CMakePresets.json enables configure parameter declarations in JSON.
CMake
3.18
adds CMake
profiler
Adds REQUIRED parameter to find_*().
Adds file(ARCHIVE_CREATE) and
file(ARCHIVE_EXTRACT),
which is much more convenient than execute_process(COMMAND ${CMAKE_COMMAND} -E tar ${archive} WORKING_DIRECTORY ${out_dir})
syntax
CMake 3.17 adds Ninja Multi-Config generator. cmake –debug-find shows what find_*() is doing. Eliminates Windows “sh.exe is on PATH” error. Recognizes that Ninja works with Fortran.
CMake 3.16 adds precompiled headers, unity builds, many advanced project features.
CMake
3.15
adds CMAKE_GENERATOR
environment variable that works like global -G
option.
Enhances Python interpreter finding.
Adds cmake --install
command instead of “cmake –build build –target install”.
Added
Zstd compression.
CMake 3.14
adds check_fortran_source_runs()
.
FetchContent
was enhanced with simpler syntax.
The transitive link resolution was considerably enhanced in CMake 3.14.
Projects just work in CMake ≥ 3.14 that fail at link-time with CMake < 3.14.
We don’t recommend use of the older CMake versions below as they take significantly more effort to support.
CMake
3.13
adds ctest --progress
and better Matlab compiler support.
Lots of new linking options are added, fixes to Fortran submodule
bugs.
The very convenient cmake -B build
incantation, target_sources() with absolute path are also added.
It’s significantly more difficult to use CMake older than 3.13 with medium to large projects.
CMake
3.12
adds transitive library specification (out of same directory) and full Fortran Submodule support.
get_property(_test_names DIRECTORY . TESTS)
retrieves test names in current directory.
CMake 3.11 allows specify targets initially w/o sources. FetchContent is added, allowing fast hierarchies of CMake and non-CMake projects.