file(): Add REAL_PATH sub-command

This commit is contained in:
Marc Chevrier
2020-08-26 14:33:18 +02:00
parent 503d0f80e1
commit be36266dab
12 changed files with 95 additions and 2 deletions

View File

@@ -28,6 +28,7 @@
#include "cmAlgorithms.h"
#include "cmArgumentParser.h"
#include "cmCMakePath.h"
#include "cmCryptoHash.h"
#include "cmExecutionStatus.h"
#include "cmFSPermissions.h"
@@ -1234,6 +1235,50 @@ bool HandleInstallCommand(std::vector<std::string> const& args,
return installer.Run(args);
}
bool HandleRealPathCommand(std::vector<std::string> const& args,
cmExecutionStatus& status)
{
if (args.size() < 3) {
status.SetError("REAL_PATH requires a path and an output variable");
return false;
}
struct Arguments
{
std::string BaseDirectory;
};
static auto const parser = cmArgumentParser<Arguments>{}.Bind(
"BASE_DIRECTORY"_s, &Arguments::BaseDirectory);
std::vector<std::string> unparsedArguments;
std::vector<std::string> keywordsMissingValue;
std::vector<std::string> parsedKeywords;
auto arguments =
parser.Parse(cmMakeRange(args).advance(3), &unparsedArguments,
&keywordsMissingValue, &parsedKeywords);
if (!unparsedArguments.empty()) {
status.SetError("REAL_PATH called with unexpected arguments");
return false;
}
if (!keywordsMissingValue.empty()) {
status.SetError("BASE_DIRECTORY requires a value");
return false;
}
if (parsedKeywords.empty()) {
arguments.BaseDirectory = status.GetMakefile().GetCurrentSourceDirectory();
}
cmCMakePath path(args[1]);
path = path.Absolute(arguments.BaseDirectory).Normal();
auto realPath = cmSystemTools::GetRealPath(path.GenericString());
status.GetMakefile().AddDefinition(args[2], realPath);
return true;
}
bool HandleRelativePathCommand(std::vector<std::string> const& args,
cmExecutionStatus& status)
{
@@ -3360,6 +3405,7 @@ bool cmFileCommand(std::vector<std::string> const& args,
{ "RPATH_CHECK"_s, HandleRPathCheckCommand },
{ "RPATH_REMOVE"_s, HandleRPathRemoveCommand },
{ "READ_ELF"_s, HandleReadElfCommand },
{ "REAL_PATH"_s, HandleRealPathCommand },
{ "RELATIVE_PATH"_s, HandleRelativePathCommand },
{ "TO_CMAKE_PATH"_s, HandleCMakePathCommand },
{ "TO_NATIVE_PATH"_s, HandleNativePathCommand },