1# The SOVERSION should be updated only if a change is made to the libclang 2# ABI, and when it is updated, it should be updated to the current 3# LLVM_VERSION_MAJOR. 4# Please also see clang/tools/libclang/libclang.map 5 6# This option defaults to CLANG_FORCE_MATCHING_LIBCLANG_SOVERSION 7# to ON - which means that it by default matches CLANG_VERSION_MAJOR 8# 9# TODO: This should probably not be a option going forward but we 10# we should commit to a way to do it. But due to getting this out 11# in LLVM 15.x we opted for a option. 12set(LIBCLANG_SOVERSION_ARG) 13if(NOT CLANG_FORCE_MATCHING_LIBCLANG_SOVERSION) 14 set(LIBCLANG_SOVERSION_ARG SOVERSION 13) 15endif() 16 17# TODO: harmonize usage of LIBCLANG_SOVERSION / LIBCLANG_LIBARY_VERSION 18# below; this was added under time-pressure to avoid reverting the 19# better default from LLVM 14 for LLVM 15.0.0-rc3, hence no time 20# to clean up previous inconsistencies. 21 22set(SOURCES 23 ARCMigrate.cpp 24 BuildSystem.cpp 25 CIndex.cpp 26 CIndexCXX.cpp 27 CIndexCodeCompletion.cpp 28 CIndexDiagnostic.cpp 29 CIndexHigh.cpp 30 CIndexInclusionStack.cpp 31 CIndexUSRs.cpp 32 CIndexer.cpp 33 CXComment.cpp 34 CXCursor.cpp 35 CXExtractAPI.cpp 36 CXIndexDataConsumer.cpp 37 CXCompilationDatabase.cpp 38 CXLoadedDiagnostic.cpp 39 CXSourceLocation.cpp 40 CXStoredDiagnostic.cpp 41 CXString.cpp 42 CXType.cpp 43 Indexing.cpp 44 FatalErrorHandler.cpp 45 Rewrite.cpp 46 47 ADDITIONAL_HEADERS 48 CIndexDiagnostic.h 49 CIndexer.h 50 CXCursor.h 51 CXLoadedDiagnostic.h 52 CXSourceLocation.h 53 CXString.h 54 CXTranslationUnit.h 55 CXType.h 56 Index_Internal.h 57 ../../include/clang-c/Index.h 58 ) 59 60set(LIBS 61 clangAST 62 clangBasic 63 clangDriver 64 clangExtractAPI 65 clangFrontend 66 clangIndex 67 clangLex 68 clangRewrite 69 clangSema 70 clangSerialization 71 clangTooling 72) 73 74if (CLANG_ENABLE_ARCMT) 75 list(APPEND LIBS clangARCMigrate) 76endif () 77 78if (HAVE_LIBDL) 79 list(APPEND LIBS ${CMAKE_DL_LIBS}) 80elseif (CLANG_BUILT_STANDALONE) 81 find_library(DL_LIBRARY_PATH dl) 82 if (DL_LIBRARY_PATH) 83 list(APPEND LIBS dl) 84 endif () 85endif () 86 87option(LIBCLANG_BUILD_STATIC 88 "Build libclang as a static library (in addition to a shared one)" OFF) 89 90set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_BINARY_DIR}/libclang-generic.exports) 91set(LIBCLANG_VERSION_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/libclang.map) 92 93if(MSVC) 94 # Avoid LNK4197 by not specifying libclang.exports here. 95 # Each functions is exported as "dllexport" in include/clang-c. 96 # KB835326 97 set(LLVM_EXPORTED_SYMBOL_FILE) 98endif() 99 100if (UNIX AND NOT APPLE AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "AIX") 101 set(LLVM_EXPORTED_SYMBOL_FILE) 102 set(USE_VERSION_SCRIPT ${LLVM_HAVE_LINK_VERSION_SCRIPT}) 103endif() 104 105if (LLVM_EXPORTED_SYMBOL_FILE) 106 add_custom_command(OUTPUT ${LLVM_EXPORTED_SYMBOL_FILE} 107 COMMAND "${Python3_EXECUTABLE}" 108 ARGS ${CMAKE_CURRENT_SOURCE_DIR}/linker-script-to-export-list.py 109 ${LIBCLANG_VERSION_SCRIPT_FILE} 110 ${LLVM_EXPORTED_SYMBOL_FILE} 111 DEPENDS ${LIBCLANG_VERSION_SCRIPT_FILE}) 112endif() 113 114if(LLVM_ENABLE_PIC OR (WIN32 AND NOT LIBCLANG_BUILD_STATIC)) 115 set(ENABLE_SHARED SHARED) 116endif() 117 118if(NOT LLVM_ENABLE_PIC OR LIBCLANG_BUILD_STATIC) 119 set(ENABLE_STATIC STATIC) 120endif() 121 122if (MSVC AND ENABLE_SHARED AND ENABLE_STATIC) 123 unset(ENABLE_STATIC) 124endif() 125 126if(MSVC) 127 set(output_name "libclang") 128else() 129 set(output_name "clang") 130endif() 131 132if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX") 133 set(CMAKE_AIX_EXPORT_ALL_SYMBOLS OFF) 134 # libclang requires headers which need _ALL_SOURCE to build on AIX 135 remove_definitions("-D_XOPEN_SOURCE=700") 136endif() 137 138add_clang_library(libclang ${ENABLE_SHARED} ${ENABLE_STATIC} INSTALL_WITH_TOOLCHAIN 139 OUTPUT_NAME ${output_name} 140 ${SOURCES} 141 142 DEPENDS 143 ClangDriverOptions 144 clang-resource-headers 145 146 LINK_LIBS 147 ${LIBS} 148 149 LINK_COMPONENTS 150 ${LLVM_TARGETS_TO_BUILD} 151 Core 152 Support 153 TargetParser 154 ) 155 156if(ENABLE_STATIC) 157 foreach(name libclang obj.libclang libclang_static) 158 if (TARGET ${name}) 159 target_compile_definitions(${name} PUBLIC CINDEX_NO_EXPORTS) 160 endif() 161 endforeach() 162endif() 163 164if(ENABLE_SHARED) 165 if(WIN32) 166 set_target_properties(libclang 167 PROPERTIES 168 VERSION ${LIBCLANG_LIBRARY_VERSION} 169 DEFINE_SYMBOL _CINDEX_LIB_) 170 # Avoid declaring clang c++ symbols that are statically linked into libclang as dllimport'ed. 171 # If llvm/libclang-cpp dll is also being built for windows clang c++ symbols will still be 172 # implicitly be exported from libclang. 173 target_compile_definitions(libclang PRIVATE CLANG_BUILD_STATIC) 174 elseif(APPLE) 175 set(LIBCLANG_LINK_FLAGS " -Wl,-compatibility_version -Wl,1") 176 set(LIBCLANG_LINK_FLAGS "${LIBCLANG_LINK_FLAGS} -Wl,-current_version -Wl,${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}") 177 178 set_property(TARGET libclang APPEND_STRING PROPERTY 179 LINK_FLAGS ${LIBCLANG_LINK_FLAGS}) 180 else() 181 set_target_properties(libclang 182 PROPERTIES 183 VERSION ${LIBCLANG_LIBRARY_VERSION} 184 DEFINE_SYMBOL _CINDEX_LIB_) 185 # FIXME: _CINDEX_LIB_ affects dllexport/dllimport on Win32. 186 if(LLVM_ENABLE_MODULES AND NOT WIN32) 187 target_compile_options(libclang PRIVATE 188 "-fmodules-ignore-macro=_CINDEX_LIB_" 189 ) 190 endif() 191 endif() 192 if (USE_VERSION_SCRIPT) 193 if (${CMAKE_SYSTEM_NAME} MATCHES "SunOS") 194 include(CheckLinkerFlag) 195 # The Solaris 11.4 linker supports a subset of GNU ld version scripts, 196 # but requires a special option to enable it. 197 check_linker_flag(CXX "-Wl,-z,gnu-version-script-compat" 198 LINKER_SUPPORTS_Z_GNU_VERSION_SCRIPT_COMPAT) 199 # Older Solaris (and illumos) linker does not support GNU ld version scripts 200 # and does not support GNU version script compat. 201 if (LINKER_SUPPORTS_Z_GNU_VERSION_SCRIPT_COMPAT) 202 target_link_options(libclang PRIVATE "-Wl,--version-script,${CMAKE_CURRENT_SOURCE_DIR}/libclang.map") 203 target_link_options(libclang PRIVATE "-Wl,-z,gnu-version-script-compat") 204 else() 205 target_link_options(libclang PRIVATE "-Wl,-M,${CMAKE_CURRENT_SOURCE_DIR}/libclang.map") 206 endif() 207 else() 208 target_link_options(libclang PRIVATE "-Wl,--version-script,${CMAKE_CURRENT_SOURCE_DIR}/libclang.map") 209 endif() 210 # Ensure that libclang.so gets rebuilt when the linker script changes. 211 set_property(SOURCE ARCMigrate.cpp APPEND PROPERTY 212 OBJECT_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/libclang.map) 213 214 set_target_properties(libclang PROPERTIES 215 VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX} 216 ${LIBCLANG_SOVERSION_ARG}) 217 endif() 218endif() 219 220if(INTERNAL_INSTALL_PREFIX) 221 set(LIBCLANG_HEADERS_INSTALL_DESTINATION "${INTERNAL_INSTALL_PREFIX}/include") 222else() 223 set(LIBCLANG_HEADERS_INSTALL_DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") 224endif() 225 226install(DIRECTORY ../../include/clang-c 227 COMPONENT libclang-headers 228 DESTINATION "${LIBCLANG_HEADERS_INSTALL_DESTINATION}" 229 FILES_MATCHING 230 PATTERN "*.h" 231 ) 232 233# LLVM_DISTRIBUTION_COMPONENTS requires that each component have both a 234# component and an install-component target, so add a dummy libclang-headers 235# target to allow using it in LLVM_DISTRIBUTION_COMPONENTS. 236add_custom_target(libclang-headers) 237set_target_properties(libclang-headers PROPERTIES FOLDER "Clang/Resources") 238 239if (NOT LLVM_ENABLE_IDE) 240 add_llvm_install_targets(install-libclang-headers 241 COMPONENT libclang-headers) 242endif() 243 244# Create a target to install the python bindings to make them easier to 245# distribute. Since the bindings are over libclang, which is installed 246# unbundled to the clang version, follow suit. 247foreach(PythonVersion ${CLANG_PYTHON_BINDINGS_VERSIONS}) 248 install(DIRECTORY 249 ${CMAKE_CURRENT_SOURCE_DIR}/../../bindings/python/clang 250 COMPONENT 251 libclang-python-bindings 252 DESTINATION 253 "lib${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages") 254endforeach() 255if(NOT LLVM_ENABLE_IDE) 256 add_custom_target(libclang-python-bindings) 257 add_llvm_install_targets(install-libclang-python-bindings 258 COMPONENT 259 libclang-python-bindings) 260endif() 261 262