New in version 3.27.

ExternalProject_Add() and FetchContent_Declare() commands treat relative GIT_REPOSITORY paths as being relative to the parent project's remote.

Earlier versions of these commands always treated relative paths in GIT_REPOSITORY as local paths, but the base directory it was treated as relative to was both undocumented and unintuitive. The OLD behavior for this policy is to interpret relative paths used for GIT_REPOSITORY as local paths relative to the following:

The NEW behavior is to determine the remote from the parent project and interpret the path relative to that remote. The value of CMAKE_CURRENT_SOURCE_DIR when ExternalProject_Add() or FetchContent_Declare() is called determines the parent project. The remote is selected according to the following (the first match is used):

  • If the parent project is checked out on a branch with an upstream remote defined, use that remote.

  • If only one remote is defined, use that remote.

  • If multiple remotes are defined and one of them is named origin, use origin's remote but also issue a warning.

If an appropriate remote cannot be determined from the above, a fatal error will be raised.

This policy was introduced in CMake version 3.27. It may be set by cmake_policy() or cmake_minimum_required(). If it is not set, CMake warns when a relative path is encountered, and uses OLD behavior.


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