xref: /llvm-project/llvm/lib/Support/CMakeLists.txt (revision de4bbbfdccb6172c563b07889ecfb06bc4974a7e)
1include(GetLibraryName)
2
3# Ensure that libSupport does not carry any static global initializer.
4# libSupport can be embedded in use cases where we don't want to load all
5# cl::opt unless we want to parse the command line.
6# ManagedStatic can be used to enable lazy-initialization of globals.
7# We don't use `add_flag_if_supported` as instead of compiling an empty file we
8# check if the current platform is able to compile global std::mutex with this
9# flag (Linux can, Darwin can't for example).
10check_cxx_compiler_flag("-Werror=global-constructors" HAS_WERROR_GLOBAL_CTORS)
11if (HAS_WERROR_GLOBAL_CTORS)
12  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=global-constructors")
13  CHECK_CXX_SOURCE_COMPILES("
14  #include <mutex>
15  static std::mutex TestGlobalCtorDtor;
16  static std::recursive_mutex TestGlobalCtorDtor2;
17  int main() { (void)TestGlobalCtorDtor; (void)TestGlobalCtorDtor2; return 0;}
18  " LLVM_HAS_NOGLOBAL_CTOR_MUTEX)
19  if (NOT LLVM_HAS_NOGLOBAL_CTOR_MUTEX)
20    string(REPLACE "-Werror=global-constructors" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
21  endif()
22endif()
23
24if(LLVM_ENABLE_ZLIB)
25  list(APPEND imported_libs ZLIB::ZLIB)
26endif()
27
28if(LLVM_ENABLE_ZSTD)
29  if(TARGET zstd::libzstd_shared AND NOT LLVM_USE_STATIC_ZSTD)
30    set(zstd_target zstd::libzstd_shared)
31  else()
32    set(zstd_target zstd::libzstd_static)
33  endif()
34endif()
35
36if(LLVM_ENABLE_ZSTD)
37  list(APPEND imported_libs ${zstd_target})
38endif()
39
40if( WIN32 )
41  # libuuid required for FOLDERID_Profile usage in lib/Support/Windows/Path.inc.
42  # advapi32 required for CryptAcquireContextW in lib/Support/Windows/Path.inc.
43  # ntdll required for RtlGetLastNtStatus in lib/Support/ErrorHandling.cpp.
44  set(system_libs ${system_libs} psapi shell32 ole32 uuid advapi32 ws2_32 ntdll)
45elseif( CMAKE_HOST_UNIX )
46  if( HAVE_LIBRT )
47    set(system_libs ${system_libs} rt)
48  endif()
49  if( HAVE_LIBDL )
50    set(system_libs ${system_libs} ${CMAKE_DL_LIBS})
51  endif()
52  if( HAVE_BACKTRACE AND NOT "${Backtrace_LIBRARIES}" STREQUAL "" )
53    # On BSDs, CMake returns a fully qualified path to the backtrace library.
54    # We need to remove the path and the 'lib' prefix, to make it look like a
55    # regular short library name, suitable for appending to a -l link flag.
56    get_filename_component(Backtrace_LIBFILE ${Backtrace_LIBRARIES} NAME_WE)
57    STRING(REGEX REPLACE "^lib" "" Backtrace_LIBFILE ${Backtrace_LIBFILE})
58    set(system_libs ${system_libs} ${Backtrace_LIBFILE})
59  endif()
60  set(system_libs ${system_libs} ${LLVM_ATOMIC_LIB})
61  set(system_libs ${system_libs} ${LLVM_PTHREAD_LIB})
62  if( UNIX AND NOT (BEOS OR HAIKU) )
63    set(system_libs ${system_libs} m)
64  endif()
65  if( UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" )
66    set(system_libs ${system_libs} kstat socket)
67  endif()
68  if( FUCHSIA )
69    set(system_libs ${system_libs} zircon)
70  endif()
71  if ( HAIKU )
72    add_compile_definitions(_BSD_SOURCE)
73    set(system_libs ${system_libs} bsd network)
74  endif()
75endif( WIN32 )
76
77set(WL "")
78if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.25"
79   AND MSVC
80   AND NOT CMAKE_GENERATOR MATCHES "Visual Studio")
81  #IntelLLVM requires to pass linker flags with a wrapper
82  set(WL "$<$<OR:$<LINK_LANG_AND_ID:C,IntelLLVM>,$<LINK_LANG_AND_ID:CXX,IntelLLVM>,$<LINK_LANG_AND_ID:Fortran,IntelLLVM>>:-Qoption,link,>")
83endif()
84
85# Delay load shell32.dll if possible to speed up process startup.
86set (delayload_flags)
87if (MSVC)
88  # When linking with Swift, `swiftc.exe` is used as the linker drive rather
89  # than invoking `link.exe` directly.  In such a case, the flags should be
90  # marked as `-Xlinker` to pass them directly to the linker.  As a temporary
91  # workaround simply elide the delay loading.
92  set (delayload_flags $<$<NOT:$<LINK_LANGUAGE:Swift>>:delayimp ${WL}-delayload:shell32.dll ${WL}-delayload:ole32.dll>)
93endif()
94
95# Link Z3 if the user wants to build it.
96if(LLVM_WITH_Z3)
97  set(system_libs ${system_libs} ${Z3_LIBRARIES})
98endif()
99
100# Override the C runtime allocator on Windows and embed it into LLVM tools & libraries
101if(LLVM_INTEGRATED_CRT_ALLOC)
102  if (NOT CMAKE_MSVC_RUNTIME_LIBRARY OR CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$")
103    message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC only works with CMAKE_MSVC_RUNTIME_LIBRARY set to MultiThreaded or MultiThreadedDebug.")
104  endif()
105
106  string(REGEX REPLACE "(/|\\\\)$" "" LLVM_INTEGRATED_CRT_ALLOC "${LLVM_INTEGRATED_CRT_ALLOC}")
107
108  if(NOT EXISTS "${LLVM_INTEGRATED_CRT_ALLOC}")
109    message(FATAL_ERROR "Cannot find the path to `git clone` for the CRT allocator! (${LLVM_INTEGRATED_CRT_ALLOC}). Currently, rpmalloc, snmalloc and mimalloc are supported.")
110  endif()
111
112  if((LLVM_INTEGRATED_CRT_ALLOC MATCHES "rpmalloc$") OR LLVM_ENABLE_RPMALLOC)
113    add_compile_definitions(ENABLE_OVERRIDE ENABLE_PRELOAD)
114    set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/rpmalloc/rpmalloc.c")
115    set(delayload_flags "${delayload_flags} ${WL}-INCLUDE:malloc")
116  elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$")
117    set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/src/snmalloc/override/new.cc")
118    set(system_libs ${system_libs} "mincore.lib" "${WL}-INCLUDE:malloc")
119  elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "mimalloc$")
120    set(MIMALLOC_LIB "${LLVM_INTEGRATED_CRT_ALLOC}/out/msvc-x64/Release/mimalloc-static.lib")
121    if(NOT EXISTS "${MIMALLOC_LIB}")
122	  message(FATAL_ERROR "Cannot find the mimalloc static library. To build it, first apply the patch from https://github.com/microsoft/mimalloc/issues/268 then build the Release x64 target through ${LLVM_INTEGRATED_CRT_ALLOC}\\ide\\vs2019\\mimalloc.sln")
123    endif()
124    set(system_libs ${system_libs} "${MIMALLOC_LIB}" "${WL}-INCLUDE:malloc")
125  endif()
126endif()
127
128# FIXME: We are currently guarding AIX headers with _XOPEN_SOURCE=700.
129# See llvm/CMakeLists.txt. However, we need _SC_NPROCESSORS_ONLN in
130# unistd.h and it is guarded by _ALL_SOURCE, so we remove the _XOPEN_SOURCE
131# guard here. We should remove the guards all together once AIX cleans up
132# the system headers.
133if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
134  remove_definitions("-D_XOPEN_SOURCE=700")
135endif()
136
137add_subdirectory(BLAKE3)
138
139add_llvm_component_library(LLVMSupport
140  ABIBreak.cpp
141  AMDGPUMetadata.cpp
142  APFixedPoint.cpp
143  APFloat.cpp
144  APInt.cpp
145  APSInt.cpp
146  ARMBuildAttributes.cpp
147  AArch64BuildAttributes.cpp
148  ARMAttributeParser.cpp
149  ARMWinEH.cpp
150  Allocator.cpp
151  AutoConvert.cpp
152  Base64.cpp
153  BalancedPartitioning.cpp
154  BinaryStreamError.cpp
155  BinaryStreamReader.cpp
156  BinaryStreamRef.cpp
157  BinaryStreamWriter.cpp
158  BlockFrequency.cpp
159  BranchProbability.cpp
160  BuryPointer.cpp
161  CachePruning.cpp
162  Caching.cpp
163  circular_raw_ostream.cpp
164  Chrono.cpp
165  COM.cpp
166  CodeGenCoverage.cpp
167  CommandLine.cpp
168  Compression.cpp
169  CRC.cpp
170  ConvertUTF.cpp
171  ConvertEBCDIC.cpp
172  ConvertUTFWrapper.cpp
173  CrashRecoveryContext.cpp
174  CSKYAttributes.cpp
175  CSKYAttributeParser.cpp
176  DataExtractor.cpp
177  Debug.cpp
178  DebugCounter.cpp
179  DeltaAlgorithm.cpp
180  DeltaTree.cpp
181  DivisionByConstantInfo.cpp
182  DAGDeltaAlgorithm.cpp
183  DJB.cpp
184  DynamicAPInt.cpp
185  ELFAttributeParser.cpp
186  ELFAttributes.cpp
187  Error.cpp
188  ErrorHandling.cpp
189  ExponentialBackoff.cpp
190  ExtensibleRTTI.cpp
191  FileCollector.cpp
192  FileUtilities.cpp
193  FileOutputBuffer.cpp
194  FloatingPointMode.cpp
195  FoldingSet.cpp
196  FormattedStream.cpp
197  FormatVariadic.cpp
198  GlobPattern.cpp
199  GraphWriter.cpp
200  HexagonAttributeParser.cpp
201  HexagonAttributes.cpp
202  InitLLVM.cpp
203  InstructionCost.cpp
204  IntEqClasses.cpp
205  IntervalMap.cpp
206  JSON.cpp
207  KnownBits.cpp
208  LEB128.cpp
209  LineIterator.cpp
210  Locale.cpp
211  LockFileManager.cpp
212  ManagedStatic.cpp
213  MathExtras.cpp
214  MemAlloc.cpp
215  MemoryBuffer.cpp
216  MemoryBufferRef.cpp
217  ModRef.cpp
218  MD5.cpp
219  MSP430Attributes.cpp
220  MSP430AttributeParser.cpp
221  NativeFormatting.cpp
222  OptimizedStructLayout.cpp
223  Optional.cpp
224  OptionStrCmp.cpp
225  PGOOptions.cpp
226  Parallel.cpp
227  PluginLoader.cpp
228  PrettyStackTrace.cpp
229  RandomNumberGenerator.cpp
230  Regex.cpp
231  RewriteBuffer.cpp
232  RewriteRope.cpp
233  RISCVAttributes.cpp
234  RISCVAttributeParser.cpp
235  RISCVISAUtils.cpp
236  ScaledNumber.cpp
237  ScopedPrinter.cpp
238  SHA1.cpp
239  SHA256.cpp
240  Signposts.cpp
241  SipHash.cpp
242  SlowDynamicAPInt.cpp
243  SmallPtrSet.cpp
244  SmallVector.cpp
245  SourceMgr.cpp
246  SpecialCaseList.cpp
247  Statistic.cpp
248  StringExtras.cpp
249  StringMap.cpp
250  StringSaver.cpp
251  StringRef.cpp
252  SuffixTreeNode.cpp
253  SuffixTree.cpp
254  SystemUtils.cpp
255  TarWriter.cpp
256  ThreadPool.cpp
257  TimeProfiler.cpp
258  Timer.cpp
259  ToolOutputFile.cpp
260  TrieRawHashMap.cpp
261  Twine.cpp
262  TypeSize.cpp
263  Unicode.cpp
264  UnicodeCaseFold.cpp
265  UnicodeNameToCodepoint.cpp
266  UnicodeNameToCodepointGenerated.cpp
267  VersionTuple.cpp
268  VirtualFileSystem.cpp
269  WithColor.cpp
270  YAMLParser.cpp
271  YAMLTraits.cpp
272  raw_os_ostream.cpp
273  raw_ostream.cpp
274  raw_socket_stream.cpp
275  regcomp.c
276  regerror.c
277  regexec.c
278  regfree.c
279  regstrlcpy.c
280  xxhash.cpp
281  Z3Solver.cpp
282
283  ${ALLOCATOR_FILES}
284  $<TARGET_OBJECTS:LLVMSupportBlake3>
285
286# System
287  Atomic.cpp
288  DynamicLibrary.cpp
289  Errno.cpp
290  Memory.cpp
291  Path.cpp
292  Process.cpp
293  Program.cpp
294  RWMutex.cpp
295  Signals.cpp
296  Threading.cpp
297  Valgrind.cpp
298  Watchdog.cpp
299
300  ADDITIONAL_HEADER_DIRS
301  Unix
302  Windows
303  ${LLVM_MAIN_INCLUDE_DIR}/llvm/ADT
304  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Support
305  ${Backtrace_INCLUDE_DIRS}
306
307  LINK_LIBS
308  ${system_libs} ${imported_libs} ${delayload_flags}
309
310  LINK_COMPONENTS
311  Demangle
312  )
313
314set(llvm_system_libs ${system_libs})
315
316# This block is only needed for llvm-config. When we deprecate llvm-config and
317# move to using CMake export, this block can be removed.
318if(LLVM_ENABLE_ZLIB)
319  # CMAKE_BUILD_TYPE is only meaningful to single-configuration generators.
320  if(CMAKE_BUILD_TYPE)
321    string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
322    get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION_${build_type})
323  endif()
324  if(NOT zlib_library)
325    get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION)
326  endif()
327  get_library_name(${zlib_library} zlib_library)
328  set(llvm_system_libs ${llvm_system_libs} "${zlib_library}")
329endif()
330
331if(LLVM_ENABLE_ZSTD)
332  # CMAKE_BUILD_TYPE is only meaningful to single-configuration generators.
333  if(CMAKE_BUILD_TYPE)
334    string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
335    get_property(zstd_library TARGET ${zstd_target} PROPERTY LOCATION_${build_type})
336  endif()
337  if(NOT zstd_library)
338    get_property(zstd_library TARGET ${zstd_target} PROPERTY LOCATION)
339  endif()
340  if (zstd_target STREQUAL zstd::libzstd_shared)
341    get_library_name(${zstd_library} zstd_library)
342    set(llvm_system_libs ${llvm_system_libs} "${zstd_library}")
343  else()
344    set(llvm_system_libs ${llvm_system_libs} "${zstd_STATIC_LIBRARY}")
345  endif()
346endif()
347
348set_property(TARGET LLVMSupport PROPERTY LLVM_SYSTEM_LIBS "${llvm_system_libs}")
349
350
351if(LLVM_INTEGRATED_CRT_ALLOC)
352  if(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$")
353    set_property(TARGET LLVMSupport PROPERTY CXX_STANDARD 17)
354    add_compile_definitions(_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING)
355    if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND
356        "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86_64")
357      set_property(TARGET LLVMSupport PROPERTY COMPILE_FLAGS "-mcx16")
358    endif()
359  endif()
360endif()
361
362if(LLVM_WITH_Z3)
363  target_include_directories(LLVMSupport SYSTEM
364    PRIVATE
365    ${Z3_INCLUDE_DIR}
366    )
367endif()
368