summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTushar Maheshwari <tushar27192@gmail.com>2019-01-15 15:04:46 (GMT)
committerBrad King <brad.king@kitware.com>2019-01-16 15:03:35 (GMT)
commit0f08ed89362d207e18b06e806f127cd683b79141 (patch)
tree890884ead135d0000f4cce22b5970d178ffd5411
parent593d986470ce1938436da312e0c93e3c9c07017e (diff)
downloadCMake-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.cxx28
-rw-r--r--Source/cmSystemTools.cxx18
-rw-r--r--Source/cmSystemTools.h6
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;