mirror of
				https://github.com/MaskRay/ccls.git
				synced 2025-11-03 22:04:24 +00:00 
			
		
		
		
	cmake: delete SYSTEM_CLANG and auto-download mechanism
This commit is contained in:
		
							parent
							
								
									343fa74dc1
								
							
						
					
					
						commit
						9bbb288b57
					
				@ -15,7 +15,7 @@ install:
 | 
			
		||||
  - 7z x llvm.tar
 | 
			
		||||
  - git submodule update --init --recursive
 | 
			
		||||
build_script:
 | 
			
		||||
  - cmake -G"Visual Studio 15 2017 Win64" -H. -Bbuild -DCMAKE_BUILD_TYPE=Release -DSYSTEM_CLANG=ON -DCLANG_ROOT=C:\projects\ccls\llvm+clang-7.0.0-win64-msvc-release
 | 
			
		||||
  - cmake -G"Visual Studio 15 2017 Win64" -H. -Bbuild -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=C:\projects\ccls\llvm+clang-7.0.0-win64-msvc-release
 | 
			
		||||
  - cmake --build build --target ccls --config Release
 | 
			
		||||
 | 
			
		||||
artifacts:
 | 
			
		||||
 | 
			
		||||
@ -5,13 +5,7 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/)
 | 
			
		||||
include(DefaultCMakeBuildType)
 | 
			
		||||
 | 
			
		||||
# Required 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)
 | 
			
		||||
option(LLVM_ENABLE_RTTI "-fno-rtti if OFF. This should match LLVM libraries" OFF)
 | 
			
		||||
option(CLANG_USE_BUNDLED_LIBC++ "Let Clang use bundled libc++" OFF)
 | 
			
		||||
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
 | 
			
		||||
@ -30,10 +24,7 @@ add_executable(ccls "")
 | 
			
		||||
# Enable C++17 (Required)
 | 
			
		||||
set_property(TARGET ccls PROPERTY CXX_STANDARD 17)
 | 
			
		||||
set_property(TARGET ccls PROPERTY CXX_STANDARD_REQUIRED ON)
 | 
			
		||||
# Disable gnu extensions except for Cygwin which needs them to build properly
 | 
			
		||||
if(NOT CYGWIN)
 | 
			
		||||
set_property(TARGET ccls PROPERTY CXX_EXTENSIONS OFF)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
if(NOT LLVM_ENABLE_RTTI)
 | 
			
		||||
  # releases.llvm.org libraries are compiled with -fno-rtti
 | 
			
		||||
@ -76,37 +67,6 @@ else()
 | 
			
		||||
    target_compile_options(ccls PRIVATE
 | 
			
		||||
                           $<$<CONFIG:Debug>:-fno-limit-debug-info>)
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  if(ASAN)
 | 
			
		||||
    target_compile_options(ccls PRIVATE -fsanitize=address,undefined)
 | 
			
		||||
    # target_link_libraries also takes linker flags
 | 
			
		||||
    target_link_libraries(ccls PRIVATE -fsanitize=address,undefined)
 | 
			
		||||
  endif()
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
### Download Clang if required
 | 
			
		||||
 | 
			
		||||
if(NOT SYSTEM_CLANG)
 | 
			
		||||
  message(STATUS "Using downloaded Clang")
 | 
			
		||||
 | 
			
		||||
  include(DownloadAndExtractClang)
 | 
			
		||||
  download_and_extract_clang(${CLANG_DOWNLOAD_LOCATION})
 | 
			
		||||
  # Used by FindClang
 | 
			
		||||
  set(CLANG_ROOT ${DOWNLOADED_CLANG_DIR})
 | 
			
		||||
 | 
			
		||||
  if(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang AND CLANG_USE_BUNDLED_LIBC++)
 | 
			
		||||
    message(STATUS "Using bundled libc++")
 | 
			
		||||
    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
 | 
			
		||||
    endif()
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
else()
 | 
			
		||||
  message(STATUS "Using system Clang")
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
### Libraries
 | 
			
		||||
