Browse Source

Improved version extraction from clang_getClangVersion()

merge-requests/413/head
eidheim 2 years ago
parent
commit
43f4e9b30b
  1. 28
      src/compile_commands.cpp

28
src/compile_commands.cpp

@ -84,21 +84,23 @@ std::vector<std::string> CompileCommands::get_arguments(const boost::filesystem:
}
}
static auto resource_path = []() -> std::string {
static std::string resource_path = []() -> std::string {
// Try based on clang_getClangVersion first, even though its format is not guaranteed to be stable.
auto clang_version = clangmm::to_string(clang_getClangVersion());
std::string version;
for(auto it = clang_version.rbegin(); it != clang_version.rend() && ((*it >= '0' && *it <= '9') || *it == '.'); ++it)
version.insert(version.begin(), *it);
while(!version.empty() && version.front() != '.' && version.back() != '.') {
auto path = boost::filesystem::path(LIBCLANG_LIBRARY_DIR) / "clang" / version;
boost::system::error_code ec;
if(boost::filesystem::is_directory(path / "include", ec))
return path.string();
auto pos = version.rfind('.');
if(pos == std::string::npos)
break;
version.erase(pos);
std::regex clang_version_regex("([0-9]+\\.[0-9]+\\.[0-9]+)");
std::smatch sm;
if(std::regex_search(clang_version, sm, clang_version_regex)) {
auto version = sm[1].str();
while(!version.empty() && version.front() != '.' && version.back() != '.') {
auto path = boost::filesystem::path(LIBCLANG_LIBRARY_DIR) / "clang" / version;
boost::system::error_code ec;
if(boost::filesystem::is_directory(path / "include", ec))
return path.string();
auto pos = version.rfind('.');
if(pos == std::string::npos)
break;
version.erase(pos);
}
}
boost::system::error_code ec;

Loading…
Cancel
Save