summaryrefslogtreecommitdiffstats
path: root/Source/cmFileCommand.cxx
diff options
context:
space:
mode:
authorKyle Edwards <kyle.edwards@kitware.com>2021-05-05 15:25:38 (GMT)
committerKyle Edwards <kyle.edwards@kitware.com>2021-06-04 12:52:01 (GMT)
commit9f6cfe716918d7c28ddc906c49b75b922e36a8cf (patch)
treea80491b2add6eab03b4feee1190fc968c2f4760e /Source/cmFileCommand.cxx
parentfac22d65962111e61a0fd7650d0efec963cc10ac (diff)
downloadCMake-9f6cfe716918d7c28ddc906c49b75b922e36a8cf.zip
CMake-9f6cfe716918d7c28ddc906c49b75b922e36a8cf.tar.gz
CMake-9f6cfe716918d7c28ddc906c49b75b922e36a8cf.tar.bz2
file: Add undocumented RPATH_SET command
Diffstat (limited to 'Source/cmFileCommand.cxx')
-rw-r--r--Source/cmFileCommand.cxx61
1 files changed, 61 insertions, 0 deletions
diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx
index 60a8086..82546b9 100644
--- a/Source/cmFileCommand.cxx
+++ b/Source/cmFileCommand.cxx
@@ -1057,6 +1057,66 @@ bool HandleRPathChangeCommand(std::vector<std::string> const& args,
return success;
}
+bool HandleRPathSetCommand(std::vector<std::string> const& args,
+ cmExecutionStatus& status)
+{
+ // Evaluate arguments.
+ std::string file;
+ std::string newRPath;
+ cmArgumentParser<void> parser;
+ std::vector<std::string> unknownArgs;
+ std::vector<std::string> missingArgs;
+ std::vector<std::string> parsedArgs;
+ parser.Bind("FILE"_s, file).Bind("NEW_RPATH"_s, newRPath);
+ parser.Parse(cmMakeRange(args).advance(1), &unknownArgs, &missingArgs,
+ &parsedArgs);
+ if (!unknownArgs.empty()) {
+ status.SetError(cmStrCat("RPATH_SET given unrecognized argument \"",
+ unknownArgs.front(), "\"."));
+ return false;
+ }
+ if (!missingArgs.empty()) {
+ status.SetError(cmStrCat("RPATH_SET \"", missingArgs.front(),
+ "\" argument not given value."));
+ return false;
+ }
+ if (file.empty()) {
+ status.SetError("RPATH_SET not given FILE option.");
+ return false;
+ }
+ if (newRPath.empty() &&
+ std::find(parsedArgs.begin(), parsedArgs.end(), "NEW_RPATH") ==
+ parsedArgs.end()) {
+ status.SetError("RPATH_SET not given NEW_RPATH option.");
+ return false;
+ }
+ if (!cmSystemTools::FileExists(file, true)) {
+ status.SetError(
+ cmStrCat("RPATH_SET given FILE \"", file, "\" that does not exist."));
+ return false;
+ }
+ bool success = true;
+ cmFileTimes const ft(file);
+ std::string emsg;
+ bool changed;
+
+ if (!cmSystemTools::SetRPath(file, newRPath, &emsg, &changed)) {
+ status.SetError(cmStrCat("RPATH_SET could not write new RPATH:\n ",
+ newRPath, "\nto the file:\n ", file, "\n",
+ emsg));
+ success = false;
+ }
+ if (success) {
+ if (changed) {
+ std::string message =
+ cmStrCat("Set runtime path of \"", file, "\" to \"", newRPath, '"');
+ status.GetMakefile().DisplayStatus(message, -1);
+ }
+ ft.Store(file);
+ }
+ return success;
+}
+
bool HandleRPathRemoveCommand(std::vector<std::string> const& args,
cmExecutionStatus& status)
{
@@ -3732,6 +3792,7 @@ bool cmFileCommand(std::vector<std::string> const& args,
{ "DIFFERENT"_s, HandleDifferentCommand },
{ "RPATH_CHANGE"_s, HandleRPathChangeCommand },
{ "CHRPATH"_s, HandleRPathChangeCommand },
+ { "RPATH_SET"_s, HandleRPathSetCommand },
{ "RPATH_CHECK"_s, HandleRPathCheckCommand },
{ "RPATH_REMOVE"_s, HandleRPathRemoveCommand },
{ "READ_ELF"_s, HandleReadElfCommand },