@ -143,31 +103,6 @@ target_include_directories(ccls SYSTEM PRIVATE
 | 
			
		||||
 | 
			
		||||
install(TARGETS ccls RUNTIME DESTINATION bin)
 | 
			
		||||
 | 
			
		||||
if(NOT SYSTEM_CLANG AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL Windows)
 | 
			
		||||
 | 
			
		||||
  if(${CMAKE_SYSTEM_NAME} MATCHES Linux|FreeBSD)
 | 
			
		||||
    set_property(TARGET ccls APPEND PROPERTY
 | 
			
		||||
                 INSTALL_RPATH $ORIGIN/../lib)
 | 
			
		||||
  elseif(${CMAKE_SYSTEM_NAME} STREQUAL Darwin)
 | 
			
		||||
    set_property(TARGET ccls APPEND PROPERTY
 | 
			
		||||
                 INSTALL_RPATH @loader_path/../lib)
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  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
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
@ -1 +0,0 @@
 | 
			
		||||
74b197a3959b0408adf0824be01db8dddfa2f9a967f4085af3fad900ed5fdbf6
 | 
			
		||||
@ -1 +0,0 @@
 | 
			
		||||
95ceb933ccf76e3ddaa536f41ab82c442bbac07cdea6f9fbf6e3b13cc1711255
 | 
			
		||||
@ -1 +0,0 @@
 | 
			
		||||
b3ad93c3d69dfd528df9c5bb1a434367babb8f3baea47fbb99bf49f1b03c94ca
 | 
			
		||||
@ -1 +0,0 @@
 | 
			
		||||
5c90e61b06d37270bc26edb305d7e498e2c7be22d99e0afd9f2274ef5458575a
 | 
			
		||||
@ -1 +0,0 @@
 | 
			
		||||
69b85c833cd28ea04ce34002464f10a6ad9656dd2bba0f7133536a9927c660d2
 | 
			
		||||
@ -1,52 +0,0 @@
 | 
			
		||||
# Downloads and extracts the 7-Zip MSI installer from https://www.7-zip.org/. 
 | 
			
		||||
# 
 | 
			
		||||
# Returns the extracted 7-Zip directory in DOWNLOADED_7ZIP_DIR
 | 
			
		||||
function(download_and_extract_7zip 7ZIP_DOWNLOAD_LOCATION)
 | 
			
		||||
 | 
			
		||||
set(7ZIP_VERSION 1801)
 | 
			
		||||
set(7ZIP_EXT .msi)
 | 
			
		||||
set(7ZIP_NAME 7z${7ZIP_VERSION}-x64)
 | 
			
		||||
set(7ZIP_FULL_NAME ${7ZIP_NAME}${7ZIP_EXT})
 | 
			
		||||
 | 
			
		||||
set(7ZIP_FILE ${7ZIP_DOWNLOAD_LOCATION}/${7ZIP_FULL_NAME})
 | 
			
		||||
set(7ZIP_EXTRACT_DIR ${7ZIP_DOWNLOAD_LOCATION}/${7ZIP_NAME})
 | 
			
		||||
set(7ZIP_URL https://www.7-zip.org/a/${7ZIP_FULL_NAME})
 | 
			
		||||
 | 
			
		||||
# Exit if 7-Zip is already downloaded and extracted
 | 
			
		||||
find_program(7ZIP_EXECUTABLE 7z NO_DEFAULT_PATH
 | 
			
		||||
             PATHS ${7ZIP_EXTRACT_DIR}/Files/7-Zip)
 | 
			
		||||
if(7ZIP_EXECUTABLE)
 | 
			
		||||
  message(STATUS "7-Zip already downloaded")
 | 
			
		||||
  return()
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
message(STATUS "Downloading 7-Zip ${7ZIP_VERSION} (${7ZIP_URL}) ...")
 | 
			
		||||
file(DOWNLOAD ${7ZIP_URL} ${7ZIP_FILE})
 | 
			
		||||
 | 
			
		||||
find_program(MSIEXEC_EXECUTABLE msiexec)
 | 
			
		||||
if(NOT MSIEXEC_EXECUTABLE)
 | 
			
		||||
  message(FATAL_ERROR "Unable to find msiexec (required to extract 7-Zip msi \
 | 
			
		||||
installer). Install 7-Zip yourself and make sure it is available in the path")    
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
message(STATUS "Extracting downloaded 7-Zip ...")
 | 
			
		||||
 | 
			
		||||
# msiexec requires Windows path separators (\)
 | 
			
		||||
file(TO_NATIVE_PATH ${7ZIP_FILE} 7ZIP_FILE)
 | 
			
		||||
file(TO_NATIVE_PATH ${7ZIP_EXTRACT_DIR} 7ZIP_EXTRACT_DIR) 
 | 
			
		||||
 | 
			
		||||
# msiexec with /a option allows extraction of msi installers without requiring
 | 
			
		||||
# admin privileges. We use this to extract the 7-Zip installer without
 | 
			
		||||
# requiring any actions from the user
 | 
			
		||||
execute_process(COMMAND ${MSIEXEC_EXECUTABLE} /a ${7ZIP_FILE} /qn
 | 
			
		||||
                        TARGETDIR=${7ZIP_EXTRACT_DIR}
 | 
			
		||||
                WORKING_DIRECTORY ${7ZIP_DOWNLOAD_LOCATION}
 | 
			
		||||
                OUTPUT_QUIET)     
 | 
			
		||||
 | 
			
		||||
# Convert back to CMake separators (/) before returning
 | 
			
		||||
file(TO_CMAKE_PATH ${7ZIP_EXTRACT_DIR} 7ZIP_EXTRACT_DIR)
 | 
			
		||||
 | 
			
		||||
# Actual 7-Zip directory is nested inside the extract directory.
 | 
			
		||||
set(DOWNLOADED_7ZIP_DIR ${7ZIP_EXTRACT_DIR}/Files/7-Zip PARENT_SCOPE)
 | 
			
		||||
 | 
			
		||||
endfunction()
 | 
			
		||||
@ -1,129 +0,0 @@
 | 
			
		||||
# Downloads and extracts the Clang archive for the current system from
 | 
			
		||||
# https://releases.llvm.org
 | 
			
		||||
#
 | 
			
		||||
# Returns the extracted Clang archive directory in DOWNLOADED_CLANG_DIR
 | 
			
		||||
#
 | 
			
		||||
# Downloads 7-Zip to extract Clang if it isn't available in the PATH
 | 
			
		||||
function(download_and_extract_clang CLANG_DOWNLOAD_LOCATION)
 | 
			
		||||
 | 
			
		||||
set(CLANG_VERSION 7.0.0)
 | 
			
		||||
set(CLANG_ARCHIVE_EXT .tar.xz)
 | 
			
		||||
 | 
			
		||||
if(${CMAKE_SYSTEM_NAME} STREQUAL Linux)
 | 
			
		||||
 | 
			
		||||
  # Default to Ubuntu 16.04
 | 
			
		||||
  set(CLANG_ARCHIVE_NAME
 | 
			
		||||
      clang+llvm-${CLANG_VERSION}-x86_64-linux-gnu-ubuntu-16.04)
 | 
			
		||||
 | 
			
		||||
elseif(${CMAKE_SYSTEM_NAME} STREQUAL Darwin)
 | 
			
		||||
 | 
			
		||||
  set(CLANG_ARCHIVE_NAME clang+llvm-${CLANG_VERSION}-x86_64-apple-darwin)
 | 
			
		||||
 | 
			
		||||
elseif(${CMAKE_SYSTEM_NAME} STREQUAL Windows)
 | 
			
		||||
 | 
			
		||||
  set(CLANG_ARCHIVE_NAME LLVM-${CLANG_VERSION}-win64)
 | 
			
		||||
  set(CLANG_ARCHIVE_EXT .exe)
 | 
			
		||||
 | 
			
		||||
elseif(${CMAKE_SYSTEM_NAME} STREQUAL FreeBSD)
 | 
			
		||||
 | 
			
		||||
  set(CLANG_ARCHIVE_NAME clang+llvm-${CLANG_VERSION}-amd64-unknown-freebsd11)
 | 
			
		||||
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
set(CLANG_ARCHIVE_FULL_NAME ${CLANG_ARCHIVE_NAME}${CLANG_ARCHIVE_EXT})
 | 
			
		||||
set(CLANG_ARCHIVE_FILE ${CLANG_DOWNLOAD_LOCATION}/${CLANG_ARCHIVE_FULL_NAME})
 | 
			
		||||
set(CLANG_ARCHIVE_EXTRACT_DIR ${CLANG_DOWNLOAD_LOCATION}/${CLANG_ARCHIVE_NAME})
 | 
			
		||||
set(CLANG_ARCHIVE_URL
 | 
			
		||||
    https://releases.llvm.org/${CLANG_VERSION}/${CLANG_ARCHIVE_FULL_NAME})
 | 
			
		||||
set(CLANG_ARCHIVE_HASH_FILE
 | 
			
		||||
    ${CMAKE_SOURCE_DIR}/clang_archive_hashes/${CLANG_ARCHIVE_FULL_NAME}.SHA256)
 | 
			
		||||
 | 
			
		||||
# Exit if Clang is already downloaded and extracted
 | 
			
		||||
set(CLANG_ROOT ${CLANG_ARCHIVE_EXTRACT_DIR})
 | 
			
		||||
find_package(Clang ${CLANG_VERSION} QUIET)
 | 
			
		||||
if(Clang_FOUND)
 | 
			
		||||
  message(STATUS "Clang already downloaded")
 | 
			
		||||
  set(DOWNLOADED_CLANG_DIR ${CLANG_ARCHIVE_EXTRACT_DIR} PARENT_SCOPE)
 | 
			
		||||
  return()
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
if(NOT CLANG_ARCHIVE_NAME)
 | 
			
		||||
  message(FATAL_ERROR "No Clang archive url specified for current platform \
 | 
			
		||||
(${CMAKE_SYSTEM_NAME}). Please file an issue to get it added.")
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
if(NOT EXISTS ${CLANG_ARCHIVE_HASH_FILE})
 | 
			
		||||
  message(FATAL_ERROR "No SHA256 hash available for the current platform \
 | 
			
		||||
(${CMAKE_SYSTEM_NAME}) + clang version (${CLANG_VERSION}) combination. Please \
 | 
			
		||||
file an issue to get it added.")
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
# Download Clang archive
 | 
			
		||||
message(STATUS "Downloading Clang ${CLANG_VERSION} (${CLANG_ARCHIVE_URL}) ...")
 | 
			
		||||
file(DOWNLOAD ${CLANG_ARCHIVE_URL} ${CLANG_ARCHIVE_FILE}
 | 
			
		||||
     STATUS CLANG_ARCHIVE_DOWNLOAD_RESULT)
 | 
			
		||||
 | 
			
		||||
# Abort if download failed
 | 
			
		||||
list(GET ${CLANG_ARCHIVE_DOWNLOAD_RESULT} 0 ERROR_CODE)
 | 
			
		||||
if(${ERROR_CODE})
 | 
			
		||||
  list(GET ${CLANG_ARCHIVE_DOWNLOAD_RESULT} 1 ERROR_STRING)
 | 
			
		||||
  message(FATAL_ERROR ${ERROR_STRING})
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
# Retrieve expected hash from file and strip newline
 | 
			
		||||
file(READ ${CLANG_ARCHIVE_HASH_FILE} CLANG_ARCHIVE_EXPECTED_HASH)
 | 
			
		||||
string(STRIP ${CLANG_ARCHIVE_EXPECTED_HASH} CLANG_ARCHIVE_EXPECTED_HASH)
 | 
			
		||||
# Calculate actual hash
 | 
			
		||||
file(SHA256 ${CLANG_ARCHIVE_FILE} CLANG_ARCHIVE_HASH)
 | 
			
		||||
# Abort if hashes do not match
 | 
			
		||||
if(NOT ${CLANG_ARCHIVE_EXPECTED_HASH} STREQUAL ${CLANG_ARCHIVE_HASH})
 | 
			
		||||
  message(FATAL_ERROR "SHA256 hash of downloaded Clang does not match \
 | 
			
		||||
expected hash. Remove the build directory and try running CMake again. If this \
 | 
			
		||||
keeps happening, file an issue to report the problem.")
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
if(${CLANG_ARCHIVE_EXT} STREQUAL .exe)
 | 
			
		||||
  # Download and extract 7-zip if not found in PATH
 | 
			
		||||
  find_program(7ZIP_EXECUTABLE 7z)
 | 
			
		||||
  if(NOT 7ZIP_EXECUTABLE)
 | 
			
		||||
    message(STATUS "7-Zip not found in PATH")
 | 
			
		||||
 | 
			
		||||
    include(DownloadAndExtract7zip)
 | 
			
		||||
    download_and_extract_7zip(${CLANG_DOWNLOAD_LOCATION})
 | 
			
		||||
    find_program(7ZIP_EXECUTABLE
 | 
			
		||||
      NAMES 7z
 | 
			
		||||
      NO_DEFAULT_PATH
 | 
			
		||||
      PATHS ${DOWNLOADED_7ZIP_DIR}
 | 
			
		||||
    )
 | 
			
		||||
  else()
 | 
			
		||||
    message(STATUS "7-Zip found in PATH")
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  message(STATUS "Extracting downloaded Clang with 7-Zip ...")
 | 
			
		||||
 | 
			
		||||
  # Avoid running the Clang installer by extracting the exe with 7-Zip
 | 
			
		||||
  execute_process(
 | 
			
		||||
    COMMAND ${7ZIP_EXECUTABLE} x 
 | 
			
		||||
            -o${CLANG_ARCHIVE_EXTRACT_DIR} 
 | 
			
		||||
            -xr!$PLUGINSDIR ${CLANG_ARCHIVE_FILE}
 | 
			
		||||
    WORKING_DIRECTORY ${CLANG_DOWNLOAD_LOCATION}
 | 
			
		||||
    OUTPUT_QUIET
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
elseif(${CLANG_ARCHIVE_EXT} STREQUAL .tar.xz)
 | 
			
		||||
  message(STATUS "Extracting downloaded Clang with CMake built-in tar ...")
 | 
			
		||||
 | 
			
		||||
  # CMake has builtin support for tar via the -E flag
 | 
			
		||||
  execute_process(
 | 
			
		||||
    COMMAND ${CMAKE_COMMAND} -E tar -xf ${CLANG_ARCHIVE_FILE}
 | 
			
		||||
    # Specify working directory to allow running cmake from 
 | 
			
		||||
    # everywhere
 | 
			
		||||
    # (example: cmake -H"$HOME/cquery" -B"$home/cquery/build")
 | 
			
		||||
    WORKING_DIRECTORY ${CLANG_DOWNLOAD_LOCATION}
 | 
			
		||||
    OUTPUT_QUIET
 | 
			
		||||
  )
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
set(DOWNLOADED_CLANG_DIR ${CLANG_ARCHIVE_EXTRACT_DIR} PARENT_SCOPE)
 | 
			
		||||
 | 
			
		||||
endfunction()
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user