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
4 # Please also see clang/tools/libclang/libclang.map
6 # This option defaults to CLANG_FORCE_MATCHING_LIBCLANG_SOVERSION
7 # to ON - which means that it by default matches CLANG_VERSION_MAJOR
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.
12 set(LIBCLANG_SOVERSION_ARG)
13 if(NOT CLANG_FORCE_MATCHING_LIBCLANG_SOVERSION)
14 set(LIBCLANG_SOVERSION_ARG SOVERSION 13)
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.
27 CIndexCodeCompletion.cpp
30 CIndexInclusionStack.cpp
36 CXIndexDataConsumer.cpp
37 CXCompilationDatabase.cpp
38 CXLoadedDiagnostic.cpp
40 CXStoredDiagnostic.cpp
57 ../../include/clang-c/Index.h
74 if (CLANG_ENABLE_ARCMT)
75 list(APPEND LIBS clangARCMigrate)
79 list(APPEND LIBS ${CMAKE_DL_LIBS})
80 elseif (CLANG_BUILT_STANDALONE)
81 find_library(DL_LIBRARY_PATH dl)
87 option(LIBCLANG_BUILD_STATIC
88 "Build libclang as a static library (in addition to a shared one)" OFF)
90 set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_BINARY_DIR}/libclang-generic.exports)
91 set(LIBCLANG_VERSION_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/libclang.map)
94 # Avoid LNK4197 by not specifying libclang.exports here.
95 # Each functions is exported as "dllexport" in include/clang-c.
97 set(LLVM_EXPORTED_SYMBOL_FILE)
100 if (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})
105 if (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})
114 if(LLVM_ENABLE_PIC OR (WIN32 AND NOT LIBCLANG_BUILD_STATIC))
115 set(ENABLE_SHARED SHARED)
118 if(NOT LLVM_ENABLE_PIC OR LIBCLANG_BUILD_STATIC)
119 set(ENABLE_STATIC STATIC)
122 if (MSVC AND ENABLE_SHARED AND ENABLE_STATIC)
127 set(output_name "libclang")
129 set(output_name "clang")
132 if (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")
138 add_clang_library(libclang ${ENABLE_SHARED} ${ENABLE_STATIC} INSTALL_WITH_TOOLCHAIN
139 OUTPUT_NAME ${output_name}
144 clang-resource-headers
150 ${LLVM_TARGETS_TO_BUILD}
157 foreach(name libclang obj.libclang libclang_static)
159 target_compile_definitions(${name} PUBLIC CINDEX_NO_EXPORTS)
166 set_target_properties(libclang
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)
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}")
178 set_property(TARGET libclang APPEND_STRING PROPERTY
179 LINK_FLAGS ${LIBCLANG_LINK_FLAGS})
181 set_target_properties(libclang
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_"
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")
205 target_link_options(libclang PRIVATE "-Wl,-M,${CMAKE_CURRENT_SOURCE_DIR}/libclang.map")
208 target_link_options(libclang PRIVATE "-Wl,--version-script,${CMAKE_CURRENT_SOURCE_DIR}/libclang.map")
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)
214 set_target_properties(libclang PROPERTIES
215 VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}
216 ${LIBCLANG_SOVERSION_ARG})
220 if(INTERNAL_INSTALL_PREFIX)
221 set(LIBCLANG_HEADERS_INSTALL_DESTINATION "${INTERNAL_INSTALL_PREFIX}/include")
223 set(LIBCLANG_HEADERS_INSTALL_DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
226 install(DIRECTORY ../../include/clang-c
227 COMPONENT libclang-headers
228 DESTINATION "${LIBCLANG_HEADERS_INSTALL_DESTINATION}"
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.
236 add_custom_target(libclang-headers)
237 set_target_properties(libclang-headers PROPERTIES FOLDER "Clang/Resources")
239 if (NOT LLVM_ENABLE_IDE)
240 add_llvm_install_targets(install-libclang-headers
241 COMPONENT libclang-headers)
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.
247 foreach(PythonVersion ${CLANG_PYTHON_BINDINGS_VERSIONS})
249 ${CMAKE_CURRENT_SOURCE_DIR}/../../bindings/python/clang
251 libclang-python-bindings
253 "lib${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages")
255 if(NOT LLVM_ENABLE_IDE)
256 add_custom_target(libclang-python-bindings)
257 add_llvm_install_targets(install-libclang-python-bindings
259 libclang-python-bindings)