From 2b07afa1a190079f588a2ac4477ff097ee4926ee Mon Sep 17 00:00:00 2001 From: 15daksh-2003 Date: Sun, 6 Sep 2026 19:23:28 +0530 Subject: [PATCH] ExternalProject: Default CMAKE_INSTALL_PREFIX to INSTALL_DIR The default CMake configure command never set an install prefix, so external projects installed to /usr/local rather than the INSTALL_DIR the module already reserves. Add policy CMP0225 to pass it by default; an explicit prefix from the caller still takes precedence. Fixes: #27050 --- Help/manual/cmake-policies.7.rst | 1 + Help/policy/CMP0225.rst | 52 +++++++++++++++++++ .../dev/externalproject-install-prefix.rst | 9 ++++ Modules/ExternalProject.cmake | 38 ++++++++++++-- Source/cmPolicies.h | 4 ++ Tests/RunCMake/CMP0135/CMakeLists.txt | 1 + Tests/RunCMake/CMP0150/CMakeLists.txt.in | 1 + Tests/RunCMake/CMakeLists.txt | 1 + .../CMP0225-Effective-Args-build-check.cmake | 11 ++++ .../CMP0225-Effective-Args.cmake | 12 +++++ .../CMP0225-Effective-Flag-build-check.cmake | 11 ++++ .../CMP0225-Effective-Flag.cmake | 12 +++++ .../CMP0225-Effective-NEW-build-check.cmake | 11 ++++ .../CMP0225-Effective-NEW.cmake | 11 ++++ .../CMP0225-NEW-check.cmake | 5 ++ .../CMP0225-NEW-custom-check.cmake | 5 ++ .../CMP0225-NEW-custom.cmake | 8 +++ .../CMP0225-NEW-empty-check.cmake | 5 ++ .../CMP0225-NEW-empty.cmake | 8 +++ .../ExternalProject-CMP0225/CMP0225-NEW.cmake | 7 +++ .../CMP0225-OLD-check.cmake | 5 ++ .../ExternalProject-CMP0225/CMP0225-OLD.cmake | 7 +++ .../CMP0225-WARN-check.cmake | 5 ++ .../CMP0225-WARN-empty-check.cmake | 5 ++ .../CMP0225-WARN-empty.cmake | 7 +++ .../CMP0225-WARN-prefix-check.cmake | 5 ++ .../CMP0225-WARN-prefix.cmake | 7 +++ .../CMP0225-WARN-stderr.txt | 10 ++++ .../CMP0225-WARN.cmake | 6 +++ .../ExternalProject-CMP0225/CMakeLists.txt | 3 ++ .../RunCMakeTest.cmake | 22 ++++++++ .../Sub/CMakeLists.txt | 2 + .../Add_StepDependencies.cmake | 1 + .../Add_StepDependencies_no_target.cmake | 1 + Tests/RunCMake/ExternalProject/CMakeLists.txt | 1 + 35 files changed, 296 insertions(+), 4 deletions(-) create mode 100644 Help/policy/CMP0225.rst create mode 100644 Help/release/dev/externalproject-install-prefix.rst create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-Effective-Args-build-check.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-Effective-Args.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-Effective-Flag-build-check.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-Effective-Flag.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-Effective-NEW-build-check.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-Effective-NEW.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW-check.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW-custom-check.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW-custom.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW-empty-check.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW-empty.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-OLD-check.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-OLD.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-check.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-empty-check.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-empty.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-prefix-check.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-prefix.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-stderr.txt create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/CMakeLists.txt create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/RunCMakeTest.cmake create mode 100644 Tests/RunCMake/ExternalProject-CMP0225/Sub/CMakeLists.txt diff --git a/Help/manual/cmake-policies.7.rst b/Help/manual/cmake-policies.7.rst index 9be50d662e..ddae391d7b 100644 --- a/Help/manual/cmake-policies.7.rst +++ b/Help/manual/cmake-policies.7.rst @@ -100,6 +100,7 @@ Policies Introduced by CMake 4.5 .. toctree:: :maxdepth: 1 + CMP0225: ExternalProject sets CMAKE_INSTALL_PREFIX to in the default configure command. CMP0224: Test fixtures use AROUND_EACH_REPEAT mode by default with ctest --repeat. CMP0223: An empty path is not a prefix of any path. CMP0222: The if() command supports path prefix tests using PATH_IS_PREFIX operator. diff --git a/Help/policy/CMP0225.rst b/Help/policy/CMP0225.rst new file mode 100644 index 0000000000..8a02641a8a --- /dev/null +++ b/Help/policy/CMP0225.rst @@ -0,0 +1,52 @@ +CMP0225 +------- + +.. versionadded:: 4.5 + +:command:`ExternalProject_Add` sets :variable:`CMAKE_INSTALL_PREFIX` to +```` in the default configure command. + +When no ``CONFIGURE_COMMAND`` is given, :command:`ExternalProject_Add` drives +the external project as a CMake project with a default configure command. +CMake 4.4 and below do not pass :variable:`CMAKE_INSTALL_PREFIX` in that +command, so the external project's install step uses CMake's built-in default +prefix, such as ``/usr/local`` on Unix or ``C:/Program Files`` on Windows, +rather than the ``INSTALL_DIR`` that the module reserves for it inside the +build tree. Installing to a shared system prefix as a side effect of a build +is surprising and often fails for lack of permission. + +CMake 4.5 and above prefer to set :variable:`CMAKE_INSTALL_PREFIX` to the +external project's ``INSTALL_DIR``, so that it installs to the location the +module reserves for it. + +The ``OLD`` behavior of this policy does not set +:variable:`CMAKE_INSTALL_PREFIX` in the default configure command. The +``NEW`` behavior sets it to the external project's ``INSTALL_DIR``. + +This policy affects only the default configure command; a custom +``CONFIGURE_COMMAND``, including an empty one, is unaffected. + +A :variable:`CMAKE_INSTALL_PREFIX` given by the caller in ``CMAKE_ARGS`` (for +example, through :option:`cmake --install-prefix`) or in ``CMAKE_CACHE_ARGS`` +still takes precedence. A prefix given in ``CMAKE_CACHE_DEFAULT_ARGS`` does +not, matching that option's non-overriding-default semantics. + +Setting :variable:`CMAKE_INSTALL_PREFIX` in the external project also has +effects beyond the install location: +:variable:`CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT` is left false, and the +prefix is prepended to :variable:`CMAKE_SYSTEM_PREFIX_PATH`, which can change +``find_*()`` results. These effects apply even when the install step is +disabled with ``INSTALL_COMMAND ""``. + +Adopting the ``NEW`` behavior in an existing build tree reconfigures the +external project and overwrites its cached :variable:`CMAKE_INSTALL_PREFIX`; +returning to the ``OLD`` behavior does not restore the previous cached value. +As with the other directory placeholders, changing ``INSTALL_DIR`` later may +not reconfigure the external project with every generator, so its build tree +may need to be cleaned for the cached prefix to update. + +.. |INTRODUCED_IN_CMAKE_VERSION| replace:: 4.5 +.. |WARNS_OR_DOES_NOT_WARN| replace:: warns +.. include:: include/STANDARD_ADVICE.rst + +.. include:: include/DEPRECATED.rst diff --git a/Help/release/dev/externalproject-install-prefix.rst b/Help/release/dev/externalproject-install-prefix.rst new file mode 100644 index 0000000000..f72ac657b4 --- /dev/null +++ b/Help/release/dev/externalproject-install-prefix.rst @@ -0,0 +1,9 @@ +externalproject-install-prefix +------------------------------ + +* The :command:`ExternalProject_Add` command now sets + :variable:`CMAKE_INSTALL_PREFIX` to the external project's ``INSTALL_DIR`` in + its default configure command, so a CMake external project installs into the + prefix the module reserves for it rather than the built-in default (e.g. + ``/usr/local``). A caller-supplied prefix still takes precedence. See policy + :policy:`CMP0225`. diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake index c02fdbee08..d411e16245 100644 --- a/Modules/ExternalProject.cmake +++ b/Modules/ExternalProject.cmake @@ -96,9 +96,14 @@ external project. ``INSTALL_DIR `` Installation prefix to be placed in the ```` placeholder. - This does not actually configure the external project to install to - the given prefix. That must be done by passing appropriate arguments - to the external project configuration step, e.g. using ````. + + When the default configure command is used (i.e. no ``CONFIGURE_COMMAND`` + is given) and policy :policy:`CMP0225` is ``NEW``, the external project's + :variable:`CMAKE_INSTALL_PREFIX` defaults to ````. Otherwise, + or for a custom configure command, setting ``INSTALL_DIR`` does not by itself + configure the external project to install to the given prefix; that must be + done by passing appropriate arguments to the external project configuration + step, e.g. using ````. If any of the above ``..._DIR`` options are not specified, their defaults are computed as follows. If the ``PREFIX`` option is given or the @@ -586,6 +591,10 @@ overridden if required. reuse from the main project or otherwise specify (see ``CMAKE_ARGS``, ``CMAKE_CACHE_ARGS`` and ``CMAKE_CACHE_DEFAULT_ARGS`` below). + When policy :policy:`CMP0225` is set to ``NEW``, the default configure + command also sets :variable:`CMAKE_INSTALL_PREFIX` to ````, + unless the caller specifies a prefix of their own. + For non-CMake external projects, the ``CONFIGURE_COMMAND`` option must be used to override the default configure command (:manual:`generator expressions ` are @@ -2656,7 +2665,6 @@ function(_ep_extract_configure_command var name) TARGET ${name} PROPERTY _EP_CMAKE_ARGS ) - list(APPEND cmd ${cmake_args}) # If there are any CMAKE_CACHE_ARGS or CMAKE_CACHE_DEFAULT_ARGS, # write an initial cache and use it @@ -2669,6 +2677,25 @@ function(_ep_extract_configure_command var name) PROPERTY _EP_CMAKE_CACHE_DEFAULT_ARGS ) + # Inject the prefix ahead of the caller's arguments so an + # explicit CMAKE_INSTALL_PREFIX still wins. See policy CMP0225. + if(_EP_CMP0225 STREQUAL "NEW") + list(APPEND cmd "-DCMAKE_INSTALL_PREFIX:PATH=") + elseif(_EP_CMP0225 STREQUAL "" + AND NOT "${cmake_args};${cmake_cache_args};${cmake_cache_default_args}" + MATCHES "CMAKE_INSTALL_PREFIX|install-prefix") + cmake_policy(GET_WARNING CMP0225 _ep_cmp0225_warning) + message(AUTHOR_WARNING + "${_ep_cmp0225_warning}\n" + "ExternalProject_Add(${name}) uses the default configure command " + "without a CMAKE_INSTALL_PREFIX. The OLD behavior leaves the external " + "project's install prefix at the CMake default; the NEW behavior sets " + "it to ." + ) + endif() + + list(APPEND cmd ${cmake_args}) + set(has_cmake_cache_args 0) if(NOT "${cmake_cache_args}" STREQUAL "") set(has_cmake_cache_args 1) @@ -3182,6 +3209,9 @@ function(ExternalProject_Add name) cmake_policy(GET CMP0135 _EP_CMP0135 PARENT_SCOPE # undocumented, do not use outside of CMake ) + cmake_policy(GET CMP0225 _EP_CMP0225 + PARENT_SCOPE # undocumented, do not use outside of CMake + ) _ep_get_configuration_subdir_genex(cfgdir) diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h index 97979d9d68..df248174a4 100644 --- a/Source/cmPolicies.h +++ b/Source/cmPolicies.h @@ -676,6 +676,10 @@ class cmMakefile; SELECT(POLICY, CMP0224, \ "Test fixtures use AROUND_EACH_REPEAT mode by default with " \ "ctest --repeat.", \ + 4, 5, 0, WARN) \ + SELECT(POLICY, CMP0225, \ + "ExternalProject sets CMAKE_INSTALL_PREFIX to in the " \ + "default configure command.", \ 4, 5, 0, WARN) #define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1) diff --git a/Tests/RunCMake/CMP0135/CMakeLists.txt b/Tests/RunCMake/CMP0135/CMakeLists.txt index 5ff8d3e0ff..4bdb771e89 100644 --- a/Tests/RunCMake/CMP0135/CMakeLists.txt +++ b/Tests/RunCMake/CMP0135/CMakeLists.txt @@ -1,3 +1,4 @@ cmake_minimum_required(VERSION 3.23) project(${RunCMake_TEST} NONE) +cmake_policy(SET CMP0225 NEW) include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/CMP0150/CMakeLists.txt.in b/Tests/RunCMake/CMP0150/CMakeLists.txt.in index db6cfc76e0..f6fe339f96 100644 --- a/Tests/RunCMake/CMP0150/CMakeLists.txt.in +++ b/Tests/RunCMake/CMP0150/CMakeLists.txt.in @@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 3.25) project(@projName@ LANGUAGES NONE) @policyCommand@ +cmake_policy(SET CMP0225 NEW) include(ExternalProject) ExternalProject_Add(ep-@depName@ diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index a172849c6b..b8683d8a48 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -1251,6 +1251,7 @@ add_RunCMake_test(ExternalProject -DDETECT_JOBSERVER=$") + set(RunCMake_TEST_FAILED + "Default configure command did not inject prefix:\n${cfgcmd}") +endif() diff --git a/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW-custom-check.cmake b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW-custom-check.cmake new file mode 100644 index 0000000000..550672d708 --- /dev/null +++ b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW-custom-check.cmake @@ -0,0 +1,5 @@ +file(READ "${RunCMake_TEST_BINARY_DIR}/tmp/Sub-cfgcmd.txt" cfgcmd) +if(cfgcmd MATCHES "CMAKE_INSTALL_PREFIX") + set(RunCMake_TEST_FAILED + "Custom configure command should not receive a prefix:\n${cfgcmd}") +endif() diff --git a/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW-custom.cmake b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW-custom.cmake new file mode 100644 index 0000000000..8349798394 --- /dev/null +++ b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW-custom.cmake @@ -0,0 +1,8 @@ +cmake_policy(SET CMP0225 NEW) +include(ExternalProject) +ExternalProject_Add(Sub + SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/Sub" + TMP_DIR "${CMAKE_CURRENT_BINARY_DIR}/tmp" + CONFIGURE_COMMAND "${CMAKE_COMMAND}" -E echo "custom configure" + DOWNLOAD_COMMAND "" +) diff --git a/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW-empty-check.cmake b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW-empty-check.cmake new file mode 100644 index 0000000000..70e9e8fc9f --- /dev/null +++ b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW-empty-check.cmake @@ -0,0 +1,5 @@ +file(READ "${RunCMake_TEST_BINARY_DIR}/tmp/Sub-cfgcmd.txt" cfgcmd) +if(cfgcmd MATCHES "CMAKE_INSTALL_PREFIX") + set(RunCMake_TEST_FAILED + "Empty configure command should not receive a prefix:\n${cfgcmd}") +endif() diff --git a/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW-empty.cmake b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW-empty.cmake new file mode 100644 index 0000000000..9c689daa71 --- /dev/null +++ b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW-empty.cmake @@ -0,0 +1,8 @@ +cmake_policy(SET CMP0225 NEW) +include(ExternalProject) +ExternalProject_Add(Sub + SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/Sub" + TMP_DIR "${CMAKE_CURRENT_BINARY_DIR}/tmp" + CONFIGURE_COMMAND "" + DOWNLOAD_COMMAND "" +) diff --git a/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW.cmake b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW.cmake new file mode 100644 index 0000000000..920f510dc0 --- /dev/null +++ b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-NEW.cmake @@ -0,0 +1,7 @@ +cmake_policy(SET CMP0225 NEW) +include(ExternalProject) +ExternalProject_Add(Sub + SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/Sub" + TMP_DIR "${CMAKE_CURRENT_BINARY_DIR}/tmp" + DOWNLOAD_COMMAND "" +) diff --git a/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-OLD-check.cmake b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-OLD-check.cmake new file mode 100644 index 0000000000..2a9a72ebf3 --- /dev/null +++ b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-OLD-check.cmake @@ -0,0 +1,5 @@ +file(READ "${RunCMake_TEST_BINARY_DIR}/tmp/Sub-cfgcmd.txt" cfgcmd) +if(cfgcmd MATCHES "CMAKE_INSTALL_PREFIX:PATH=") + set(RunCMake_TEST_FAILED + "OLD behavior unexpectedly injected prefix:\n${cfgcmd}") +endif() diff --git a/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-OLD.cmake b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-OLD.cmake new file mode 100644 index 0000000000..7260e0e682 --- /dev/null +++ b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-OLD.cmake @@ -0,0 +1,7 @@ +cmake_policy(SET CMP0225 OLD) +include(ExternalProject) +ExternalProject_Add(Sub + SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/Sub" + TMP_DIR "${CMAKE_CURRENT_BINARY_DIR}/tmp" + DOWNLOAD_COMMAND "" +) diff --git a/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-check.cmake b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-check.cmake new file mode 100644 index 0000000000..4c9a6ea620 --- /dev/null +++ b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-check.cmake @@ -0,0 +1,5 @@ +file(READ "${RunCMake_TEST_BINARY_DIR}/tmp/Sub-cfgcmd.txt" cfgcmd) +if(cfgcmd MATCHES "CMAKE_INSTALL_PREFIX:PATH=") + set(RunCMake_TEST_FAILED + "Unset policy unexpectedly injected prefix:\n${cfgcmd}") +endif() diff --git a/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-empty-check.cmake b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-empty-check.cmake new file mode 100644 index 0000000000..70e9e8fc9f --- /dev/null +++ b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-empty-check.cmake @@ -0,0 +1,5 @@ +file(READ "${RunCMake_TEST_BINARY_DIR}/tmp/Sub-cfgcmd.txt" cfgcmd) +if(cfgcmd MATCHES "CMAKE_INSTALL_PREFIX") + set(RunCMake_TEST_FAILED + "Empty configure command should not receive a prefix:\n${cfgcmd}") +endif() diff --git a/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-empty.cmake b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-empty.cmake new file mode 100644 index 0000000000..04d6254d8b --- /dev/null +++ b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-empty.cmake @@ -0,0 +1,7 @@ +include(ExternalProject) +ExternalProject_Add(Sub + SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/Sub" + TMP_DIR "${CMAKE_CURRENT_BINARY_DIR}/tmp" + CONFIGURE_COMMAND "" + DOWNLOAD_COMMAND "" +) diff --git a/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-prefix-check.cmake b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-prefix-check.cmake new file mode 100644 index 0000000000..735c83a3ac --- /dev/null +++ b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-prefix-check.cmake @@ -0,0 +1,5 @@ +file(READ "${RunCMake_TEST_BINARY_DIR}/tmp/Sub-cfgcmd.txt" cfgcmd) +if(cfgcmd MATCHES "CMAKE_INSTALL_PREFIX:PATH=") + set(RunCMake_TEST_FAILED + "Caller prefix should not trigger injection:\n${cfgcmd}") +endif() diff --git a/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-prefix.cmake b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-prefix.cmake new file mode 100644 index 0000000000..7bdf5bc3da --- /dev/null +++ b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-prefix.cmake @@ -0,0 +1,7 @@ +include(ExternalProject) +ExternalProject_Add(Sub + SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/Sub" + TMP_DIR "${CMAKE_CURRENT_BINARY_DIR}/tmp" + CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/caller" + DOWNLOAD_COMMAND "" +) diff --git a/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-stderr.txt b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-stderr.txt new file mode 100644 index 0000000000..a338681310 --- /dev/null +++ b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN-stderr.txt @@ -0,0 +1,10 @@ +CMake Warning \(author\) at .*/Modules/ExternalProject\.cmake:[0-9]+ \(message\): + Policy CMP0225 is not set: ExternalProject sets CMAKE_INSTALL_PREFIX to + in the default configure command\. Run "cmake --help-policy + CMP0225" for policy details\. Use the cmake_policy command to set the + policy and suppress this warning\. + + ExternalProject_Add\(Sub\) uses the default configure command without a + CMAKE_INSTALL_PREFIX\. The OLD behavior leaves the external project's + install prefix at the CMake default; the NEW behavior sets it to + \. diff --git a/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN.cmake b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN.cmake new file mode 100644 index 0000000000..8a720f9bf7 --- /dev/null +++ b/Tests/RunCMake/ExternalProject-CMP0225/CMP0225-WARN.cmake @@ -0,0 +1,6 @@ +include(ExternalProject) +ExternalProject_Add(Sub + SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/Sub" + TMP_DIR "${CMAKE_CURRENT_BINARY_DIR}/tmp" + DOWNLOAD_COMMAND "" +) diff --git a/Tests/RunCMake/ExternalProject-CMP0225/CMakeLists.txt b/Tests/RunCMake/ExternalProject-CMP0225/CMakeLists.txt new file mode 100644 index 0000000000..ab1a20c7eb --- /dev/null +++ b/Tests/RunCMake/ExternalProject-CMP0225/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 3.19) +project(${RunCMake_TEST} NONE) +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/ExternalProject-CMP0225/RunCMakeTest.cmake b/Tests/RunCMake/ExternalProject-CMP0225/RunCMakeTest.cmake new file mode 100644 index 0000000000..897b83472e --- /dev/null +++ b/Tests/RunCMake/ExternalProject-CMP0225/RunCMakeTest.cmake @@ -0,0 +1,22 @@ +include(RunCMake) + +run_cmake(CMP0225-NEW) +run_cmake(CMP0225-OLD) +run_cmake(CMP0225-WARN) +run_cmake(CMP0225-WARN-prefix) +run_cmake(CMP0225-NEW-custom) +run_cmake(CMP0225-NEW-empty) +run_cmake(CMP0225-WARN-empty) + +function(run_CMP0225_effective case) + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${case}-build) + set(RunCMake_TEST_NO_CLEAN 1) + file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}") + file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}") + run_cmake(${case}) + run_cmake_command(${case}-build ${CMAKE_COMMAND} --build .) +endfunction() + +run_CMP0225_effective(CMP0225-Effective-NEW) +run_CMP0225_effective(CMP0225-Effective-Args) +run_CMP0225_effective(CMP0225-Effective-Flag) diff --git a/Tests/RunCMake/ExternalProject-CMP0225/Sub/CMakeLists.txt b/Tests/RunCMake/ExternalProject-CMP0225/Sub/CMakeLists.txt new file mode 100644 index 0000000000..4af16a6749 --- /dev/null +++ b/Tests/RunCMake/ExternalProject-CMP0225/Sub/CMakeLists.txt @@ -0,0 +1,2 @@ +cmake_minimum_required(VERSION 3.18) +project(Sub NONE) diff --git a/Tests/RunCMake/ExternalProject/Add_StepDependencies.cmake b/Tests/RunCMake/ExternalProject/Add_StepDependencies.cmake index 02c7c8e349..8efc97450a 100644 --- a/Tests/RunCMake/ExternalProject/Add_StepDependencies.cmake +++ b/Tests/RunCMake/ExternalProject/Add_StepDependencies.cmake @@ -5,6 +5,7 @@ else() cmake_policy(SET CMP0114 OLD) # Test deprecated behavior. endif() cmake_policy(SET CMP0135 NEW) +cmake_policy(SET CMP0225 NEW) include(ExternalProject) diff --git a/Tests/RunCMake/ExternalProject/Add_StepDependencies_no_target.cmake b/Tests/RunCMake/ExternalProject/Add_StepDependencies_no_target.cmake index 31b7baf196..c5890d9d2d 100644 --- a/Tests/RunCMake/ExternalProject/Add_StepDependencies_no_target.cmake +++ b/Tests/RunCMake/ExternalProject/Add_StepDependencies_no_target.cmake @@ -5,6 +5,7 @@ else() cmake_policy(SET CMP0114 OLD) # Test deprecated behavior. endif() cmake_policy(SET CMP0135 NEW) +cmake_policy(SET CMP0225 NEW) include(ExternalProject) diff --git a/Tests/RunCMake/ExternalProject/CMakeLists.txt b/Tests/RunCMake/ExternalProject/CMakeLists.txt index b94f825926..3a1123e04f 100644 --- a/Tests/RunCMake/ExternalProject/CMakeLists.txt +++ b/Tests/RunCMake/ExternalProject/CMakeLists.txt @@ -4,4 +4,5 @@ if(CMAKE_XCODE_BUILD_SYSTEM VERSION_GREATER_EQUAL 12 AND NOT RunCMake_TEST STREQ cmake_policy(SET CMP0114 NEW) endif() cmake_policy(SET CMP0135 NEW) +cmake_policy(SET CMP0225 NEW) include(${RunCMake_TEST}.cmake)