diff options
author | Tushar Maheshwari <tushar27192@gmail.com> | 2019-01-15 15:04:46 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2019-01-16 15:03:35 (GMT) |
commit | 0f08ed89362d207e18b06e806f127cd683b79141 (patch) | |
tree | 890884ead135d0000f4cce22b5970d178ffd5411 | |
parent | 593d986470ce1938436da312e0c93e3c9c07017e (diff) | |
download | CMake-0f08ed89362d207e18b06e806f127cd683b79141.zip CMake-0f08ed89362d207e18b06e806f127cd683b79141.tar.gz CMake-0f08ed89362d207e18b06e806f127cd683b79141.tar.bz2 |
cmSystemTools: Silence CreateLink and CreateSymlink errors
If provided, report errors to a std::string.
This allows "silent" fallback to another flow, like COPY_ON_ERROR.
-rw-r--r-- | Source/cmFileCommand.cxx | 28 | ||||
-rw-r--r-- | Source/cmSystemTools.cxx | 18 | ||||
-rw-r--r-- | Source/cmSystemTools.h | 6 |
3 files changed, 31 insertions, 21 deletions
diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 2cdf827..999af54 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -3760,34 +3760,32 @@ bool cmFileCommand::HandleCreateLinkCommand( // Check if the command requires a symbolic link. if (symbolicArg.IsEnabled()) { - completed = cmSystemTools::CreateSymlink(fileName, newFileName); + completed = cmSystemTools::CreateSymlink(fileName, newFileName, &result); } else { - completed = cmSystemTools::CreateLink(fileName, newFileName); + completed = cmSystemTools::CreateLink(fileName, newFileName, &result); } - if (!completed) { - // The link method did not succeed. Get the error message. - result = "Link failed: " + cmSystemTools::GetLastSystemError(); - - // Check if copy-on-error is enabled in the arguments. - if (copyOnErrorArg.IsEnabled()) { - completed = - cmSystemTools::cmCopyFile(fileName.c_str(), newFileName.c_str()); - if (!completed) { - result = "Copy failed: " + cmSystemTools::GetLastSystemError(); - } + // Check if copy-on-error is enabled in the arguments. + if (!completed && copyOnErrorArg.IsEnabled()) { + completed = + cmSystemTools::cmCopyFile(fileName.c_str(), newFileName.c_str()); + if (!completed) { + result = "Copy failed: " + cmSystemTools::GetLastSystemError(); } } // Check if the operation was successful. if (completed) { result = "0"; + } else if (resultVar.empty()) { + // The operation failed and the result is not reported in a variable. + this->SetError(result); + return false; } if (!resultVar.empty()) { this->Makefile->AddDefinition(resultVar, result.c_str()); - return true; } - return completed; + return true; } diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index a1c8c03..52957c1 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -3114,7 +3114,8 @@ std::string cmSystemTools::EncodeURL(std::string const& in, bool escapeSlashes) } bool cmSystemTools::CreateSymlink(const std::string& origName, - const std::string& newName) + const std::string& newName, + std::string* errorMessage) { uv_fs_t req; int flags = 0; @@ -3128,7 +3129,11 @@ bool cmSystemTools::CreateSymlink(const std::string& origName, if (err) { std::string e = "failed to create symbolic link '" + newName + "': " + uv_strerror(err); - cmSystemTools::Error(e.c_str()); + if (errorMessage) { + *errorMessage = std::move(e); + } else { + cmSystemTools::Error(e.c_str()); + } return false; } @@ -3136,7 +3141,8 @@ bool cmSystemTools::CreateSymlink(const std::string& origName, } bool cmSystemTools::CreateLink(const std::string& origName, - const std::string& newName) + const std::string& newName, + std::string* errorMessage) { uv_fs_t req; int err = @@ -3144,7 +3150,11 @@ bool cmSystemTools::CreateLink(const std::string& origName, if (err) { std::string e = "failed to create link '" + newName + "': " + uv_strerror(err); - cmSystemTools::Error(e.c_str()); + if (errorMessage) { + *errorMessage = std::move(e); + } else { + cmSystemTools::Error(e.c_str()); + } return false; } diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index 15f27e5..489811d 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -528,12 +528,14 @@ public: /** Create a symbolic link if the platform supports it. Returns whether creation succeeded. */ static bool CreateSymlink(const std::string& origName, - const std::string& newName); + const std::string& newName, + std::string* errorMessage = nullptr); /** Create a hard link if the platform supports it. Returns whether creation succeeded. */ static bool CreateLink(const std::string& origName, - const std::string& newName); + const std::string& newName, + std::string* errorMessage = nullptr); private: static bool s_ForceUnixPaths; |