CMP0116 — CMake 3.25.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. Unlike most policies, CMake version 3.25.2 does not warn by default when this policy is not set (unless `DEPFILE` is used in a subdirectory) and simply uses `OLD` behavior. See documentation of the `CMAKE_POLICY_WARNING_CMP0116` variable to control the warning.