1
0
Эх сурвалжийг харах

handle non-existing symlink creation locations

Domen Vrankar 8 жил өмнө
parent
commit
8e8f1118b9

+ 3 - 0
Help/manual/cmake.1.rst

@@ -315,6 +315,9 @@ The following ``cmake -E`` commands are available only on UNIX:
 ``create_symlink <old> <new>``
   Create a symbolic link ``<new>`` naming ``<old>``.
 
+.. note::
+  Path to where ``<new>`` symbolic link will be created has to exist beforehand.
+
 Windows-specific Command-Line Tools
 -----------------------------------
 

+ 3 - 0
Source/cmFileCommand.cxx

@@ -1486,6 +1486,9 @@ bool cmFileCopier::InstallSymlink(const char* fromFile, const char* toFile)
     // Remove the destination file so we can always create the symlink.
     cmSystemTools::RemoveFile(toFile);
 
+    // Create destination directory if it doesn't exist
+    cmSystemTools::MakeDirectory(cmSystemTools::GetFilenamePath(toFile));
+
     // Create the symlink.
     if (!cmSystemTools::CreateSymlink(symlinkTarget, toFile)) {
       std::ostringstream e;

+ 3 - 0
Tests/RunCMake/file/INSTALL-SYMLINK-stdout.txt

@@ -0,0 +1,3 @@
+-- Before Installing
+-- Installing: .*/Tests/RunCMake/file/INSTALL-SYMLINK-build/dst/current_dir_symlink
+-- After Installing

+ 13 - 0
Tests/RunCMake/file/INSTALL-SYMLINK.cmake

@@ -0,0 +1,13 @@
+set(src "${CMAKE_CURRENT_BINARY_DIR}/src")
+set(dst "${CMAKE_CURRENT_BINARY_DIR}/dst")
+file(REMOVE RECURSE "${src}")
+file(REMOVE RECURSE "${dst}")
+
+file(MAKE_DIRECTORY "${src}")
+execute_process(COMMAND
+  ${CMAKE_COMMAND} -E create_symlink source "${src}/current_dir_symlink")
+
+message(STATUS "Before Installing")
+file(INSTALL FILES "${src}/current_dir_symlink"
+  DESTINATION ${dst} TYPE DIRECTORY)
+message(STATUS "After Installing")

+ 1 - 0
Tests/RunCMake/file/RunCMakeTest.cmake

@@ -36,4 +36,5 @@ run_cmake(GLOB-noexp-LIST_DIRECTORIES)
 
 if(NOT WIN32 OR CYGWIN)
   run_cmake(GLOB_RECURSE-cyclic-recursion)
+  run_cmake(INSTALL-SYMLINK)
 endif()