Allow symbolic links to a directory to be installed via install(FILES ...). Fixes: #22159
@@ -1482,7 +1482,8 @@ bool Helper::MakeFilesFullPath(const char* modeName,
}
// Make sure the file is not a directory.
- if (gpos == std::string::npos && cmSystemTools::FileIsDirectory(file)) {
+ if (gpos == std::string::npos && !cmSystemTools::FileIsSymlink(file) &&
+ cmSystemTools::FileIsDirectory(file)) {
this->SetError(
cmStrCat(modeName, " given directory \"", relFile, "\" to install."));
return false;
@@ -0,0 +1 @@
+1
+install FILES given directory
@@ -0,0 +1,7 @@
+set(dst "${CMAKE_CURRENT_BINARY_DIR}/dst")
+set(src "${CMAKE_CURRENT_BINARY_DIR}/src")
+
+file(MAKE_DIRECTORY "${dst}")
+file(MAKE_DIRECTORY "${src}")
+install(FILES "${src}" DESTINATION "${dst}")
@@ -0,0 +1,9 @@
+set(lnk "${CMAKE_CURRENT_BINARY_DIR}/lnk")
+file(CREATE_LINK "${src}" "${lnk}" SYMBOLIC)
+install(FILES "${lnk}" DESTINATION "${dst}")
@@ -93,6 +93,10 @@ run_cmake(TARGETS-NAMELINK_COMPONENT-bad-all)
run_cmake(TARGETS-NAMELINK_COMPONENT-bad-exc)
run_cmake(FILES-DESTINATION-TYPE)
run_cmake(DIRECTORY-DESTINATION-TYPE)
+run_cmake(FILES-directory)
+if(NOT WIN32)
+ run_cmake(FILES-symlink-to-directory)
+endif()
set(RunCMake_TEST_OPTIONS "-DCMAKE_BUILD_TYPE:STRING=Debug")
run_install_test(FILES-RENAME)