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