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
5set(CLANG_SONAME 13)
6
7set(SOURCES
8  ARCMigrate.cpp
9  BuildSystem.cpp
10  CIndex.cpp
11  CIndexCXX.cpp
12  CIndexCodeCompletion.cpp
13  CIndexDiagnostic.cpp
14  CIndexHigh.cpp
15  CIndexInclusionStack.cpp
16  CIndexUSRs.cpp
17  CIndexer.cpp
18  CXComment.cpp
19  CXCursor.cpp
20  CXIndexDataConsumer.cpp
21  CXCompilationDatabase.cpp
22  CXLoadedDiagnostic.cpp
23  CXSourceLocation.cpp
24  CXStoredDiagnostic.cpp
25  CXString.cpp
26  CXType.cpp
27  Indexing.cpp
28  FatalErrorHandler.cpp
29  Rewrite.cpp
30
31  ADDITIONAL_HEADERS
32  CIndexDiagnostic.h
33  CIndexer.h
34  CXCursor.h
35  CXLoadedDiagnostic.h
36  CXSourceLocation.h
37  CXString.h
38  CXTranslationUnit.h
39  CXType.h
40  Index_Internal.h
41  ../../include/clang-c/Index.h
42  )
43
44set(LIBS
45  clangAST
46  clangBasic
47  clangDriver
48  clangFrontend
49  clangIndex
50  clangLex
51  clangRewrite
52  clangSema
53  clangSerialization
54  clangTooling
55)
56
57if (CLANG_ENABLE_ARCMT)
58  list(APPEND LIBS clangARCMigrate)
59endif ()
60
61if (HAVE_LIBDL)
62  list(APPEND LIBS ${CMAKE_DL_LIBS})
63elseif (CLANG_BUILT_STANDALONE)
64  find_library(DL_LIBRARY_PATH dl)
65  if (DL_LIBRARY_PATH)
66    list(APPEND LIBS dl)
67  endif ()
68endif ()
69
70option(LIBCLANG_BUILD_STATIC
71  "Build libclang as a static library (in addition to a shared one)" OFF)
72
73set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_BINARY_DIR}/libclang-generic.exports)
74set(LIBCLANG_VERSION_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/libclang.map)
75
76if(MSVC)
77  # Avoid LNK4197 by not specifying libclang.exports here.
78  # Each functions is exported as "dllexport" in include/clang-c.
79  # KB835326
80  set(LLVM_EXPORTED_SYMBOL_FILE)
81endif()
82
83if (UNIX AND NOT APPLE)
84  set(LLVM_EXPORTED_SYMBOL_FILE)
85  set(USE_VERSION_SCRIPT ${LLVM_HAVE_LINK_VERSION_SCRIPT})
86endif()
87
88if (LLVM_EXPORTED_SYMBOL_FILE)
89  add_custom_command(OUTPUT ${LLVM_EXPORTED_SYMBOL_FILE}
90                     COMMAND "${Python3_EXECUTABLE}"
91                       ARGS ${CMAKE_CURRENT_SOURCE_DIR}/linker-script-to-export-list.py
92                            ${LIBCLANG_VERSION_SCRIPT_FILE}
93                            ${LLVM_EXPORTED_SYMBOL_FILE}
94                     DEPENDS ${LIBCLANG_VERSION_SCRIPT_FILE})
95endif()
96
97if(LLVM_ENABLE_PIC OR (WIN32 AND NOT LIBCLANG_BUILD_STATIC))
98  set(ENABLE_SHARED SHARED)
99endif()
100
101if(NOT LLVM_ENABLE_PIC OR LIBCLANG_BUILD_STATIC)
102  set(ENABLE_STATIC STATIC)
103endif()
104
105if (MSVC AND ENABLE_SHARED AND ENABLE_STATIC)
106  unset(ENABLE_STATIC)
107endif()
108
109if(MSVC)
110  set(output_name "libclang")
111else()
112  set(output_name "clang")
113endif()
114
115# libclang requires headers which need _ALL_SOURCE to build on AIX
116if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
117    remove_definitions("-D_XOPEN_SOURCE=700")
118endif()
119
120add_clang_library(libclang ${ENABLE_SHARED} ${ENABLE_STATIC} INSTALL_WITH_TOOLCHAIN
121  OUTPUT_NAME ${output_name}
122  ${SOURCES}
123
124  DEPENDS
125  ClangDriverOptions
126  clang-resource-headers
127
128  LINK_LIBS
129  ${LIBS}
130
131  LINK_COMPONENTS
132  ${LLVM_TARGETS_TO_BUILD}
133  Core
134  Support
135  )
136
137if(ENABLE_STATIC)
138  foreach(name libclang obj.libclang libclang_static)
139    if (TARGET ${name})
140      target_compile_definitions(${name} PUBLIC CINDEX_NO_EXPORTS)
141    endif()
142  endforeach()
143endif()
144
145if(ENABLE_SHARED)
146  if(WIN32)
147    set_target_properties(libclang
148      PROPERTIES
149      VERSION ${LIBCLANG_LIBRARY_VERSION}
150      DEFINE_SYMBOL _CINDEX_LIB_)
151  elseif(APPLE)
152    set(LIBCLANG_LINK_FLAGS " -Wl,-compatibility_version -Wl,1")
153    set(LIBCLANG_LINK_FLAGS "${LIBCLANG_LINK_FLAGS} -Wl,-current_version -Wl,${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}")
154
155    set_property(TARGET libclang APPEND_STRING PROPERTY
156                 LINK_FLAGS ${LIBCLANG_LINK_FLAGS})
157  else()
158    set_target_properties(libclang
159      PROPERTIES
160      VERSION ${LIBCLANG_LIBRARY_VERSION}
161      DEFINE_SYMBOL _CINDEX_LIB_)
162    # FIXME: _CINDEX_LIB_ affects dllexport/dllimport on Win32.
163    if(LLVM_ENABLE_MODULES AND NOT WIN32)
164      target_compile_options(libclang PRIVATE
165        "-fmodules-ignore-macro=_CINDEX_LIB_"
166        )
167    endif()
168  endif()
169  if (USE_VERSION_SCRIPT)
170    target_link_options(libclang PRIVATE "-Wl,--version-script,${CMAKE_CURRENT_SOURCE_DIR}/libclang.map")
171    # The Solaris 11.4 linker supports a subset of GNU ld version scripts,
172    # but requires a special option to enable it.
173    if (${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
174      target_link_options(libclang PRIVATE "-Wl,-z,gnu-version-script-compat")
175    endif()
176    # Ensure that libclang.so gets rebuilt when the linker script changes.
177    set_property(SOURCE ARCMigrate.cpp APPEND PROPERTY
178                 OBJECT_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/libclang.map)
179
180    set_target_properties(libclang PROPERTIES
181                          VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}
182                          SOVERSION ${CLANG_SONAME})
183  endif()
184endif()
185
186if(INTERNAL_INSTALL_PREFIX)
187  set(LIBCLANG_HEADERS_INSTALL_DESTINATION "${INTERNAL_INSTALL_PREFIX}/include")
188else()
189  set(LIBCLANG_HEADERS_INSTALL_DESTINATION include)
190endif()
191
192install(DIRECTORY ../../include/clang-c
193  COMPONENT libclang-headers
194  DESTINATION "${LIBCLANG_HEADERS_INSTALL_DESTINATION}"
195  FILES_MATCHING
196  PATTERN "*.h"
197  )
198
199# LLVM_DISTRIBUTION_COMPONENTS requires that each component have both a
200# component and an install-component target, so add a dummy libclang-headers
201# target to allow using it in LLVM_DISTRIBUTION_COMPONENTS.
202add_custom_target(libclang-headers)
203set_target_properties(libclang-headers PROPERTIES FOLDER "Misc")
204
205if (NOT LLVM_ENABLE_IDE)
206  add_llvm_install_targets(install-libclang-headers
207                           COMPONENT libclang-headers)
208endif()
209
210# Create a target to install the python bindings to make them easier to
211# distribute.  Since the bindings are over libclang, which is installed
212# unbundled to the clang version, follow suit.
213foreach(PythonVersion ${CLANG_PYTHON_BINDINGS_VERSIONS})
214  install(DIRECTORY
215            ${CMAKE_CURRENT_SOURCE_DIR}/../../bindings/python/clang
216          COMPONENT
217            libclang-python-bindings
218          DESTINATION
219            "lib${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages")
220endforeach()
221if(NOT LLVM_ENABLE_IDE)
222  add_custom_target(libclang-python-bindings)
223  add_llvm_install_targets(install-libclang-python-bindings
224                           COMPONENT
225                             libclang-python-bindings)
226endif()
227
228