summaryrefslogtreecommitdiffstats
path: root/Tests/RunCMake
diff options
context:
space:
mode:
authorCraig Scott <craig.scott@crascit.com>2024-05-31 07:38:10 (GMT)
committerCraig Scott <craig.scott@crascit.com>2024-05-31 08:01:27 (GMT)
commit0cc1b550ddc7cb677ce45fd54f6bbb92f3ff2268 (patch)
tree51b8cad6afefa65e2276bf5b1298a884252c2c37 /Tests/RunCMake
parent140766867b2c8f8dff0e4d0d73e481b6944b5284 (diff)
downloadCMake-0cc1b550ddc7cb677ce45fd54f6bbb92f3ff2268.zip
CMake-0cc1b550ddc7cb677ce45fd54f6bbb92f3ff2268.tar.gz
CMake-0cc1b550ddc7cb677ce45fd54f6bbb92f3ff2268.tar.bz2
ExternalProject,FetchContent: Avoid CMAKE_DISABLE_SOURCE_CHANGES error
The file(MAKE_DIRECTORY) implementation checks whether a path is allowed to be written to before it checks if it already exists. For the scenario where a SOURCE_DIR is an existing directory within the main project's source directory, this triggers a fatal error if CMAKE_DISABLE_SOURCE_CHANGES is set to true for ExternalProject, and some FetchContent scenarios. Therefore, add an explicit check for existence first to avoid making such error-triggering calls. Fixes: #21872
Diffstat (limited to 'Tests/RunCMake')
-rw-r--r--Tests/RunCMake/ExternalProject/RunCMakeTest.cmake1
-rw-r--r--Tests/RunCMake/ExternalProject/SourceDirExisting.cmake16
-rw-r--r--Tests/RunCMake/FetchContent/DisableSourceChanges.cmake18
-rw-r--r--Tests/RunCMake/FetchContent/RunCMakeTest.cmake2
4 files changed, 37 insertions, 0 deletions
diff --git a/Tests/RunCMake/ExternalProject/RunCMakeTest.cmake b/Tests/RunCMake/ExternalProject/RunCMakeTest.cmake
index 44c6f74..3c7cd68 100644
--- a/Tests/RunCMake/ExternalProject/RunCMakeTest.cmake
+++ b/Tests/RunCMake/ExternalProject/RunCMakeTest.cmake
@@ -21,6 +21,7 @@ run_cmake(TLSVersionBadEnv)
run_cmake(NoOptions)
run_cmake(SourceEmpty)
run_cmake(SourceMissing)
+run_cmake(SourceDirExisting)
run_cmake(CMAKE_CACHE_ARGS)
run_cmake(CMAKE_CACHE_DEFAULT_ARGS)
run_cmake(CMAKE_CACHE_mix)
diff --git a/Tests/RunCMake/ExternalProject/SourceDirExisting.cmake b/Tests/RunCMake/ExternalProject/SourceDirExisting.cmake
new file mode 100644
index 0000000..761bb8e
--- /dev/null
+++ b/Tests/RunCMake/ExternalProject/SourceDirExisting.cmake
@@ -0,0 +1,16 @@
+# We're providing a pre-existing source directory. Make sure we don't trigger
+# an error if the undocumented but used-in-the-wild CMAKE_DISABLE_SOURCE_CHANGES
+# variable is set.
+set(CMAKE_DISABLE_SOURCE_CHANGES TRUE)
+
+include(ExternalProject)
+
+ExternalProject_Add(source_dir_existing
+ SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/Foo"
+ DOWNLOAD_COMMAND "${CMAKE_COMMAND}" -E echo "Download command executed"
+ UPDATE_COMMAND ""
+ CONFIGURE_COMMAND ""
+ BUILD_COMMAND ""
+ TEST_COMMAND ""
+ INSTALL_COMMAND ""
+)
diff --git a/Tests/RunCMake/FetchContent/DisableSourceChanges.cmake b/Tests/RunCMake/FetchContent/DisableSourceChanges.cmake
new file mode 100644
index 0000000..a144005
--- /dev/null
+++ b/Tests/RunCMake/FetchContent/DisableSourceChanges.cmake
@@ -0,0 +1,18 @@
+cmake_policy(SET CMP0168 NEW)
+
+# Undocumented variable used to catch attempts to write to anywhere under the
+# source directory that isn't under the build directory. In order for this
+# code path to be checked for direct population mode, we need a non-empty
+# download, update, or patch command so that the population code path is used.
+# Custom commands might not write to the source directory and instead just
+# print messages or other non-modifying tasks, like is done here.
+set(CMAKE_DISABLE_SOURCE_CHANGES TRUE)
+
+include(FetchContent)
+
+FetchContent_Declare(
+ WithProject
+ SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/WithProject # This exists
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND} -E echo "Download command executed"
+)
+FetchContent_MakeAvailable(WithProject)
diff --git a/Tests/RunCMake/FetchContent/RunCMakeTest.cmake b/Tests/RunCMake/FetchContent/RunCMakeTest.cmake
index 72a458c..d0ec638 100644
--- a/Tests/RunCMake/FetchContent/RunCMakeTest.cmake
+++ b/Tests/RunCMake/FetchContent/RunCMakeTest.cmake
@@ -106,3 +106,5 @@ run_cmake_command(ScriptMode-direct
-DCMP0168=NEW
-P ${CMAKE_CURRENT_LIST_DIR}/ScriptMode.cmake
)
+
+run_cmake(DisableSourceChanges)