CMP0116 — CMake 4.1.2 Documentation

# CMP0116

New in version 3.20.

Ninja generators transform `DEPFILE` s from `add_custom_command()`.

In CMake 3.19 and below, files given to the `DEPFILE` argument of `add_custom_command()` were passed directly to Ninja's `depfile` variable without any path resolution. This meant that if `add_custom_command()` was called from a subdirectory (created by `add_subdirectory()`), the `DEPFILE` argument would have to be either an absolute path or a path relative to `CMAKE_BINARY_DIR`, rather than `CMAKE_CURRENT_BINARY_DIR`. In addition, no transformation was done on the file listed in `DEPFILE`, which meant that the paths within the `DEPFILE` had the same restrictions.

Starting with CMake 3.20, the `DEPFILE` argument is relative to `CMAKE_CURRENT_BINARY_DIR` (unless it is absolute), and the paths in the `DEPFILE` are also relative to `CMAKE_CURRENT_BINARY_DIR`. CMake automatically transforms the paths in the `DEPFILE` (unless they are absolute) after the custom command is run. The file listed in `DEPFILE` is not modified in any way. Instead, CMake writes the transformation to its own internal file, and passes this internal file to Ninja's `depfile` variable. This transformation happens regardless of whether or not `DEPFILE` is relative, and regardless of whether or not `add_custom_command()` is called from a subdirectory.

The `OLD` behavior for this policy is to pass the `DEPFILE` to Ninja unaltered. The `NEW` behavior for this policy is to transform the `DEPFILE` after running the custom command. The status of `CMP0116` is recorded at the time of the custom command's creation, and you can have custom commands in the same directory with different values for `CMP0116` by setting the policy before each custom command.

This policy was introduced in CMake version 3.20. It may be set by `cmake_policy()` or `cmake_minimum_required()`. If it is not set, CMake does not warn by default (unless `DEPFILE` is used in a subdirectory), and uses `OLD` behavior.

See documentation of the `CMAKE_POLICY_WARNING_CMP0116` variable to control the warning.

Note

The `OLD` behavior of a policy is `deprecated by definition` and may be removed in a future version of CMake.