[libclang] Migrate away from PointerUnion::dyn_cast (NFC) (#125381)
[llvm-project.git] / clang / tools / libclang / CMakeLists.txt
blob299c14660f3d4c719c9b1ebb90fccd28b8cf70a5
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
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)
15 endif()
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.
22 set(SOURCES
23   BuildSystem.cpp
24   CIndex.cpp
25   CIndexCXX.cpp
26   CIndexCodeCompletion.cpp
27   CIndexDiagnostic.cpp
28   CIndexHigh.cpp
29   CIndexInclusionStack.cpp
30   CIndexUSRs.cpp
31   CIndexer.cpp
32   CXComment.cpp
33   CXCursor.cpp
34   CXExtractAPI.cpp
35   CXIndexDataConsumer.cpp
36   CXCompilationDatabase.cpp
37   CXLoadedDiagnostic.cpp
38   CXSourceLocation.cpp
39   CXStoredDiagnostic.cpp
40   CXString.cpp
41   CXType.cpp
42   Indexing.cpp
43   FatalErrorHandler.cpp
44   Rewrite.cpp
46   ADDITIONAL_HEADERS
47   CIndexDiagnostic.h
48   CIndexer.h
49   CXCursor.h
50   CXLoadedDiagnostic.h
51   CXSourceLocation.h
52   CXString.h
53   CXTranslationUnit.h
54   CXType.h
55   Index_Internal.h
56   ../../include/clang-c/Index.h
57   )
59 set(LIBS
60   clangAST
61   clangBasic
62   clangDriver
63   clangExtractAPI
64   clangFrontend
65   clangIndex
66   clangLex
67   clangRewrite
68   clangSema
69   clangSerialization
70   clangTooling
73 if (HAVE_LIBDL)
74   list(APPEND LIBS ${CMAKE_DL_LIBS})
75 elseif (CLANG_BUILT_STANDALONE)
76   find_library(DL_LIBRARY_PATH dl)
77   if (DL_LIBRARY_PATH)
78     list(APPEND LIBS dl)
79   endif ()
80 endif ()
82 option(LIBCLANG_BUILD_STATIC
83   "Build libclang as a static library (in addition to a shared one)" OFF)
85 set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_BINARY_DIR}/libclang-generic.exports)
86 set(LIBCLANG_VERSION_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/libclang.map)
88 if(MSVC)
89   # Avoid LNK4197 by not specifying libclang.exports here.
90   # Each functions is exported as "dllexport" in include/clang-c.
91   # KB835326
92   set(LLVM_EXPORTED_SYMBOL_FILE)
93 endif()
95 if (UNIX AND NOT APPLE AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
96   set(LLVM_EXPORTED_SYMBOL_FILE)
97   set(USE_VERSION_SCRIPT ${LLVM_HAVE_LINK_VERSION_SCRIPT})
98 endif()
100 if (LLVM_EXPORTED_SYMBOL_FILE)
101   add_custom_command(OUTPUT ${LLVM_EXPORTED_SYMBOL_FILE}
102                      COMMAND "${Python3_EXECUTABLE}"
103                        ARGS ${CMAKE_CURRENT_SOURCE_DIR}/linker-script-to-export-list.py
104                             ${LIBCLANG_VERSION_SCRIPT_FILE}
105                             ${LLVM_EXPORTED_SYMBOL_FILE}
106                      DEPENDS ${LIBCLANG_VERSION_SCRIPT_FILE})
107 endif()
109 if(LLVM_ENABLE_PIC OR (WIN32 AND NOT LIBCLANG_BUILD_STATIC))
110   set(ENABLE_SHARED SHARED)
111 endif()
113 if(NOT LLVM_ENABLE_PIC OR LIBCLANG_BUILD_STATIC)
114   set(ENABLE_STATIC STATIC)
115 endif()
117 if (MSVC AND ENABLE_SHARED AND ENABLE_STATIC)
118   unset(ENABLE_STATIC)
119 endif()
121 if(MSVC)
122   set(output_name "libclang")
123 else()
124   set(output_name "clang")
125 endif()
127 if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
128     set(CMAKE_AIX_EXPORT_ALL_SYMBOLS OFF)
129     # libclang requires headers which need _ALL_SOURCE to build on AIX
130     remove_definitions("-D_XOPEN_SOURCE=700")
131 endif()
133 add_clang_library(libclang ${ENABLE_SHARED} ${ENABLE_STATIC} INSTALL_WITH_TOOLCHAIN
134   OUTPUT_NAME ${output_name}
135   ${SOURCES}
137   DEPENDS
138   ClangDriverOptions
139   clang-resource-headers
141   LINK_LIBS
142   ${LIBS}
144   LINK_COMPONENTS
145   ${LLVM_TARGETS_TO_BUILD}
146   Core
147   Support
148   TargetParser
149   )
151 if(ENABLE_STATIC)
152   foreach(name libclang obj.libclang libclang_static)
153     if (TARGET ${name})
154       target_compile_definitions(${name} PUBLIC CINDEX_NO_EXPORTS)
155     endif()
156   endforeach()
157 endif()
159 if(ENABLE_SHARED)
160   if(WIN32)
161     set_target_properties(libclang
162       PROPERTIES
163       VERSION ${LIBCLANG_LIBRARY_VERSION}
164       DEFINE_SYMBOL _CINDEX_LIB_)
165       # Avoid declaring clang c++ symbols that are statically linked into libclang as dllimport'ed.
166       # If llvm/libclang-cpp dll is also being built for windows clang c++ symbols will still be
167       # implicitly be exported from libclang.
168       target_compile_definitions(libclang PRIVATE CLANG_BUILD_STATIC)
169   elseif(APPLE)
170     set(LIBCLANG_LINK_FLAGS " -Wl,-compatibility_version -Wl,1")
171     set(LIBCLANG_LINK_FLAGS "${LIBCLANG_LINK_FLAGS} -Wl,-current_version -Wl,${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}")
173     set_property(TARGET libclang APPEND_STRING PROPERTY
174                  LINK_FLAGS ${LIBCLANG_LINK_FLAGS})
175   else()
176     set_target_properties(libclang
177       PROPERTIES
178       VERSION ${LIBCLANG_LIBRARY_VERSION}
179       DEFINE_SYMBOL _CINDEX_LIB_)
180     # FIXME: _CINDEX_LIB_ affects dllexport/dllimport on Win32.
181     if(LLVM_ENABLE_MODULES AND NOT WIN32)
182       target_compile_options(libclang PRIVATE
183         "-fmodules-ignore-macro=_CINDEX_LIB_"
184         )
185     endif()
186   endif()
187   if (USE_VERSION_SCRIPT)
188     if (${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
189       include(CheckLinkerFlag)
190       # The Solaris 11.4 linker supports a subset of GNU ld version scripts,
191       # but requires a special option to enable it.
192       check_linker_flag(CXX "-Wl,-z,gnu-version-script-compat"
193                         LINKER_SUPPORTS_Z_GNU_VERSION_SCRIPT_COMPAT)
194       # Older Solaris (and illumos) linker does not support GNU ld version scripts
195       # and does not support GNU version script compat.
196       if (LINKER_SUPPORTS_Z_GNU_VERSION_SCRIPT_COMPAT)
197         target_link_options(libclang PRIVATE "-Wl,--version-script,${CMAKE_CURRENT_SOURCE_DIR}/libclang.map")
198         target_link_options(libclang PRIVATE "-Wl,-z,gnu-version-script-compat")
199       else()
200         target_link_options(libclang PRIVATE "-Wl,-M,${CMAKE_CURRENT_SOURCE_DIR}/libclang.map")
201       endif()
202     else()
203       target_link_options(libclang PRIVATE "-Wl,--version-script,${CMAKE_CURRENT_SOURCE_DIR}/libclang.map")
204     endif()
205     # Ensure that libclang.so gets rebuilt when the linker script changes.
206     set_target_properties(libclang PROPERTIES
207                           VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}
208                           ${LIBCLANG_SOVERSION_ARG})
209   endif()
210 endif()
212 if(INTERNAL_INSTALL_PREFIX)
213   set(LIBCLANG_HEADERS_INSTALL_DESTINATION "${INTERNAL_INSTALL_PREFIX}/include")
214 else()
215   set(LIBCLANG_HEADERS_INSTALL_DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
216 endif()
218 install(DIRECTORY ../../include/clang-c
219   COMPONENT libclang-headers
220   DESTINATION "${LIBCLANG_HEADERS_INSTALL_DESTINATION}"
221   FILES_MATCHING
222   PATTERN "*.h"
223   )
225 # LLVM_DISTRIBUTION_COMPONENTS requires that each component have both a
226 # component and an install-component target, so add a dummy libclang-headers
227 # target to allow using it in LLVM_DISTRIBUTION_COMPONENTS.
228 add_custom_target(libclang-headers)
229 set_target_properties(libclang-headers PROPERTIES FOLDER "Clang/Resources")
231 if (NOT LLVM_ENABLE_IDE)
232   add_llvm_install_targets(install-libclang-headers
233                            COMPONENT libclang-headers)
234 endif()
236 # Create a target to install the python bindings to make them easier to
237 # distribute.  Since the bindings are over libclang, which is installed
238 # unbundled to the clang version, follow suit.
239 foreach(PythonVersion ${CLANG_PYTHON_BINDINGS_VERSIONS})
240   install(DIRECTORY
241             ${CMAKE_CURRENT_SOURCE_DIR}/../../bindings/python/clang
242           COMPONENT
243             libclang-python-bindings
244           DESTINATION
245             "lib${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages")
246 endforeach()
247 if(NOT LLVM_ENABLE_IDE)
248   add_custom_target(libclang-python-bindings)
249   add_llvm_install_targets(install-libclang-python-bindings
250                            COMPONENT
251                              libclang-python-bindings)
252 endif()