diff options
author | Kyle Edwards <kyle.edwards@kitware.com> | 2021-05-05 15:25:38 (GMT) |
---|---|---|
committer | Kyle Edwards <kyle.edwards@kitware.com> | 2021-06-04 12:52:01 (GMT) |
commit | 9f6cfe716918d7c28ddc906c49b75b922e36a8cf (patch) | |
tree | a80491b2add6eab03b4feee1190fc968c2f4760e /Source/cmFileCommand.cxx | |
parent | fac22d65962111e61a0fd7650d0efec963cc10ac (diff) | |
download | CMake-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.cxx | 61 |
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 }, |