1# See docs/CMake.html for instructions about how to build LLVM with CMake. 2 3cmake_minimum_required(VERSION 3.13.4) 4 5if(POLICY CMP0068) 6 cmake_policy(SET CMP0068 NEW) 7 set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON) 8endif() 9 10if(POLICY CMP0075) 11 cmake_policy(SET CMP0075 NEW) 12endif() 13 14if(POLICY CMP0077) 15 cmake_policy(SET CMP0077 NEW) 16endif() 17 18if(NOT DEFINED LLVM_VERSION_MAJOR) 19 set(LLVM_VERSION_MAJOR 12) 20endif() 21if(NOT DEFINED LLVM_VERSION_MINOR) 22 set(LLVM_VERSION_MINOR 0) 23endif() 24if(NOT DEFINED LLVM_VERSION_PATCH) 25 set(LLVM_VERSION_PATCH 0) 26endif() 27if(NOT DEFINED LLVM_VERSION_SUFFIX) 28 set(LLVM_VERSION_SUFFIX git) 29endif() 30 31if (NOT PACKAGE_VERSION) 32 set(PACKAGE_VERSION 33 "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}") 34endif() 35 36if ((CMAKE_GENERATOR MATCHES "Visual Studio") AND (CMAKE_GENERATOR_TOOLSET STREQUAL "")) 37 message(WARNING "Visual Studio generators use the x86 host compiler by " 38 "default, even for 64-bit targets. This can result in linker " 39 "instability and out of memory errors. To use the 64-bit " 40 "host compiler, pass -Thost=x64 on the CMake command line.") 41endif() 42 43if (CMAKE_GENERATOR STREQUAL "Xcode" AND NOT CMAKE_OSX_ARCHITECTURES) 44 # Some CMake features like object libraries get confused if you don't 45 # explicitly specify an architecture setting with the Xcode generator. 46 set(CMAKE_OSX_ARCHITECTURES "x86_64") 47endif() 48 49project(LLVM 50 VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH} 51 LANGUAGES C CXX ASM) 52 53set(CMAKE_CXX_STANDARD 14 CACHE STRING "C++ standard to conform to") 54set(CMAKE_CXX_STANDARD_REQUIRED YES) 55if (CYGWIN) 56 # Cygwin is a bit stricter and lack things like 'strdup', 'stricmp', etc in 57 # c++xx mode. 58 set(CMAKE_CXX_EXTENSIONS YES) 59else() 60 set(CMAKE_CXX_EXTENSIONS NO) 61endif() 62 63if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) 64 message(STATUS "No build type selected, default to Debug") 65 set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build type (default Debug)" FORCE) 66endif() 67 68# Side-by-side subprojects layout: automatically set the 69# LLVM_EXTERNAL_${project}_SOURCE_DIR using LLVM_ALL_PROJECTS 70# This allows an easy way of setting up a build directory for llvm and another 71# one for llvm+clang+... using the same sources. 72set(LLVM_ALL_PROJECTS "clang;clang-tools-extra;compiler-rt;debuginfo-tests;libc;libclc;libcxx;libcxxabi;libunwind;lld;lldb;mlir;openmp;parallel-libs;polly;pstl") 73# The flang project is not yet part of "all" projects (see C++ requirements) 74set(LLVM_EXTRA_PROJECTS "flang") 75# List of all known projects in the mono repo 76set(LLVM_KNOWN_PROJECTS "${LLVM_ALL_PROJECTS};${LLVM_EXTRA_PROJECTS}") 77set(LLVM_ENABLE_PROJECTS "" CACHE STRING 78 "Semicolon-separated list of projects to build (${LLVM_KNOWN_PROJECTS}), or \"all\".") 79if( LLVM_ENABLE_PROJECTS STREQUAL "all" ) 80 set( LLVM_ENABLE_PROJECTS ${LLVM_ALL_PROJECTS}) 81endif() 82if ("flang" IN_LIST LLVM_ENABLE_PROJECTS AND NOT "mlir" IN_LIST LLVM_ENABLE_PROJECTS) 83 message(STATUS "Enabling MLIR as a dependency to flang") 84 list(APPEND LLVM_ENABLE_PROJECTS "mlir") 85endif() 86 87# LLVM_ENABLE_PROJECTS_USED is `ON` if the user has ever used the 88# `LLVM_ENABLE_PROJECTS` CMake cache variable. This exists for 89# several reasons: 90# 91# * As an indicator that the `LLVM_ENABLE_PROJECTS` list is now the single 92# source of truth for which projects to build. This means we will ignore user 93# supplied `LLVM_TOOL_<project>_BUILD` CMake cache variables and overwrite 94# them. 95# 96# * The case where the user previously had `LLVM_ENABLE_PROJECTS` set to a 97# non-empty list but now the user wishes to disable building all other projects 98# by setting `LLVM_ENABLE_PROJECTS` to an empty string. In that case we still 99# need to set the `LLVM_TOOL_${upper_proj}_BUILD` variables so that we disable 100# building all the projects that were previously enabled. 101set(LLVM_ENABLE_PROJECTS_USED OFF CACHE BOOL "") 102mark_as_advanced(LLVM_ENABLE_PROJECTS_USED) 103 104if (LLVM_ENABLE_PROJECTS_USED OR NOT LLVM_ENABLE_PROJECTS STREQUAL "") 105 set(LLVM_ENABLE_PROJECTS_USED ON CACHE BOOL "" FORCE) 106 foreach(proj ${LLVM_KNOWN_PROJECTS} ${LLVM_EXTERNAL_PROJECTS}) 107 string(TOUPPER "${proj}" upper_proj) 108 string(REGEX REPLACE "-" "_" upper_proj ${upper_proj}) 109 if ("${proj}" IN_LIST LLVM_ENABLE_PROJECTS) 110 message(STATUS "${proj} project is enabled") 111 set(SHOULD_ENABLE_PROJECT TRUE) 112 set(PROJ_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}") 113 if(NOT EXISTS "${PROJ_DIR}" OR NOT IS_DIRECTORY "${PROJ_DIR}") 114 message(FATAL_ERROR "LLVM_ENABLE_PROJECTS requests ${proj} but directory not found: ${PROJ_DIR}") 115 endif() 116 if( LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR STREQUAL "" ) 117 set(LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}" CACHE PATH "" FORCE) 118 else() 119 set(LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}" CACHE PATH "") 120 endif() 121 elseif ("${proj}" IN_LIST LLVM_EXTERNAL_PROJECTS) 122 message(STATUS "${proj} project is enabled") 123 set(SHOULD_ENABLE_PROJECT TRUE) 124 else() 125 message(STATUS "${proj} project is disabled") 126 set(SHOULD_ENABLE_PROJECT FALSE) 127 endif() 128 # Force `LLVM_TOOL_${upper_proj}_BUILD` variables to have values that 129 # corresponds with `LLVM_ENABLE_PROJECTS`. This prevents the user setting 130 # `LLVM_TOOL_${upper_proj}_BUILD` variables externally. At some point 131 # we should deprecate allowing users to set these variables by turning them 132 # into normal CMake variables rather than cache variables. 133 set(LLVM_TOOL_${upper_proj}_BUILD 134 ${SHOULD_ENABLE_PROJECT} 135 CACHE 136 BOOL "Whether to build ${upper_proj} as part of LLVM" FORCE 137 ) 138 endforeach() 139endif() 140unset(SHOULD_ENABLE_PROJECT) 141 142# Build llvm with ccache if the package is present 143set(LLVM_CCACHE_BUILD OFF CACHE BOOL "Set to ON for a ccache enabled build") 144if(LLVM_CCACHE_BUILD) 145 find_program(CCACHE_PROGRAM ccache) 146 if(CCACHE_PROGRAM) 147 set(LLVM_CCACHE_MAXSIZE "" CACHE STRING "Size of ccache") 148 set(LLVM_CCACHE_DIR "" CACHE STRING "Directory to keep ccached data") 149 set(LLVM_CCACHE_PARAMS "CCACHE_CPP2=yes CCACHE_HASHDIR=yes" 150 CACHE STRING "Parameters to pass through to ccache") 151 152 set(CCACHE_PROGRAM "${LLVM_CCACHE_PARAMS} ${CCACHE_PROGRAM}") 153 if (LLVM_CCACHE_MAXSIZE) 154 set(CCACHE_PROGRAM "CCACHE_MAXSIZE=${LLVM_CCACHE_MAXSIZE} ${CCACHE_PROGRAM}") 155 endif() 156 if (LLVM_CCACHE_DIR) 157 set(CCACHE_PROGRAM "CCACHE_DIR=${LLVM_CCACHE_DIR} ${CCACHE_PROGRAM}") 158 endif() 159 set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PROGRAM}) 160 else() 161 message(FATAL_ERROR "Unable to find the program ccache. Set LLVM_CCACHE_BUILD to OFF") 162 endif() 163endif() 164 165option(LLVM_DEPENDENCY_DEBUGGING "Dependency debugging mode to verify correctly expressed library dependencies (Darwin only)" OFF) 166 167# Some features of the LLVM build may be disallowed when dependency debugging is 168# enabled. In particular you cannot use ccache because we want to force compile 169# operations to always happen. 170if(LLVM_DEPENDENCY_DEBUGGING) 171 if(NOT CMAKE_HOST_APPLE) 172 message(FATAL_ERROR "Dependency debugging is only currently supported on Darwin hosts.") 173 endif() 174 if(LLVM_CCACHE_BUILD) 175 message(FATAL_ERROR "Cannot enable dependency debugging while using ccache.") 176 endif() 177endif() 178 179option(LLVM_ENABLE_DAGISEL_COV "Debug: Prints tablegen patterns that were used for selecting" OFF) 180option(LLVM_ENABLE_GISEL_COV "Enable collection of GlobalISel rule coverage" OFF) 181if(LLVM_ENABLE_GISEL_COV) 182 set(LLVM_GISEL_COV_PREFIX "${CMAKE_BINARY_DIR}/gisel-coverage-" CACHE STRING "Provide a filename prefix to collect the GlobalISel rule coverage") 183endif() 184 185# Add path for custom modules 186set(CMAKE_MODULE_PATH 187 ${CMAKE_MODULE_PATH} 188 "${CMAKE_CURRENT_SOURCE_DIR}/cmake" 189 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" 190 ) 191 192# Generate a CompilationDatabase (compile_commands.json file) for our build, 193# for use by clang_complete, YouCompleteMe, etc. 194set(CMAKE_EXPORT_COMPILE_COMMANDS 1) 195 196option(LLVM_INSTALL_BINUTILS_SYMLINKS 197 "Install symlinks from the binutils tool names to the corresponding LLVM tools." OFF) 198 199option(LLVM_INSTALL_CCTOOLS_SYMLINKS 200 "Install symlinks from the cctools tool names to the corresponding LLVM tools." OFF) 201 202option(LLVM_INSTALL_UTILS "Include utility binaries in the 'install' target." OFF) 203 204option(LLVM_INSTALL_TOOLCHAIN_ONLY "Only include toolchain files in the 'install' target." OFF) 205 206# Unfortunatly Clang is too eager to search directories for module maps, which can cause the 207# installed version of the maps to be found when building LLVM from source. Therefore we turn off 208# the installation by default. See llvm.org/PR31905. 209option(LLVM_INSTALL_MODULEMAPS "Install the modulemap files in the 'install' target." OFF) 210 211option(LLVM_USE_FOLDERS "Enable solution folders in Visual Studio. Disable for Express versions." ON) 212if ( LLVM_USE_FOLDERS ) 213 set_property(GLOBAL PROPERTY USE_FOLDERS ON) 214endif() 215 216include(VersionFromVCS) 217 218option(LLVM_APPEND_VC_REV 219 "Embed the version control system revision in LLVM" ON) 220 221set(PACKAGE_NAME LLVM) 222set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") 223set(PACKAGE_BUGREPORT "https://bugs.llvm.org/") 224 225set(BUG_REPORT_URL "${PACKAGE_BUGREPORT}" CACHE STRING 226 "Default URL where bug reports are to be submitted.") 227 228# Configure CPack. 229set(CPACK_PACKAGE_INSTALL_DIRECTORY "LLVM") 230set(CPACK_PACKAGE_VENDOR "LLVM") 231set(CPACK_PACKAGE_VERSION_MAJOR ${LLVM_VERSION_MAJOR}) 232set(CPACK_PACKAGE_VERSION_MINOR ${LLVM_VERSION_MINOR}) 233set(CPACK_PACKAGE_VERSION_PATCH ${LLVM_VERSION_PATCH}) 234set(CPACK_PACKAGE_VERSION ${PACKAGE_VERSION}) 235set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.TXT") 236set(CPACK_NSIS_COMPRESSOR "/SOLID lzma \r\n SetCompressorDictSize 32") 237if(WIN32 AND NOT UNIX) 238 set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "LLVM") 239 set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_logo.bmp") 240 set(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico") 241 set(CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico") 242 set(CPACK_NSIS_MODIFY_PATH "ON") 243 set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL "ON") 244 if( CMAKE_CL_64 ) 245 set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") 246 endif() 247endif() 248include(CPack) 249 250# Sanity check our source directory to make sure that we are not trying to 251# generate an in-source build (unless on MSVC_IDE, where it is ok), and to make 252# sure that we don't have any stray generated files lying around in the tree 253# (which would end up getting picked up by header search, instead of the correct 254# versions). 255if( CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR AND NOT MSVC_IDE ) 256 message(FATAL_ERROR "In-source builds are not allowed. 257Please create a directory and run cmake from there, passing the path 258to this source directory as the last argument. 259This process created the file `CMakeCache.txt' and the directory `CMakeFiles'. 260Please delete them.") 261endif() 262 263string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) 264 265if (CMAKE_BUILD_TYPE AND 266 NOT uppercase_CMAKE_BUILD_TYPE MATCHES "^(DEBUG|RELEASE|RELWITHDEBINFO|MINSIZEREL)$") 267 message(FATAL_ERROR "Invalid value for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") 268endif() 269 270set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" ) 271 272set(LLVM_TOOLS_INSTALL_DIR "bin" CACHE STRING "Path for binary subdirectory (defaults to 'bin')") 273mark_as_advanced(LLVM_TOOLS_INSTALL_DIR) 274 275set(LLVM_UTILS_INSTALL_DIR "${LLVM_TOOLS_INSTALL_DIR}" CACHE STRING 276 "Path to install LLVM utilities (enabled by LLVM_INSTALL_UTILS=ON) (defaults to LLVM_TOOLS_INSTALL_DIR)") 277mark_as_advanced(LLVM_UTILS_INSTALL_DIR) 278 279# They are used as destination of target generators. 280set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin) 281set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) 282if(WIN32 OR CYGWIN) 283 # DLL platform -- put DLLs into bin. 284 set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) 285else() 286 set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) 287endif() 288 289# Each of them corresponds to llvm-config's. 290set(LLVM_TOOLS_BINARY_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) # --bindir 291set(LLVM_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) # --libdir 292set(LLVM_MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR} ) # --src-root 293set(LLVM_MAIN_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/include ) # --includedir 294set(LLVM_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} ) # --prefix 295 296# Note: LLVM_CMAKE_PATH does not include generated files 297set(LLVM_CMAKE_PATH ${LLVM_MAIN_SRC_DIR}/cmake/modules) 298set(LLVM_EXAMPLES_BINARY_DIR ${LLVM_BINARY_DIR}/examples) 299set(LLVM_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include) 300 301# List of all targets to be built by default: 302set(LLVM_ALL_TARGETS 303 AArch64 304 AMDGPU 305 ARM 306 AVR 307 BPF 308 Hexagon 309 Lanai 310 Mips 311 MSP430 312 NVPTX 313 PowerPC 314 RISCV 315 Sparc 316 SystemZ 317 WebAssembly 318 X86 319 XCore 320 ) 321 322# List of targets with JIT support: 323set(LLVM_TARGETS_WITH_JIT X86 PowerPC AArch64 ARM Mips SystemZ) 324 325set(LLVM_TARGETS_TO_BUILD "all" 326 CACHE STRING "Semicolon-separated list of targets to build, or \"all\".") 327 328set(LLVM_EXPERIMENTAL_TARGETS_TO_BUILD "" 329 CACHE STRING "Semicolon-separated list of experimental targets to build.") 330 331option(BUILD_SHARED_LIBS 332 "Build all libraries as shared libraries instead of static" OFF) 333 334option(LLVM_ENABLE_BACKTRACES "Enable embedding backtraces on crash." ON) 335if(LLVM_ENABLE_BACKTRACES) 336 set(ENABLE_BACKTRACES 1) 337endif() 338 339option(LLVM_ENABLE_UNWIND_TABLES "Emit unwind tables for the libraries" ON) 340 341option(LLVM_ENABLE_CRASH_OVERRIDES "Enable crash overrides." ON) 342if(LLVM_ENABLE_CRASH_OVERRIDES) 343 set(ENABLE_CRASH_OVERRIDES 1) 344endif() 345 346option(LLVM_ENABLE_CRASH_DUMPS "Turn on memory dumps on crashes. Currently only implemented on Windows." OFF) 347 348option(LLVM_ENABLE_FFI "Use libffi to call external functions from the interpreter" OFF) 349set(FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so") 350set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h") 351 352set(LLVM_TARGET_ARCH "host" 353 CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.") 354 355option(LLVM_ENABLE_TERMINFO "Use terminfo database if available." ON) 356 357set(LLVM_ENABLE_LIBXML2 "ON" CACHE STRING "Use libxml2 if available. Can be ON, OFF, or FORCE_ON") 358 359option(LLVM_ENABLE_LIBEDIT "Use libedit if available." ON) 360 361option(LLVM_ENABLE_LIBPFM "Use libpfm for performance counters if available." ON) 362 363# On z/OS, threads cannot be used because TLS is not supported. 364if (CMAKE_SYSTEM_NAME MATCHES "OS390") 365 option(LLVM_ENABLE_THREADS "Use threads if available." OFF) 366else() 367 option(LLVM_ENABLE_THREADS "Use threads if available." ON) 368endif() 369 370set(LLVM_ENABLE_ZLIB "ON" CACHE STRING "Use zlib for compression/decompression if available. Can be ON, OFF, or FORCE_ON") 371 372set(LLVM_Z3_INSTALL_DIR "" CACHE STRING "Install directory of the Z3 solver.") 373 374option(LLVM_ENABLE_Z3_SOLVER 375 "Enable Support for the Z3 constraint solver in LLVM." 376 ${LLVM_ENABLE_Z3_SOLVER_DEFAULT} 377) 378 379if (LLVM_ENABLE_Z3_SOLVER) 380 find_package(Z3 4.7.1) 381 382 if (LLVM_Z3_INSTALL_DIR) 383 if (NOT Z3_FOUND) 384 message(FATAL_ERROR "Z3 >= 4.7.1 has not been found in LLVM_Z3_INSTALL_DIR: ${LLVM_Z3_INSTALL_DIR}.") 385 endif() 386 endif() 387 388 if (NOT Z3_FOUND) 389 message(FATAL_ERROR "LLVM_ENABLE_Z3_SOLVER cannot be enabled when Z3 is not available.") 390 endif() 391 392 set(LLVM_WITH_Z3 1) 393endif() 394 395set(LLVM_ENABLE_Z3_SOLVER_DEFAULT "${Z3_FOUND}") 396 397 398if( LLVM_TARGETS_TO_BUILD STREQUAL "all" ) 399 set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} ) 400endif() 401 402set(LLVM_TARGETS_TO_BUILD 403 ${LLVM_TARGETS_TO_BUILD} 404 ${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD}) 405list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD) 406 407option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON) 408option(LLVM_ENABLE_MODULES "Compile with C++ modules enabled." OFF) 409if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 410 option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." ON) 411else() 412 option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." OFF) 413endif() 414option(LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY "Compile with -fmodules-local-submodule-visibility." ON) 415option(LLVM_ENABLE_LIBCXX "Use libc++ if available." OFF) 416option(LLVM_STATIC_LINK_CXX_STDLIB "Statically link the standard library." OFF) 417option(LLVM_ENABLE_LLD "Use lld as C and C++ linker." OFF) 418option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON) 419option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF) 420 421option(LLVM_ENABLE_DUMP "Enable dump functions even when assertions are disabled" OFF) 422 423if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" ) 424 option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF) 425else() 426 option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON) 427endif() 428 429option(LLVM_ENABLE_EXPENSIVE_CHECKS "Enable expensive checks" OFF) 430 431# While adding scalable vector support to LLVM, we temporarily want to 432# allow an implicit conversion of TypeSize to uint64_t, and to allow 433# code to get the fixed number of elements from a possibly scalable vector. 434# This CMake flag enables a more strict mode where it asserts that the type 435# is not a scalable vector type. 436# 437# Enabling this flag makes it easier to find cases where the compiler makes 438# assumptions on the size being 'fixed size', when building tests for 439# SVE/SVE2 or other scalable vector architectures. 440option(LLVM_ENABLE_STRICT_FIXED_SIZE_VECTORS 441 "Enable assertions that type is not scalable in implicit conversion from TypeSize to uint64_t and calls to getNumElements" OFF) 442 443set(LLVM_ABI_BREAKING_CHECKS "WITH_ASSERTS" CACHE STRING 444 "Enable abi-breaking checks. Can be WITH_ASSERTS, FORCE_ON or FORCE_OFF.") 445 446option(LLVM_FORCE_USE_OLD_TOOLCHAIN 447 "Set to ON to force using an old, unsupported host toolchain." OFF) 448 449set(LLVM_LOCAL_RPATH "" CACHE FILEPATH 450 "If set, an absolute path added as rpath on binaries that do not already contain an executable-relative rpath.") 451 452option(LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN 453 "Set to ON to only warn when using a toolchain which is about to be deprecated, instead of emitting an error." OFF) 454 455option(LLVM_USE_INTEL_JITEVENTS 456 "Use Intel JIT API to inform Intel(R) VTune(TM) Amplifier XE 2011 about JIT code" 457 OFF) 458 459if( LLVM_USE_INTEL_JITEVENTS ) 460 # Verify we are on a supported platform 461 if( NOT CMAKE_SYSTEM_NAME MATCHES "Windows" AND NOT CMAKE_SYSTEM_NAME MATCHES "Linux" ) 462 message(FATAL_ERROR 463 "Intel JIT API support is available on Linux and Windows only.") 464 endif() 465endif( LLVM_USE_INTEL_JITEVENTS ) 466 467option(LLVM_USE_OPROFILE 468 "Use opagent JIT interface to inform OProfile about JIT code" OFF) 469 470option(LLVM_EXTERNALIZE_DEBUGINFO 471 "Generate dSYM files and strip executables and libraries (Darwin Only)" OFF) 472 473set(LLVM_CODESIGNING_IDENTITY "" CACHE STRING 474 "Sign executables and dylibs with the given identity or skip if empty (Darwin Only)") 475 476# If enabled, verify we are on a platform that supports oprofile. 477if( LLVM_USE_OPROFILE ) 478 if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" ) 479 message(FATAL_ERROR "OProfile support is available on Linux only.") 480 endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" ) 481endif( LLVM_USE_OPROFILE ) 482 483option(LLVM_USE_PERF 484 "Use perf JIT interface to inform perf about JIT code" OFF) 485 486# If enabled, verify we are on a platform that supports perf. 487if( LLVM_USE_PERF ) 488 if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" ) 489 message(FATAL_ERROR "perf support is available on Linux only.") 490 endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" ) 491endif( LLVM_USE_PERF ) 492 493set(LLVM_USE_SANITIZER "" CACHE STRING 494 "Define the sanitizer used to build binaries and tests.") 495option(LLVM_OPTIMIZE_SANITIZED_BUILDS "Pass -O1 on debug sanitizer builds" ON) 496set(LLVM_UBSAN_FLAGS 497 "-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all" 498 CACHE STRING 499 "Compile flags set to enable UBSan. Only used if LLVM_USE_SANITIZER contains 'Undefined'.") 500set(LLVM_LIB_FUZZING_ENGINE "" CACHE PATH 501 "Path to fuzzing library for linking with fuzz targets") 502 503option(LLVM_USE_SPLIT_DWARF 504 "Use -gsplit-dwarf when compiling llvm." OFF) 505 506# Define an option controlling whether we should build for 32-bit on 64-bit 507# platforms, where supported. 508if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT (WIN32 OR ${CMAKE_SYSTEM_NAME} MATCHES "AIX")) 509 # TODO: support other platforms and toolchains. 510 option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF) 511endif() 512 513# Define the default arguments to use with 'lit', and an option for the user to 514# override. 515set(LIT_ARGS_DEFAULT "-sv") 516if (MSVC_IDE OR XCODE) 517 set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar") 518endif() 519set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit") 520 521# On Win32 hosts, provide an option to specify the path to the GnuWin32 tools. 522if( WIN32 AND NOT CYGWIN ) 523 set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools") 524endif() 525 526set(LLVM_INTEGRATED_CRT_ALLOC "" CACHE PATH "Replace the Windows CRT allocator with any of {rpmalloc|mimalloc|snmalloc}. Only works with /MT enabled.") 527if(LLVM_INTEGRATED_CRT_ALLOC) 528 if(NOT WIN32) 529 message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC is only supported on Windows.") 530 endif() 531 if(LLVM_USE_SANITIZER) 532 message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC cannot be used along with LLVM_USE_SANITIZER!") 533 endif() 534 if(CMAKE_BUILD_TYPE AND uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") 535 message(FATAL_ERROR "The Debug target isn't supported along with LLVM_INTEGRATED_CRT_ALLOC!") 536 endif() 537endif() 538 539# Define options to control the inclusion and default build behavior for 540# components which may not strictly be necessary (tools, examples, and tests). 541# 542# This is primarily to support building smaller or faster project files. 543option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON) 544option(LLVM_BUILD_TOOLS 545 "Build the LLVM tools. If OFF, just generate build targets." ON) 546 547option(LLVM_INCLUDE_UTILS "Generate build targets for the LLVM utils." ON) 548option(LLVM_BUILD_UTILS 549 "Build LLVM utility binaries. If OFF, just generate build targets." ON) 550 551option(LLVM_INCLUDE_RUNTIMES "Generate build targets for the LLVM runtimes." ON) 552option(LLVM_BUILD_RUNTIMES 553 "Build the LLVM runtimes. If OFF, just generate build targets." ON) 554 555option(LLVM_BUILD_RUNTIME 556 "Build the LLVM runtime libraries." ON) 557option(LLVM_BUILD_EXAMPLES 558 "Build the LLVM example programs. If OFF, just generate build targets." OFF) 559option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON) 560 561if(LLVM_BUILD_EXAMPLES) 562 add_definitions(-DBUILD_EXAMPLES) 563endif(LLVM_BUILD_EXAMPLES) 564 565option(LLVM_BUILD_TESTS 566 "Build LLVM unit tests. If OFF, just generate build targets." OFF) 567option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON) 568option(LLVM_INCLUDE_GO_TESTS "Include the Go bindings tests in test build targets." ON) 569 570option(LLVM_BUILD_BENCHMARKS "Add LLVM benchmark targets to the list of default 571targets. If OFF, benchmarks still could be built using Benchmarks target." OFF) 572option(LLVM_INCLUDE_BENCHMARKS "Generate benchmark targets. If OFF, benchmarks can't be built." ON) 573 574option (LLVM_BUILD_DOCS "Build the llvm documentation." OFF) 575option (LLVM_INCLUDE_DOCS "Generate build targets for llvm documentation." ON) 576option (LLVM_ENABLE_DOXYGEN "Use doxygen to generate llvm API documentation." OFF) 577option (LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF) 578option (LLVM_ENABLE_OCAMLDOC "Build OCaml bindings documentation." ON) 579option (LLVM_ENABLE_BINDINGS "Build bindings." ON) 580 581set(LLVM_INSTALL_DOXYGEN_HTML_DIR "share/doc/llvm/doxygen-html" 582 CACHE STRING "Doxygen-generated HTML documentation install directory") 583set(LLVM_INSTALL_OCAMLDOC_HTML_DIR "share/doc/llvm/ocaml-html" 584 CACHE STRING "OCamldoc-generated HTML documentation install directory") 585 586option (LLVM_BUILD_EXTERNAL_COMPILER_RT 587 "Build compiler-rt as an external project." OFF) 588 589option (LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO 590 "Show target and host info when tools are invoked with --version." ON) 591 592# You can configure which libraries from LLVM you want to include in the 593# shared library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited 594# list of LLVM components. All component names handled by llvm-config are valid. 595if(NOT DEFINED LLVM_DYLIB_COMPONENTS) 596 set(LLVM_DYLIB_COMPONENTS "all" CACHE STRING 597 "Semicolon-separated list of components to include in libLLVM, or \"all\".") 598endif() 599 600if(MSVC) 601 option(LLVM_BUILD_LLVM_C_DYLIB "Build LLVM-C.dll (Windows only)" ON) 602 # Set this variable to OFF here so it can't be set with a command-line 603 # argument. 604 set (LLVM_LINK_LLVM_DYLIB OFF) 605 if (BUILD_SHARED_LIBS) 606 message(FATAL_ERROR "BUILD_SHARED_LIBS options is not supported on Windows.") 607 endif() 608else() 609 option(LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF) 610 option(LLVM_BUILD_LLVM_C_DYLIB "Build libllvm-c re-export library (Darwin only)" OFF) 611 set(LLVM_BUILD_LLVM_DYLIB_default OFF) 612 if(LLVM_LINK_LLVM_DYLIB OR LLVM_BUILD_LLVM_C_DYLIB) 613 set(LLVM_BUILD_LLVM_DYLIB_default ON) 614 endif() 615 option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${LLVM_BUILD_LLVM_DYLIB_default}) 616endif() 617 618if (LLVM_LINK_LLVM_DYLIB AND BUILD_SHARED_LIBS) 619 message(FATAL_ERROR "Cannot enable BUILD_SHARED_LIBS with LLVM_LINK_LLVM_DYLIB. We recommend disabling BUILD_SHARED_LIBS.") 620endif() 621 622option(LLVM_OPTIMIZED_TABLEGEN "Force TableGen to be built with optimization" OFF) 623if(CMAKE_CROSSCOMPILING OR (LLVM_OPTIMIZED_TABLEGEN AND (LLVM_ENABLE_ASSERTIONS OR CMAKE_CONFIGURATION_TYPES))) 624 set(LLVM_USE_HOST_TOOLS ON) 625endif() 626 627if (MSVC_IDE) 628 option(LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION "Configure project to use Visual Studio native visualizers" TRUE) 629endif() 630 631if (LLVM_BUILD_INSTRUMENTED OR LLVM_BUILD_INSTRUMENTED_COVERAGE OR 632 LLVM_ENABLE_IR_PGO) 633 if(NOT LLVM_PROFILE_MERGE_POOL_SIZE) 634 # A pool size of 1-2 is probably sufficient on a SSD. 3-4 should be fine 635 # for spining disks. Anything higher may only help on slower mediums. 636 set(LLVM_PROFILE_MERGE_POOL_SIZE "4") 637 endif() 638 if(NOT LLVM_PROFILE_FILE_PATTERN) 639 if(NOT LLVM_PROFILE_DATA_DIR) 640 file(TO_NATIVE_PATH "${LLVM_BINARY_DIR}/profiles" LLVM_PROFILE_DATA_DIR) 641 endif() 642 file(TO_NATIVE_PATH "${LLVM_PROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_PROFILE_FILE_PATTERN) 643 endif() 644 if(NOT LLVM_CSPROFILE_FILE_PATTERN) 645 if(NOT LLVM_CSPROFILE_DATA_DIR) 646 file(TO_NATIVE_PATH "${LLVM_BINARY_DIR}/csprofiles" LLVM_CSPROFILE_DATA_DIR) 647 endif() 648 file(TO_NATIVE_PATH "${LLVM_CSPROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_CSPROFILE_FILE_PATTERN) 649 endif() 650endif() 651 652if (LLVM_BUILD_STATIC) 653 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") 654 # Remove shared library suffixes from use in find_library 655 foreach (shared_lib_suffix ${CMAKE_SHARED_LIBRARY_SUFFIX} ${CMAKE_IMPORT_LIBRARY_SUFFIX}) 656 list(FIND CMAKE_FIND_LIBRARY_SUFFIXES ${shared_lib_suffix} shared_lib_suffix_idx) 657 if(NOT ${shared_lib_suffix_idx} EQUAL -1) 658 list(REMOVE_AT CMAKE_FIND_LIBRARY_SUFFIXES ${shared_lib_suffix_idx}) 659 endif() 660 endforeach() 661endif() 662 663# Use libtool instead of ar if you are both on an Apple host, and targeting Apple. 664if(CMAKE_HOST_APPLE AND APPLE) 665 include(UseLibtool) 666endif() 667 668# Override the default target with an environment variable named by LLVM_TARGET_TRIPLE_ENV. 669set(LLVM_TARGET_TRIPLE_ENV CACHE STRING "The name of environment variable to override default target. Disabled by blank.") 670mark_as_advanced(LLVM_TARGET_TRIPLE_ENV) 671 672set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR OFF CACHE BOOL 673 "Enable per-target runtimes directory") 674 675set(LLVM_PROFDATA_FILE "" CACHE FILEPATH 676 "Profiling data file to use when compiling in order to improve runtime performance.") 677 678# All options referred to from HandleLLVMOptions have to be specified 679# BEFORE this include, otherwise options will not be correctly set on 680# first cmake run 681include(config-ix) 682 683string(REPLACE "Native" ${LLVM_NATIVE_ARCH} 684 LLVM_TARGETS_TO_BUILD "${LLVM_TARGETS_TO_BUILD}") 685list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD) 686 687# By default, we target the host, but this can be overridden at CMake 688# invocation time. 689set(LLVM_DEFAULT_TARGET_TRIPLE "${LLVM_HOST_TRIPLE}" CACHE STRING 690 "Default target for which LLVM will generate code." ) 691set(TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}") 692message(STATUS "LLVM host triple: ${LLVM_HOST_TRIPLE}") 693message(STATUS "LLVM default target triple: ${LLVM_DEFAULT_TARGET_TRIPLE}") 694 695if(WIN32 OR CYGWIN) 696 if(BUILD_SHARED_LIBS OR LLVM_BUILD_LLVM_DYLIB) 697 set(LLVM_ENABLE_PLUGINS_default ON) 698 else() 699 set(LLVM_ENABLE_PLUGINS_default OFF) 700 endif() 701else() 702 set(LLVM_ENABLE_PLUGINS_default ${LLVM_ENABLE_PIC}) 703endif() 704option(LLVM_ENABLE_PLUGINS "Enable plugin support" ${LLVM_ENABLE_PLUGINS_default}) 705 706set(ENABLE_EXPERIMENTAL_NEW_PASS_MANAGER FALSE CACHE BOOL 707 "Enable the experimental new pass manager by default.") 708 709include(HandleLLVMOptions) 710 711find_package(Python3 COMPONENTS Interpreter) 712if(NOT Python3_Interpreter_FOUND) 713 message(WARNING "Python3 not found, using python2 as a fallback") 714 find_package(Python2 COMPONENTS Interpreter REQUIRED) 715 if(Python2_VERSION VERSION_LESS 2.7) 716 message(SEND_ERROR "Python 2.7 or newer is required") 717 endif() 718 719 # Treat python2 as python3 720 add_executable(Python3::Interpreter IMPORTED) 721 set_target_properties(Python3::Interpreter PROPERTIES 722 IMPORTED_LOCATION ${Python2_EXECUTABLE}) 723 set(Python3_EXECUTABLE ${Python2_EXECUTABLE}) 724endif() 725 726###### 727 728# Configure all of the various header file fragments LLVM uses which depend on 729# configuration variables. 730set(LLVM_ENUM_TARGETS "") 731set(LLVM_ENUM_ASM_PRINTERS "") 732set(LLVM_ENUM_ASM_PARSERS "") 733set(LLVM_ENUM_DISASSEMBLERS "") 734foreach(t ${LLVM_TARGETS_TO_BUILD}) 735 set( td ${LLVM_MAIN_SRC_DIR}/lib/Target/${t} ) 736 737 list(FIND LLVM_ALL_TARGETS ${t} idx) 738 list(FIND LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ${t} idy) 739 # At this point, LLVMBUILDTOOL already checked all the targets passed in 740 # LLVM_TARGETS_TO_BUILD and LLVM_EXPERIMENTAL_TARGETS_TO_BUILD, so 741 # this test just makes sure that any experimental targets were passed via 742 # LLVM_EXPERIMENTAL_TARGETS_TO_BUILD, not LLVM_TARGETS_TO_BUILD. 743 if( idx LESS 0 AND idy LESS 0 ) 744 message(FATAL_ERROR "The target `${t}' is experimental and must be passed " 745 "via LLVM_EXPERIMENTAL_TARGETS_TO_BUILD.") 746 else() 747 set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${t})\n") 748 endif() 749 750 file(GLOB asmp_file "${td}/*AsmPrinter.cpp") 751 if( asmp_file ) 752 set(LLVM_ENUM_ASM_PRINTERS 753 "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n") 754 endif() 755 if( EXISTS ${td}/AsmParser/CMakeLists.txt ) 756 set(LLVM_ENUM_ASM_PARSERS 757 "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n") 758 endif() 759 if( EXISTS ${td}/Disassembler/CMakeLists.txt ) 760 set(LLVM_ENUM_DISASSEMBLERS 761 "${LLVM_ENUM_DISASSEMBLERS}LLVM_DISASSEMBLER(${t})\n") 762 endif() 763endforeach(t) 764 765# Produce the target definition files, which provide a way for clients to easily 766# include various classes of targets. 767configure_file( 768 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in 769 ${LLVM_INCLUDE_DIR}/llvm/Config/AsmPrinters.def 770 ) 771configure_file( 772 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in 773 ${LLVM_INCLUDE_DIR}/llvm/Config/AsmParsers.def 774 ) 775configure_file( 776 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in 777 ${LLVM_INCLUDE_DIR}/llvm/Config/Disassemblers.def 778 ) 779configure_file( 780 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in 781 ${LLVM_INCLUDE_DIR}/llvm/Config/Targets.def 782 ) 783 784# They are not referenced. See set_output_directory(). 785set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/bin ) 786set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} ) 787set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} ) 788 789# For up-to-date instructions for installing the Tensorflow dependency, refer to 790# the bot setup script: https://github.com/google/ml-compiler-opt/blob/master/buildbot/buildbot_init.sh 791# In this case, the latest C API library is available for download from 792# https://www.tensorflow.org/install/lang_c. 793# We will expose the conditional compilation variable, 794# LLVM_HAVE_TF_API, through llvm-config.h, so that a user of the LLVM library may 795# also leverage the dependency. 796set(TENSORFLOW_C_LIB_PATH "" CACHE PATH "Path to TensorFlow C library install") 797if (TENSORFLOW_C_LIB_PATH) 798 find_library(tensorflow_c_api tensorflow PATHS ${TENSORFLOW_C_LIB_PATH}/lib NO_DEFAULT_PATH REQUIRED) 799 set(LLVM_HAVE_TF_API "ON" CACHE BOOL "Full Tensorflow API available") 800 include_directories(${TENSORFLOW_C_LIB_PATH}/include) 801endif() 802 803# For up-to-date instructions for installing the Tensorflow dependency, refer to 804# the bot setup script: https://github.com/google/ml-compiler-opt/blob/master/buildbot/buildbot_init.sh 805# Specifically, assuming python3 is installed: 806# python3 -m pip install --upgrade pip && python3 -m pip install --user tf_nightly==2.3.0.dev20200528 807# Then set TENSORFLOW_AOT_PATH to the package install - usually it's ~/.local/lib/python3.7/site-packages/tensorflow 808# 809set(TENSORFLOW_AOT_PATH "" CACHE PATH "Path to TensorFlow pip install dir") 810 811if (NOT TENSORFLOW_AOT_PATH STREQUAL "") 812 set(LLVM_HAVE_TF_AOT "ON" CACHE BOOL "Tensorflow AOT available") 813 set(TENSORFLOW_AOT_COMPILER 814 "${TENSORFLOW_AOT_PATH}/../../../../bin/saved_model_cli" 815 CACHE PATH "Path to the Tensorflow AOT compiler") 816 include_directories(${TENSORFLOW_AOT_PATH}/include) 817 add_subdirectory(${TENSORFLOW_AOT_PATH}/xla_aot_runtime_src 818 ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/tf_runtime) 819endif() 820 821# Keep the legacy CMake flag ENABLE_EXPERIMENTAL_NEW_PASS_MANAGER for 822# compatibility. 823set(LLVM_ENABLE_NEW_PASS_MANAGER ${ENABLE_EXPERIMENTAL_NEW_PASS_MANAGER}) 824 825# Configure the three LLVM configuration header files. 826configure_file( 827 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/config.h.cmake 828 ${LLVM_INCLUDE_DIR}/llvm/Config/config.h) 829configure_file( 830 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/llvm-config.h.cmake 831 ${LLVM_INCLUDE_DIR}/llvm/Config/llvm-config.h) 832configure_file( 833 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/abi-breaking.h.cmake 834 ${LLVM_INCLUDE_DIR}/llvm/Config/abi-breaking.h) 835 836# Add target for generating source rpm package. 837set(LLVM_SRPM_USER_BINARY_SPECFILE ${CMAKE_CURRENT_SOURCE_DIR}/llvm.spec.in 838 CACHE FILEPATH ".spec file to use for srpm generation") 839set(LLVM_SRPM_BINARY_SPECFILE ${CMAKE_CURRENT_BINARY_DIR}/llvm.spec) 840set(LLVM_SRPM_DIR "${CMAKE_CURRENT_BINARY_DIR}/srpm") 841 842get_source_info(${CMAKE_CURRENT_SOURCE_DIR} revision repository) 843string(LENGTH "${revision}" revision_length) 844set(LLVM_RPM_SPEC_REVISION "${revision}") 845 846configure_file( 847 ${LLVM_SRPM_USER_BINARY_SPECFILE} 848 ${LLVM_SRPM_BINARY_SPECFILE} @ONLY) 849 850add_custom_target(srpm 851 COMMAND cpack -G TGZ --config CPackSourceConfig.cmake -B ${LLVM_SRPM_DIR}/SOURCES 852 COMMAND rpmbuild -bs --define '_topdir ${LLVM_SRPM_DIR}' ${LLVM_SRPM_BINARY_SPECFILE}) 853set_target_properties(srpm PROPERTIES FOLDER "Misc") 854 855if(APPLE AND DARWIN_LTO_LIBRARY) 856 set(CMAKE_EXE_LINKER_FLAGS 857 "${CMAKE_EXE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}") 858 set(CMAKE_SHARED_LINKER_FLAGS 859 "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}") 860 set(CMAKE_MODULE_LINKER_FLAGS 861 "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}") 862endif() 863 864# Build with _XOPEN_SOURCE on AIX, as stray macros in _ALL_SOURCE mode tend to 865# break things. In this case we need to enable the large-file API as well. 866if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX") 867 add_definitions("-D_XOPEN_SOURCE=700") 868 add_definitions("-D_LARGE_FILE_API") 869 870 # CMake versions less than 3.16 set default linker flags to include -brtl, as 871 # well as setting -G when building libraries, so clear them out. Note we only 872 # try to clear the form that CMake will set as part of its initial 873 # configuration, it is still possible the user may force it as part of a 874 # compound option. 875 if(CMAKE_VERSION VERSION_LESS 3.16) 876 string(REGEX REPLACE "(^|[ \t]+)-Wl,-brtl([ \t]+|$)" " " CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") 877 string(REGEX REPLACE "(^|[ \t]+)-Wl,-brtl([ \t]+|$)" " " CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}") 878 string(REGEX REPLACE "(^|[ \t]+)-Wl,-brtl([ \t]+|$)" " " CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}") 879 string(REGEX REPLACE "(^|[ \t]+)(-Wl,)?-G([ \t]+|$)" " " CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS 880 "${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS}") 881 string(REGEX REPLACE "(^|[ \t]+)(-Wl,)?-G([ \t]+|$)" " " CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS 882 "${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS}") 883 string(REGEX REPLACE "(^|[ \t]+)(-Wl,)?-G([ \t]+|$)" " " CMAKE_SHARED_LIBRARY_CREATE_ASM_FLAGS 884 "${CMAKE_SHARED_LIBRARY_CREATE_ASM_FLAGS}") 885 string(REGEX REPLACE "(^|[ \t]+)-Wl,-G," " -Wl," CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS 886 "${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS}") 887 string(REGEX REPLACE "(^|[ \t]+)-Wl,-G," " -Wl," CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS 888 "${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS}") 889 string(REGEX REPLACE "(^|[ \t]+)-Wl,-G," " -Wl," CMAKE_SHARED_LIBRARY_CREATE_ASM_FLAGS 890 "${CMAKE_SHARED_LIBRARY_CREATE_ASM_FLAGS}") 891 endif() 892 893 # Modules should be built with -shared -Wl,-G, so we can use runtime linking 894 # with plugins. 895 string(APPEND CMAKE_MODULE_LINKER_FLAGS " -shared -Wl,-G") 896 897 # Also set the correct flags for building shared libraries. 898 string(APPEND CMAKE_SHARED_LINKER_FLAGS " -shared") 899endif() 900 901# Build with _XOPEN_SOURCE on z/OS. 902if (CMAKE_SYSTEM_NAME MATCHES "OS390") 903 add_definitions("-D_XOPEN_SOURCE=600") 904 add_definitions("-D_OPEN_SYS") # Needed for process information. 905 add_definitions("-D_OPEN_SYS_FILE_EXT") # Needed for EBCDIC I/O. 906endif() 907 908# Build with _FILE_OFFSET_BITS=64 on Solaris to match g++ >= 9. 909if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "SunOS") 910 add_definitions("-D_FILE_OFFSET_BITS=64") 911endif() 912 913set(CMAKE_INCLUDE_CURRENT_DIR ON) 914 915include_directories( ${LLVM_INCLUDE_DIR} ${LLVM_MAIN_INCLUDE_DIR}) 916 917# when crosscompiling import the executable targets from a file 918if(LLVM_USE_HOST_TOOLS) 919 include(CrossCompile) 920 llvm_create_cross_target(LLVM NATIVE "" Release) 921endif(LLVM_USE_HOST_TOOLS) 922if(LLVM_TARGET_IS_CROSSCOMPILE_HOST) 923# Dummy use to avoid CMake Warning: Manually-specified variables were not used 924# (this is a variable that CrossCompile sets on recursive invocations) 925endif() 926 927if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)") 928 # On FreeBSD, /usr/local/* is not used by default. In order to build LLVM 929 # with libxml2, iconv.h, etc., we must add /usr/local paths. 930 include_directories(SYSTEM "/usr/local/include") 931 link_directories("/usr/local/lib") 932endif(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)") 933 934if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS ) 935 # special hack for Solaris to handle crazy system sys/regset.h 936 include_directories("${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/Solaris") 937endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS ) 938 939# Make sure we don't get -rdynamic in every binary. For those that need it, 940# use export_executable_symbols(target). 941set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") 942 943include(AddLLVM) 944include(TableGen) 945 946if( MINGW AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) 947 # People report that -O3 is unreliable on MinGW. The traditional 948 # build also uses -O2 for that reason: 949 llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2") 950endif() 951 952# Put this before tblgen. Else we have a circular dependence. 953add_subdirectory(lib/Demangle) 954add_subdirectory(lib/Support) 955add_subdirectory(lib/TableGen) 956 957add_subdirectory(utils/TableGen) 958 959add_subdirectory(include/llvm) 960 961add_subdirectory(lib) 962 963if( LLVM_INCLUDE_UTILS ) 964 add_subdirectory(utils/FileCheck) 965 add_subdirectory(utils/PerfectShuffle) 966 add_subdirectory(utils/count) 967 add_subdirectory(utils/not) 968 add_subdirectory(utils/yaml-bench) 969else() 970 if ( LLVM_INCLUDE_TESTS ) 971 message(FATAL_ERROR "Including tests when not building utils will not work. 972 Either set LLVM_INCLUDE_UTILS to On, or set LLVM_INCLUDE_TESTS to Off.") 973 endif() 974endif() 975 976# Use LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION instead of LLVM_INCLUDE_UTILS because it is not really a util 977if (LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION) 978 add_subdirectory(utils/LLVMVisualizers) 979endif() 980 981foreach( binding ${LLVM_BINDINGS_LIST} ) 982 if( EXISTS "${LLVM_MAIN_SRC_DIR}/bindings/${binding}/CMakeLists.txt" ) 983 add_subdirectory(bindings/${binding}) 984 endif() 985endforeach() 986 987add_subdirectory(projects) 988 989if( LLVM_INCLUDE_TOOLS ) 990 add_subdirectory(tools) 991endif() 992 993if( LLVM_INCLUDE_RUNTIMES ) 994 add_subdirectory(runtimes) 995endif() 996 997if( LLVM_INCLUDE_EXAMPLES ) 998 add_subdirectory(examples) 999endif() 1000 1001if( LLVM_INCLUDE_TESTS ) 1002 if(EXISTS ${LLVM_MAIN_SRC_DIR}/projects/test-suite AND TARGET clang) 1003 include(LLVMExternalProjectUtils) 1004 llvm_ExternalProject_Add(test-suite ${LLVM_MAIN_SRC_DIR}/projects/test-suite 1005 USE_TOOLCHAIN 1006 EXCLUDE_FROM_ALL 1007 NO_INSTALL 1008 ALWAYS_CLEAN) 1009 endif() 1010 add_subdirectory(utils/lit) 1011 add_subdirectory(test) 1012 add_subdirectory(unittests) 1013 if( LLVM_INCLUDE_UTILS ) 1014 add_subdirectory(utils/unittest) 1015 endif() 1016 1017 if (WIN32) 1018 # This utility is used to prevent crashing tests from calling Dr. Watson on 1019 # Windows. 1020 add_subdirectory(utils/KillTheDoctor) 1021 endif() 1022 1023 # Add a global check rule now that all subdirectories have been traversed 1024 # and we know the total set of lit testsuites. 1025 get_property(LLVM_LIT_TESTSUITES GLOBAL PROPERTY LLVM_LIT_TESTSUITES) 1026 get_property(LLVM_LIT_PARAMS GLOBAL PROPERTY LLVM_LIT_PARAMS) 1027 get_property(LLVM_LIT_DEPENDS GLOBAL PROPERTY LLVM_LIT_DEPENDS) 1028 get_property(LLVM_LIT_EXTRA_ARGS GLOBAL PROPERTY LLVM_LIT_EXTRA_ARGS) 1029 get_property(LLVM_ADDITIONAL_TEST_TARGETS 1030 GLOBAL PROPERTY LLVM_ADDITIONAL_TEST_TARGETS) 1031 get_property(LLVM_ADDITIONAL_TEST_DEPENDS 1032 GLOBAL PROPERTY LLVM_ADDITIONAL_TEST_DEPENDS) 1033 add_lit_target(check-all 1034 "Running all regression tests" 1035 ${LLVM_LIT_TESTSUITES} 1036 PARAMS ${LLVM_LIT_PARAMS} 1037 DEPENDS ${LLVM_LIT_DEPENDS} ${LLVM_ADDITIONAL_TEST_TARGETS} 1038 ARGS ${LLVM_LIT_EXTRA_ARGS} 1039 ) 1040 if(TARGET check-runtimes) 1041 add_dependencies(check-all check-runtimes) 1042 endif() 1043 add_custom_target(test-depends 1044 DEPENDS ${LLVM_LIT_DEPENDS} ${LLVM_ADDITIONAL_TEST_DEPENDS}) 1045 set_target_properties(test-depends PROPERTIES FOLDER "Tests") 1046endif() 1047 1048if (LLVM_INCLUDE_DOCS) 1049 add_subdirectory(docs) 1050endif() 1051 1052add_subdirectory(cmake/modules) 1053 1054# Do this last so that all lit targets have already been created. 1055if (LLVM_INCLUDE_UTILS) 1056 add_subdirectory(utils/llvm-lit) 1057endif() 1058 1059if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) 1060 install(DIRECTORY include/llvm include/llvm-c 1061 DESTINATION include 1062 COMPONENT llvm-headers 1063 FILES_MATCHING 1064 PATTERN "*.def" 1065 PATTERN "*.h" 1066 PATTERN "*.td" 1067 PATTERN "*.inc" 1068 PATTERN "LICENSE.TXT" 1069 ) 1070 1071 install(DIRECTORY ${LLVM_INCLUDE_DIR}/llvm ${LLVM_INCLUDE_DIR}/llvm-c 1072 DESTINATION include 1073 COMPONENT llvm-headers 1074 FILES_MATCHING 1075 PATTERN "*.def" 1076 PATTERN "*.h" 1077 PATTERN "*.gen" 1078 PATTERN "*.inc" 1079 # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def" 1080 PATTERN "CMakeFiles" EXCLUDE 1081 PATTERN "config.h" EXCLUDE 1082 ) 1083 1084 if (LLVM_INSTALL_MODULEMAPS) 1085 install(DIRECTORY include/llvm include/llvm-c 1086 DESTINATION include 1087 COMPONENT llvm-headers 1088 FILES_MATCHING 1089 PATTERN "module.modulemap" 1090 ) 1091 install(FILES include/llvm/module.install.modulemap 1092 DESTINATION include/llvm 1093 COMPONENT llvm-headers 1094 RENAME "module.extern.modulemap" 1095 ) 1096 endif(LLVM_INSTALL_MODULEMAPS) 1097 1098 # Installing the headers needs to depend on generating any public 1099 # tablegen'd headers. 1100 add_custom_target(llvm-headers DEPENDS intrinsics_gen omp_gen) 1101 set_target_properties(llvm-headers PROPERTIES FOLDER "Misc") 1102 1103 if (NOT LLVM_ENABLE_IDE) 1104 add_llvm_install_targets(install-llvm-headers 1105 DEPENDS llvm-headers 1106 COMPONENT llvm-headers) 1107 endif() 1108 1109 # Custom target to install all libraries. 1110 add_custom_target(llvm-libraries) 1111 set_target_properties(llvm-libraries PROPERTIES FOLDER "Misc") 1112 1113 if (NOT LLVM_ENABLE_IDE) 1114 add_llvm_install_targets(install-llvm-libraries 1115 DEPENDS llvm-libraries 1116 COMPONENT llvm-libraries) 1117 endif() 1118 1119 get_property(LLVM_LIBS GLOBAL PROPERTY LLVM_LIBS) 1120 if(LLVM_LIBS) 1121 list(REMOVE_DUPLICATES LLVM_LIBS) 1122 foreach(lib ${LLVM_LIBS}) 1123 add_dependencies(llvm-libraries ${lib}) 1124 if (NOT LLVM_ENABLE_IDE) 1125 add_dependencies(install-llvm-libraries install-${lib}) 1126 add_dependencies(install-llvm-libraries-stripped install-${lib}-stripped) 1127 endif() 1128 endforeach() 1129 endif() 1130endif() 1131 1132# This must be at the end of the LLVM root CMakeLists file because it must run 1133# after all targets are created. 1134include(LLVMDistributionSupport) 1135llvm_distribution_add_targets() 1136process_llvm_pass_plugins(GEN_CONFIG) 1137 1138# This allows us to deploy the Universal CRT DLLs by passing -DCMAKE_INSTALL_UCRT_LIBRARIES=ON to CMake 1139if (MSVC AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows" AND CMAKE_INSTALL_UCRT_LIBRARIES) 1140 include(InstallRequiredSystemLibraries) 1141endif() 1142 1143if (LLVM_INCLUDE_BENCHMARKS) 1144 # Override benchmark defaults so that when the library itself is updated these 1145 # modifications are not lost. 1146 set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "Disable benchmark testing" FORCE) 1147 set(BENCHMARK_ENABLE_EXCEPTIONS OFF CACHE BOOL "Disable benchmark exceptions" FORCE) 1148 set(BENCHMARK_ENABLE_INSTALL OFF CACHE BOOL "Don't install benchmark" FORCE) 1149 set(BENCHMARK_DOWNLOAD_DEPENDENCIES OFF CACHE BOOL "Don't download dependencies" FORCE) 1150 set(BENCHMARK_ENABLE_GTEST_TESTS OFF CACHE BOOL "Disable Google Test in benchmark" FORCE) 1151 # Since LLVM requires C++11 it is safe to assume that std::regex is available. 1152 set(HAVE_STD_REGEX ON CACHE BOOL "OK" FORCE) 1153 1154 add_subdirectory(utils/benchmark) 1155 add_subdirectory(benchmarks) 1156endif() 1157 1158if (LLVM_INCLUDE_UTILS AND LLVM_INCLUDE_TOOLS) 1159 add_subdirectory(utils/llvm-locstats) 1160endif() 1161