Implement a search for the clang binary
This commit is contained in:
parent
bf872b31d1
commit
a4c64dbc8d
2 changed files with 39 additions and 4 deletions
|
|
@ -118,11 +118,10 @@ public:
|
||||||
|
|
||||||
/// \effects Sets the path to the location of the `clang++` binary and the version of that
|
/// \effects Sets the path to the location of the `clang++` binary and the version of that
|
||||||
/// binary.
|
/// binary.
|
||||||
|
/// If the binary is not found, it will try and search for it.
|
||||||
|
/// \returns `true` if the binary was found exactly as specified.
|
||||||
/// \notes It will be used for preprocessing.
|
/// \notes It will be used for preprocessing.
|
||||||
void set_clang_binary(std::string binary)
|
bool set_clang_binary(std::string binary);
|
||||||
{
|
|
||||||
clang_binary_ = std::move(binary);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \effects Sets whether or not the preprocessed file will be written out.
|
/// \effects Sets whether or not the preprocessed file will be written out.
|
||||||
/// Default value is `false`.
|
/// Default value is `false`.
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <clang-c/CXCompilationDatabase.h>
|
#include <clang-c/CXCompilationDatabase.h>
|
||||||
|
#include <process.hpp>
|
||||||
|
|
||||||
#include "cxtokenizer.hpp"
|
#include "cxtokenizer.hpp"
|
||||||
#include "libclang_visitor.hpp"
|
#include "libclang_visitor.hpp"
|
||||||
|
|
@ -18,6 +19,7 @@
|
||||||
#include "raii_wrapper.hpp"
|
#include "raii_wrapper.hpp"
|
||||||
|
|
||||||
using namespace cppast;
|
using namespace cppast;
|
||||||
|
namespace tpl = TinyProcessLib;
|
||||||
|
|
||||||
const std::string& detail::libclang_compile_config_access::clang_binary(
|
const std::string& detail::libclang_compile_config_access::clang_binary(
|
||||||
const libclang_compile_config& config)
|
const libclang_compile_config& config)
|
||||||
|
|
@ -240,6 +242,40 @@ libclang_compile_config::libclang_compile_config(const libclang_compilation_data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
bool is_valid_binary(const std::string& binary)
|
||||||
|
{
|
||||||
|
tpl::Process process(binary + " -v", "", [](const char*, std::size_t) {},
|
||||||
|
[](const char*, std::size_t) {});
|
||||||
|
return process.get_exit_status() == 0;
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
bool libclang_compile_config::set_clang_binary(std::string binary)
|
||||||
|
{
|
||||||
|
if (is_valid_binary(binary))
|
||||||
|
{
|
||||||
|
clang_binary_ = binary;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// first search in current directory, then in PATH
|
||||||
|
static const char* paths[]
|
||||||
|
= {"./clang++", "clang++", "./clang++-4.0", "clang++-4.0", "./clang++-5.0",
|
||||||
|
"clang++-5.0", "./clang++-6.0", "clang++-6.0", "./clang-7", "clang-7"};
|
||||||
|
for (auto& p : paths)
|
||||||
|
if (is_valid_binary(p))
|
||||||
|
{
|
||||||
|
clang_binary_ = p;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw std::invalid_argument("unable to find clang binary '" + binary + "'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void libclang_compile_config::do_set_flags(cpp_standard standard, compile_flags flags)
|
void libclang_compile_config::do_set_flags(cpp_standard standard, compile_flags flags)
|
||||||
{
|
{
|
||||||
switch (standard)
|
switch (standard)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue