# CMP0023

Warning

The `OLD` behavior of this policy was removed in CMake version 4.0. This policy must be set to `NEW` by a call to `cmake_minimum_required()` or `cmake_policy()`.

Plain and keyword `target_link_libraries()` signatures cannot be mixed.

CMake 2.8.12 introduced the `target_link_libraries()` signature using the `PUBLIC`, `PRIVATE`, and `INTERFACE` keywords to generalize the `LINK_PUBLIC` and `LINK_PRIVATE` keywords introduced in CMake 2.8.7. Use of signatures with any of these keywords sets the link interface of a target explicitly, even if empty. This produces confusing behavior when used in combination with the historical behavior of the plain `target_link_libraries()` signature. For example, consider the code:

    target_link_libraries(mylib A)
    target_link_libraries(mylib PRIVATE B)

After the first line the link interface has not been set explicitly so CMake would use the link implementation, A, as the link interface. However, the second line sets the link interface to empty. In order to avoid this subtle behavior CMake now prefers to disallow mixing the plain and keyword signatures of `target_link_libraries()` for a single target.

The `OLD` behavior for this policy is to allow keyword and plain `target_link_libraries()` signatures to be mixed. The `NEW` behavior for this policy is to not to allow mixing of the keyword and plain signatures.

This policy was introduced in CMake version 2.8.12. Prior to removal in CMake version 4.0, it could be set by `cmake_policy()` or `cmake_minimum_required()`. If it was not set, CMake warned, and used `OLD` behavior.