ccls/CMakeLists.txt

253 lines
8.8 KiB
CMake
Raw Normal View History

cmake_minimum_required(VERSION 3.1)
2018-03-31 03:16:33 +00:00
project(ccls LANGUAGES CXX)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/)
include(DefaultCMakeBuildType)
2018-04-15 17:21:26 +00:00
# Required Clang version
set(CLANG_VERSION 6.0.0 CACHE STRING "Clang version")
set(CLANG_DOWNLOAD_LOCATION ${CMAKE_BINARY_DIR}
CACHE STRING "Downloaded Clang location")
option(SYSTEM_CLANG "Use system installation of Clang instead of \
downloading Clang" OFF)
option(ASAN "Compile with address sanitizers" OFF)
2018-05-08 06:56:53 +00:00
option(CLANG_USE_BUNDLED_LIBC++ "Let Clang use bundled libc++" OFF)
2018-05-14 02:09:26 +00:00
option(USE_SHARED_LLVM "Link against libLLVM.so instead separate LLVM{Option,Support,...}" OFF)
# Sources for the executable are specified at end of CMakeLists.txt
2018-03-31 03:16:33 +00:00
add_executable(ccls "")
### Compile options
# CMake default compile flags:
2018-03-22 05:01:21 +00:00
# MSVC + Clang(Windows):
# debug: /MDd /Zi /Ob0 /Od /RTC1
# release: /MD /O2 /Ob2 /DNDEBUG
# GCC + Clang(Linux):
# debug: -g
# release: -O3 -DNDEBUG
2018-04-02 03:55:10 +00:00
# Enable C++17 (Required)
2018-03-31 03:16:33 +00:00
set_property(TARGET ccls PROPERTY CXX_STANDARD 17)
set_property(TARGET ccls PROPERTY CXX_STANDARD_REQUIRED ON)
2018-03-26 15:30:33 +00:00
# Disable gnu extensions except for Cygwin which needs them to build properly
if(NOT CYGWIN)
2018-03-31 03:16:33 +00:00
set_property(TARGET ccls PROPERTY CXX_EXTENSIONS OFF)
2018-03-26 15:30:33 +00:00
endif()
# To link against LLVM libraries (usually compiled with -fno-rtti)
target_compile_options(ccls PRIVATE -fno-rtti)
# CMake sets MSVC for both MSVC and Clang(Windows)
if(MSVC)
# Common MSVC/Clang(Windows) options
2018-03-31 03:16:33 +00:00
target_compile_options(ccls PRIVATE
2018-03-22 05:01:21 +00:00
/nologo
/EHsc
/W3 # roughly -Wall
/wd4996 # disable loguru unsafe warnings
2018-03-22 05:01:21 +00:00
/wd4722 # ignores warning C4722
# (destructor never returns) in loguru
2018-03-22 05:01:21 +00:00
/wd4267 # ignores warning C4267
# (conversion from 'size_t' to 'type'),
# roughly -Wno-sign-compare
/wd4800
$<$<CONFIG:Debug>:/FS>
)
else()
# Common GCC/Clang(Linux) options
2018-03-31 03:16:33 +00:00
target_compile_options(ccls PRIVATE
2018-03-22 05:01:21 +00:00
-Wall
-Wno-sign-compare
)
if(${CMAKE_CXX_COMPILER_ID} STREQUAL GNU)
2018-03-31 03:16:33 +00:00
target_compile_options(ccls PRIVATE -Wno-return-type -Wno-unused-result)
endif()
if(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)
2018-03-31 03:16:33 +00:00
target_compile_options(ccls PRIVATE
$<$<CONFIG:Debug>:-fno-limit-debug-info>)
endif()
if(ASAN)
2018-03-31 03:16:33 +00:00
target_compile_options(ccls PRIVATE -fsanitize=address,undefined)
# target_link_libraries also takes linker flags
2018-03-31 03:16:33 +00:00
target_link_libraries(ccls PRIVATE -fsanitize=address,undefined)
endif()
endif()
2018-04-15 17:21:26 +00:00
### Download Clang if required
if(NOT SYSTEM_CLANG)
message(STATUS "Using downloaded Clang")
include(DownloadAndExtractClang)
2018-04-15 17:21:26 +00:00
download_and_extract_clang(${CLANG_VERSION} ${CLANG_DOWNLOAD_LOCATION})
# Used by FindClang
set(CLANG_ROOT ${DOWNLOADED_CLANG_DIR})
2018-05-08 06:56:53 +00:00
if(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang AND CLANG_USE_BUNDLED_LIBC++)
message(STATUS "Using bundled libc++")
2018-05-11 21:23:53 +00:00
target_compile_options(ccls PRIVATE -nostdinc++ -cxx-isystem ${CLANG_ROOT}/include/c++/v1)
if(${CMAKE_SYSTEM_NAME} STREQUAL Linux)
# Don't use -stdlib=libc++ because while ccls is linked with libc++, bundled clang+llvm require libstdc++
target_link_libraries(ccls PRIVATE -L${CLANG_ROOT}/lib c++ c++abi)
# FreeBSD defaults to -stdlib=libc++ and uses system libcxxrt.a
2018-05-11 21:23:53 +00:00
endif()
2018-05-08 06:56:53 +00:00
endif()
else()
2018-04-15 17:21:26 +00:00
message(STATUS "Using system Clang")
endif()
### Libraries
# See cmake/FindClang.cmake
2018-04-15 17:21:26 +00:00
find_package(Clang ${CLANG_VERSION} REQUIRED)
2018-03-31 03:16:33 +00:00
target_link_libraries(ccls PRIVATE Clang::Clang)
# Enable threading support
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
2018-03-31 03:16:33 +00:00
target_link_libraries(ccls PRIVATE Threads::Threads)
2018-05-11 21:23:53 +00:00
if(${CMAKE_SYSTEM_NAME} STREQUAL Darwin)
target_link_libraries(ccls PRIVATE -lc++experimental)
2018-03-31 17:37:03 +00:00
2018-05-11 21:23:53 +00:00
elseif(${CMAKE_SYSTEM_NAME} STREQUAL Linux)
# loguru calls dladdr
2018-03-31 03:16:33 +00:00
target_link_libraries(ccls PRIVATE ${CMAKE_DL_LIBS})
elseif(${CMAKE_SYSTEM_NAME} STREQUAL FreeBSD)
# loguru::stacktrace_as_stdstring calls backtrace_symbols
# src/platform_posix.cc uses libthr
find_package(Backtrace REQUIRED)
target_link_libraries(ccls PRIVATE ${Backtrace_LIBRARIES} thr)
2018-05-11 21:23:53 +00:00
if(SYSTEM_CLANG)
target_link_libraries(ccls PRIVATE c++experimental)
endif()
endif()
### Definitions
2018-03-31 03:16:33 +00:00
target_compile_definitions(ccls PRIVATE
LOGURU_WITH_STREAMS=1
LOGURU_FILENAME_WIDTH=18
LOGURU_THREADNAME_WIDTH=13
DEFAULT_RESOURCE_DIRECTORY="${Clang_RESOURCE_DIR}")
### Includes
2018-03-31 03:16:33 +00:00
target_include_directories(ccls PRIVATE
src
third_party
third_party/rapidjson/include
third_party/loguru
2018-04-14 23:48:56 +00:00
third_party/doctest)
### Install
2018-03-31 03:16:33 +00:00
install(TARGETS ccls RUNTIME DESTINATION bin)
# TODO: install libclang.dll on Windows as well
2018-04-15 17:21:26 +00:00
if(NOT SYSTEM_CLANG AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL Windows)
if(${CMAKE_SYSTEM_NAME} MATCHES Linux|FreeBSD)
2018-03-31 03:16:33 +00:00
set_property(TARGET ccls APPEND PROPERTY
INSTALL_RPATH $ORIGIN/../lib)
elseif(${CMAKE_SYSTEM_NAME} STREQUAL Darwin)
2018-03-31 03:16:33 +00:00
set_property(TARGET ccls APPEND PROPERTY
2018-03-22 05:01:21 +00:00
INSTALL_RPATH @loader_path/../lib)
endif()
2018-03-22 05:01:21 +00:00
file(GLOB LIBCLANG_PLUS_SYMLINKS
${DOWNLOADED_CLANG_DIR}/lib/libclang.[so,dylib]*)
install(FILES ${LIBCLANG_PLUS_SYMLINKS} DESTINATION lib)
endif()
# Allow running from build Windows by copying libclang.dll to build directory
2018-04-15 17:21:26 +00:00
if(NOT SYSTEM_CLANG AND ${CMAKE_SYSTEM_NAME} STREQUAL Windows)
add_custom_command(TARGET ccls
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${DOWNLOADED_CLANG_DIR}/bin/libclang.dll
$<TARGET_FILE_DIR:ccls>
COMMENT "Copying libclang.dll to build directory ...")
endif()
### Tools
# We use glob here since source files are already manually added with
# target_sources further down
file(GLOB SOURCES src/*.cc src/*.h src/serializers/*.cc src/serializers/*.h
src/messages/*.h src/messages/*.cc)
### Sources
2018-03-31 03:16:33 +00:00
target_sources(ccls PRIVATE third_party/siphash.cc)
2018-03-31 03:16:33 +00:00
target_sources(ccls PRIVATE
src/clang_complete.cc
2018-05-28 00:50:02 +00:00
src/clang_tu.cc
src/clang_utils.cc
2018-03-31 20:59:27 +00:00
src/config.cc
src/diagnostics_publisher.cc
src/file_consumer.cc
2018-04-08 00:10:54 +00:00
src/filesystem.cc
src/fuzzy_match.cc
src/main.cc
src/include_complete.cc
2018-05-28 00:50:02 +00:00
src/indexer.cc
2018-03-22 05:01:21 +00:00
src/method.cc
2018-05-05 03:40:52 +00:00
src/language.cc
2018-05-27 19:24:56 +00:00
src/log.cc
src/lsp.cc
src/match.cc
src/message_handler.cc
2018-05-27 19:24:56 +00:00
src/pipeline.cc
src/platform_posix.cc
src/platform_win.cc
src/position.cc
src/project.cc
src/query_utils.cc
src/query.cc
src/serializer.cc
src/test.cc
src/third_party_impl.cc
src/utils.cc
src/working_files.cc)
2018-03-31 03:16:33 +00:00
target_sources(ccls PRIVATE
src/messages/ccls_base.cc
src/messages/ccls_call_hierarchy.cc
src/messages/ccls_callers.cc
src/messages/ccls_file_info.cc
src/messages/ccls_freshen_index.cc
src/messages/ccls_inheritance_hierarchy.cc
src/messages/ccls_member_hierarchy.cc
src/messages/ccls_vars.cc
src/messages/exit.cc
src/messages/initialize.cc
src/messages/shutdown.cc
src/messages/text_document_code_lens.cc
src/messages/text_document_completion.cc
src/messages/text_document_definition.cc
src/messages/text_document_did_change.cc
src/messages/text_document_did_close.cc
src/messages/text_document_did_open.cc
src/messages/text_document_did_save.cc
src/messages/text_document_document_highlight.cc
src/messages/text_document_document_symbol.cc
src/messages/text_document_hover.cc
2018-05-09 05:01:58 +00:00
src/messages/text_document_implementation.cc
src/messages/text_document_references.cc
src/messages/text_document_rename.cc
src/messages/text_document_signature_help.cc
src/messages/text_document_type_definition.cc
src/messages/workspace_did_change_configuration.cc
src/messages/workspace_did_change_watched_files.cc
2018-03-31 03:16:33 +00:00
src/messages/workspace_symbol.cc
)