xref: /llvm-project/clang/tools/libclang/CMakeLists.txt (revision 09fa2f012fccb6f1cf2f540856e67f55431da800)
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