cmake: make FreeBSD 11,12 build

This commit is contained in:
Fangrui Song 2018-05-11 14:23:53 -07:00
parent a385bffcbd
commit b349983e13
5 changed files with 32 additions and 29 deletions

View File

@ -85,11 +85,12 @@ if(NOT SYSTEM_CLANG)
if(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang AND CLANG_USE_BUNDLED_LIBC++)
message(STATUS "Using bundled libc++")
target_compile_options(ccls PRIVATE -stdlib=libc++)
target_include_directories(ccls PRIVATE ${CLANG_ROOT}/include/c++/v1)
target_link_libraries(ccls PRIVATE ${CLANG_ROOT}/lib/libc++.a
${CLANG_ROOT}/lib/libc++abi.a
${CLANG_ROOT}/lib/libc++experimental.a)
target_compile_options(ccls PRIVATE -nostdinc++ -cxx-isystem ${CLANG_ROOT}/include/c++/v1)
target_link_libraries(ccls PRIVATE -stdlib=libc++ -L${CLANG_ROOT}/lib -lc++experimental)
if(${CMAKE_SYSTEM_NAME} STREQUAL Linux)
# FreeBSD uses system libcxxrt.a and does not need libc++abi.
target_link_libraries(ccls PRIVATE c++abi)
endif()
endif()
else()
@ -107,15 +108,13 @@ set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(ccls PRIVATE Threads::Threads)
if(${CMAKE_SYSTEM_NAME} STREQUAL Linux)
target_link_libraries(ccls PRIVATE -lstdc++fs)
elseif(MSVC)
else()
# e.g. Darwin, FreeBSD
if(${CMAKE_SYSTEM_NAME} STREQUAL Darwin)
target_link_libraries(ccls PRIVATE -lc++experimental)
endif()
if(${CMAKE_SYSTEM_NAME} STREQUAL Linux)
elseif(${CMAKE_SYSTEM_NAME} STREQUAL Linux)
if(NOT CLANG_USE_BUNDLED_LIBC++)
target_link_libraries(ccls PRIVATE -lstdc++fs)
endif()
# loguru calls dladdr
target_link_libraries(ccls PRIVATE ${CMAKE_DL_LIBS})
@ -125,6 +124,9 @@ elseif(${CMAKE_SYSTEM_NAME} STREQUAL FreeBSD)
# src/platform_posix.cc uses libthr
find_package(Backtrace REQUIRED)
target_link_libraries(ccls PRIVATE ${Backtrace_LIBRARIES} kvm thr)
if(SYSTEM_CLANG)
target_link_libraries(ccls PRIVATE c++experimental)
endif()
elseif(${CMAKE_SYSTEM_NAME} STREQUAL Windows)
# sparsepp/spp_memory.h uses LibPsapi

View File

@ -121,7 +121,7 @@ int FuzzyMatcher::Match(std::string_view text) {
pat[i] == text[j]))
? std::max(pre[j][0] + MatchScore(i, j, false),
pre[j][1] + MatchScore(i, j, true))
: cur[j + 1][1] = kMinScore * 2;
: kMinScore * 2;
}
}

View File

@ -12,6 +12,8 @@
#ifdef __clang__
#define GUARDED_BY(x) __attribute__((guarded_by(x)))
#else
#define GUARDED_BY(x)
#endif
// TODO GCC

View File

@ -69,7 +69,7 @@ std::vector<std::string> kBlacklist = {
// Arguments which are followed by a potentially relative path. We need to make
// all relative paths absolute, otherwise libclang will not resolve them.
std::vector<std::string> kPathArgs = {
"-I", "-iquote", "-isystem", "--sysroot=",
"-I", "-iquote", "-cxx-isystem", "-isystem", "--sysroot=",
"-isysroot", "-gcc-toolchain", "-include-pch", "-iframework",
"-F", "-imacros", "-include", "/I",
"-idirafter"};
@ -82,7 +82,7 @@ std::vector<std::string> kNormalizePathArgs = {"--sysroot="};
// Arguments whose path arguments should be injected into include dir lookup
// for #include completion.
std::vector<std::string> kQuoteIncludeArgs = {"-iquote", "-I", "/I"};
std::vector<std::string> kAngleIncludeArgs = {"-isystem", "-I", "/I"};
std::vector<std::string> kAngleIncludeArgs = {"-cxx-isystem", "-isystem", "-I", "/I"};
bool ShouldAddToQuoteIncludes(const std::string& arg) {
return StartsWithAny(arg, kQuoteIncludeArgs);
@ -152,16 +152,6 @@ Project::Entry GetCompilationEntryFromCompileCommandEntry(
for (; i < args.size(); ++i) {
std::string arg = args[i];
// If blacklist skip.
if (!next_flag_is_path) {
if (StartsWithAny(arg, kBlacklistMulti)) {
++i;
continue;
}
if (StartsWithAny(arg, kBlacklist))
continue;
}
// Finish processing path for the previous argument, which was a switch.
// {"-I", "foo"} style.
if (next_flag_is_path) {
@ -177,6 +167,12 @@ Project::Entry GetCompilationEntryFromCompileCommandEntry(
add_next_flag_to_quote_dirs = false;
add_next_flag_to_angle_dirs = false;
} else {
// If blacklist skip.
if (StartsWithAny(arg, kBlacklistMulti)) {
i++;
continue;
}
// Check to see if arg is a path and needs to be updated.
for (const std::string& flag_type : kPathArgs) {
// {"-I", "foo"} style.
@ -184,7 +180,7 @@ Project::Entry GetCompilationEntryFromCompileCommandEntry(
next_flag_is_path = true;
add_next_flag_to_quote_dirs = ShouldAddToQuoteIncludes(arg);
add_next_flag_to_angle_dirs = ShouldAddToAngleIncludes(arg);
break;
goto done;
}
// {"-Ifoo"} style.
@ -198,10 +194,13 @@ Project::Entry GetCompilationEntryFromCompileCommandEntry(
config->quote_dirs.insert(path);
if (ShouldAddToAngleIncludes(flag_type))
config->angle_dirs.insert(path);
break;
goto done;
}
}
if (StartsWithAny(arg, kBlacklist))
continue;
// This is most likely the file path we will be passing to clang. The
// path needs to be absolute, otherwise clang_codeCompleteAt is extremely
// slow. See
@ -215,6 +214,7 @@ Project::Entry GetCompilationEntryFromCompileCommandEntry(
continue;
}
done:
result.args.push_back(arg);
}

View File

@ -5,13 +5,12 @@
#include "serializers/json.h"
#include <doctest/doctest.h>
#include <optional>
#include <loguru.hpp>
#include <cassert>
#include <cstdint>
#include <functional>
#include <iterator>
#include <optional>
#include <string>
#include <unordered_map>
#include <unordered_set>