/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmCMakeCommand.h" #include #include #include "cmExecutionStatus.h" #include "cmListFileCache.h" #include "cmMakefile.h" #include "cmRange.h" #include "cmStringAlgorithms.h" bool cmCMakeCommand(std::vector const& args, cmExecutionStatus& status) { if (args.empty()) { status.SetError("called with incorrect number of arguments"); return false; } cmMakefile& makefile = status.GetMakefile(); cmListFileContext context = makefile.GetExecutionContext(); bool result = false; if (args[0] == "INVOKE") { if (args.size() == 1) { status.SetError("called with incorrect number of arguments"); return false; } // First argument is the name of the function to call cmListFileFunction func; func.Name = args[1]; func.Line = context.Line; // The rest of the arguments are passed to the function call above func.Arguments.resize(args.size() - 1); for (size_t i = 2; i < args.size(); ++i) { cmListFileArgument lfarg; lfarg.Line = context.Line; lfarg.Value = args[i]; func.Arguments.emplace_back(lfarg); } result = makefile.ExecuteCommand(func, status); } else if (args[0] == "EVAL") { if (args.size() < 2) { status.SetError("called with incorrect number of arguments"); return false; } auto code_iter = std::find(args.begin(), args.end(), "CODE"); if (code_iter == args.end()) { status.SetError("called without CODE argument"); return false; } const std::string code = cmJoin(cmMakeRange(++code_iter, args.end()), " "); result = makefile.ReadListFileAsString( code, cmStrCat(context.FilePath, ":", context.Line, ":EVAL")); } else { status.SetError("called with unknown meta-operation"); } return result; }