From 8e8f1118b947905e0e881ea3d9cc881f5fdce89d Mon Sep 17 00:00:00 2001 From: Domen Vrankar Date: Wed, 29 Mar 2017 00:22:52 +0200 Subject: handle non-existing symlink creation locations --- Help/manual/cmake.1.rst | 3 +++ Source/cmFileCommand.cxx | 3 +++ Tests/RunCMake/file/INSTALL-SYMLINK-stdout.txt | 3 +++ Tests/RunCMake/file/INSTALL-SYMLINK.cmake | 13 +++++++++++++ Tests/RunCMake/file/RunCMakeTest.cmake | 1 + 5 files changed, 23 insertions(+) create mode 100644 Tests/RunCMake/file/INSTALL-SYMLINK-stdout.txt create mode 100644 Tests/RunCMake/file/INSTALL-SYMLINK.cmake diff --git a/Help/manual/cmake.1.rst b/Help/manual/cmake.1.rst index 063aea1..a11e2f9 100644 --- a/Help/manual/cmake.1.rst +++ b/Help/manual/cmake.1.rst @@ -315,6 +315,9 @@ The following ``cmake -E`` commands are available only on UNIX: ``create_symlink `` Create a symbolic link ```` naming ````. +.. note:: + Path to where ```` symbolic link will be created has to exist beforehand. + Windows-specific Command-Line Tools ----------------------------------- diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 97292f9..7207d34 100644 --- a/Source/cmFileCommand.cxx +++ b/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; diff --git a/Tests/RunCMake/file/INSTALL-SYMLINK-stdout.txt b/Tests/RunCMake/file/INSTALL-SYMLINK-stdout.txt new file mode 100644 index 0000000..9fb8e10 --- /dev/null +++ b/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 diff --git a/Tests/RunCMake/file/INSTALL-SYMLINK.cmake b/Tests/RunCMake/file/INSTALL-SYMLINK.cmake new file mode 100644 index 0000000..5a4284a --- /dev/null +++ b/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") diff --git a/Tests/RunCMake/file/RunCMakeTest.cmake b/Tests/RunCMake/file/RunCMakeTest.cmake index 3f3c0da..63cbdd9 100644 --- a/Tests/RunCMake/file/RunCMakeTest.cmake +++ b/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() -- cgit v0.12