/// \file ProgramRunner.cpp /// \brief a program runner is used to invoke external programs a bit more /// safelly than to compose a string and invoke system // // This file is distributed under the MIT License. See LICENSE.md for details. // #include #include "llvm/ADT/ArrayRef.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" #include "llvm/Support/Program.h" #include "revng/Support/Assert.h" #include "revng/Support/PathList.h" #include "revng/Support/ProgramRunner.h" using namespace llvm; ProgramRunner Runner; ProgramRunner::ProgramRunner() { using namespace llvm::sys::path; CurrentProgramPath = parent_path(getCurrentExecutableFullPath()); Paths = { { CurrentProgramPath } }; // Append PATH char *Path = getenv("PATH"); if (Path == nullptr) return; StringRef(Path).split(Paths, ":"); } int ProgramRunner::run(llvm::StringRef ProgramName, ArrayRef Args) { using namespace llvm::sys; auto MaybeProgramPath = findProgramByName(ProgramName, Paths); revng_assert(not Paths.empty()); revng_assert(MaybeProgramPath, (ProgramName + " was not found in " + getenv("PATH")) .str() .c_str()); // Prepare actual arguments std::vector StringRefs{ *MaybeProgramPath }; for (const std::string &Arg : Args) StringRefs.push_back(Arg); int ExitCode = ExecuteAndWait(StringRefs[0], StringRefs); return ExitCode; }