CMake: Parent directory and trailing slashes

The task is to get the parent directory of a given directory where the given directory is already known to be a directory.

An example where the input directory is already known to be a directory (and not a file) is a target include directory (properties INCLUDE_DIRECTORIES and INTERFACE_INCLUDE_DIRECTORIES).

With CMake prior to version 3.20 there is the get_filename_component function:

get_filename_component(filename_component "${directory}" DIRECTORY)

With CMake >= 3.20 get_filename_component is deprecated in favor of cmake_path. A naive way would be to directly call this function:

cmake_path(GET directory PARENT_PATH cmake_path_naive)

But there is a glitch with cmake_path when directory already contains a trailing slash (“/”).

Continue reading “CMake: Parent directory and trailing slashes”

Fun with CMake version ranges

Since release 3.19 CMake allows to specify a range in find_package() calls:

find_package(Dummy minVersion...maxVersion)

Although currently not much find modules support version ranges one might want to set the upper end to a maximum version the code is compatible with. This can be seen as a safeguard against breaking changes in an unknown future major version.

Let say we have a package “Dummy” whose major versions 1 and 2 are known to work with our own code. One might be tempted to specify the version range like the following:

find_package(Dummy 1...2)

This works well with 1.0.0, 1.5.0 or 2.0.0, but will break with 2.0.1 or 2.1.0.

Instead use the following syntax to include major versions 1 and 2:

find_package(Dummy 1...<3)

But why so?

Continue reading “Fun with CMake version ranges”