浏览代码

FetchContent: Raise error if manually given source dir does not exist

Fixes: #21208
Craig Scott 5 年之前
父节点
当前提交
b030a6af88

+ 6 - 0
Modules/FetchContent.cmake

@@ -1052,6 +1052,12 @@ function(FetchContent_Populate contentName)
     # The source directory has been explicitly provided in the cache,
     # so no population is required. The build directory may still be specified
     # by the declared details though.
+
+    if(NOT EXISTS "${FETCHCONTENT_SOURCE_DIR_${contentNameUpper}}")
+      message(FATAL_ERROR "Manually specified source directory is missing:\n"
+        "  FETCHCONTENT_SOURCE_DIR_${contentNameUpper} --> ${FETCHCONTENT_SOURCE_DIR_${contentNameUpper}}")
+    endif()
+
     set(${contentNameLower}_SOURCE_DIR "${FETCHCONTENT_SOURCE_DIR_${contentNameUpper}}")
 
     cmake_parse_arguments(savedDetails "" "BINARY_DIR" "" ${contentDetails})

+ 8 - 0
Tests/RunCMake/FetchContent/ManualSourceDirectory.cmake

@@ -0,0 +1,8 @@
+include(FetchContent)
+
+FetchContent_Declare(
+  WithProject
+  SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/ADirThatDoesNotExist
+)
+
+FetchContent_MakeAvailable(WithProject)

+ 1 - 0
Tests/RunCMake/FetchContent/ManualSourceDirectoryMissing-result.txt

@@ -0,0 +1 @@
+1

+ 2 - 0
Tests/RunCMake/FetchContent/ManualSourceDirectoryMissing-stderr.txt

@@ -0,0 +1,2 @@
+ *Manually specified source directory is missing:
++ *FETCHCONTENT_SOURCE_DIR_WITHPROJECT --> .*/ADirThatDoesNotExist

+ 8 - 0
Tests/RunCMake/FetchContent/ManualSourceDirectoryMissing.cmake

@@ -0,0 +1,8 @@
+include(FetchContent)
+
+FetchContent_Declare(
+  WithProject
+  SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/WithProject
+)
+
+FetchContent_MakeAvailable(WithProject)

+ 7 - 0
Tests/RunCMake/FetchContent/RunCMakeTest.cmake

@@ -15,6 +15,13 @@ run_cmake(MakeAvailable)
 run_cmake(MakeAvailableTwice)
 run_cmake(MakeAvailableUndeclared)
 
+run_cmake_with_options(ManualSourceDirectory
+  -D "FETCHCONTENT_SOURCE_DIR_WITHPROJECT=${CMAKE_CURRENT_LIST_DIR}/WithProject"
+)
+run_cmake_with_options(ManualSourceDirectoryMissing
+  -D "FETCHCONTENT_SOURCE_DIR_WITHPROJECT=${CMAKE_CURRENT_LIST_DIR}/ADirThatDoesNotExist"
+)
+
 function(run_FetchContent_DirOverrides)
   set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/DirOverrides-build)
   file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")