1# See docs/CMake.html for instructions about how to build LLVM with CMake. 2 3cmake_minimum_required(VERSION 3.4.3) 4 5cmake_policy(SET CMP0022 NEW) 6 7cmake_policy(SET CMP0048 NEW) 8 9# CMake 3.1 and higher include generator expressions of the form 10# $<TARGETLIB:obj> in the SOURCES property. These need to be 11# stripped everywhere that access the SOURCES property, so we just 12# defer to the OLD behavior of not including generator expressions 13# in the output for now. 14cmake_policy(SET CMP0051 OLD) 15 16cmake_policy(SET CMP0056 NEW) 17 18cmake_policy(SET CMP0057 NEW) 19 20if(POLICY CMP0068) 21 cmake_policy(SET CMP0068 NEW) 22 set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON) 23endif() 24 25if(NOT DEFINED LLVM_VERSION_MAJOR) 26 set(LLVM_VERSION_MAJOR 7) 27endif() 28if(NOT DEFINED LLVM_VERSION_MINOR) 29 set(LLVM_VERSION_MINOR 0) 30endif() 31if(NOT DEFINED LLVM_VERSION_PATCH) 32 set(LLVM_VERSION_PATCH 1) 33endif() 34if(NOT DEFINED LLVM_VERSION_SUFFIX) 35 set(LLVM_VERSION_SUFFIX "") 36endif() 37 38if (NOT PACKAGE_VERSION) 39 set(PACKAGE_VERSION 40 "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}") 41endif() 42 43if ((CMAKE_GENERATOR MATCHES "Visual Studio") AND (CMAKE_GENERATOR_TOOLSET STREQUAL "")) 44 message(WARNING "Visual Studio generators use the x86 host compiler by " 45 "default, even for 64-bit targets. This can result in linker " 46 "instability and out of memory errors. To use the 64-bit " 47 "host compiler, pass -Thost=x64 on the CMake command line.") 48endif() 49 50project(LLVM 51 VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH} 52 LANGUAGES C CXX ASM) 53 54if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) 55 message(STATUS "No build type selected, default to Debug") 56 set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build type (default Debug)" FORCE) 57endif() 58 59# This should only apply if you are both on an Apple host, and targeting Apple. 60if(CMAKE_HOST_APPLE AND APPLE) 61 # if CMAKE_LIBTOOL is not set, try and find it with xcrun or find_program 62 if(NOT CMAKE_LIBTOOL) 63 if(NOT CMAKE_XCRUN) 64 find_program(CMAKE_XCRUN NAMES xcrun) 65 endif() 66 if(CMAKE_XCRUN) 67 execute_process(COMMAND ${CMAKE_XCRUN} -find libtool 68 OUTPUT_VARIABLE CMAKE_LIBTOOL 69 OUTPUT_STRIP_TRAILING_WHITESPACE) 70 endif() 71 72 if(NOT CMAKE_LIBTOOL OR NOT EXISTS CMAKE_LIBTOOL) 73 find_program(CMAKE_LIBTOOL NAMES libtool) 74 endif() 75 endif() 76 77 get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) 78 if(CMAKE_LIBTOOL) 79 set(CMAKE_LIBTOOL ${CMAKE_LIBTOOL} CACHE PATH "libtool executable") 80 message(STATUS "Found libtool - ${CMAKE_LIBTOOL}") 81 82 execute_process(COMMAND ${CMAKE_LIBTOOL} -V 83 OUTPUT_VARIABLE LIBTOOL_V_OUTPUT 84 OUTPUT_STRIP_TRAILING_WHITESPACE) 85 if("${LIBTOOL_V_OUTPUT}" MATCHES ".*cctools-([0-9.]+).*") 86 string(REGEX REPLACE ".*cctools-([0-9.]+).*" "\\1" LIBTOOL_VERSION 87 ${LIBTOOL_V_OUTPUT}) 88 if(NOT LIBTOOL_VERSION VERSION_LESS "862") 89 set(LIBTOOL_NO_WARNING_FLAG "-no_warning_for_no_symbols") 90 endif() 91 endif() 92 93 foreach(lang ${languages}) 94 set(CMAKE_${lang}_CREATE_STATIC_LIBRARY 95 "\"${CMAKE_LIBTOOL}\" -static ${LIBTOOL_NO_WARNING_FLAG} -o <TARGET> \ 96 <LINK_FLAGS> <OBJECTS> ") 97 endforeach() 98 endif() 99 100 # If DYLD_LIBRARY_PATH is set we need to set it on archiver commands 101 if(DYLD_LIBRARY_PATH) 102 set(dyld_envar "DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}") 103 foreach(lang ${languages}) 104 foreach(cmd ${CMAKE_${lang}_CREATE_STATIC_LIBRARY}) 105 list(APPEND CMAKE_${lang}_CREATE_STATIC_LIBRARY_NEW 106 "${dyld_envar} ${cmd}") 107 endforeach() 108 set(CMAKE_${lang}_CREATE_STATIC_LIBRARY 109 ${CMAKE_${lang}_CREATE_STATIC_LIBRARY_NEW}) 110 endforeach() 111 endif() 112endif() 113 114# Side-by-side subprojects layout: automatically set the 115# LLVM_EXTERNAL_${project}_SOURCE_DIR using LLVM_ALL_PROJECTS 116# This allows an easy way of setting up a build directory for llvm and another 117# one for llvm+clang+... using the same sources. 118set(LLVM_ALL_PROJECTS "clang;libcxx;libcxxabi;lldb;compiler-rt;lld;polly;debuginfo-tests") 119set(LLVM_ENABLE_PROJECTS "" CACHE STRING 120 "Semicolon-separated list of projects to build (${LLVM_ALL_PROJECTS}), or \"all\".") 121if( LLVM_ENABLE_PROJECTS STREQUAL "all" ) 122 set( LLVM_ENABLE_PROJECTS ${LLVM_ALL_PROJECTS}) 123endif() 124foreach(proj ${LLVM_ENABLE_PROJECTS}) 125 set(PROJ_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}") 126 if(NOT EXISTS "${PROJ_DIR}" OR NOT IS_DIRECTORY "${PROJ_DIR}") 127 message(FATAL_ERROR "LLVM_ENABLE_PROJECTS requests ${proj} but directory not found: ${PROJ_DIR}") 128 endif() 129 string(TOUPPER "${proj}" upper_proj) 130 STRING(REGEX REPLACE "-" "_" upper_proj ${upper_proj}) 131 set(LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}") 132 # There is a widely spread opinion that clang-tools-extra should be merged 133 # into clang. The following simulates it by always enabling clang-tools-extra 134 # when enabling clang. 135 if (proj STREQUAL "clang") 136 set(LLVM_EXTERNAL_CLANG_TOOLS_EXTRA_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../clang-tools-extra") 137 endif() 138endforeach() 139 140# Build llvm with ccache if the package is present 141set(LLVM_CCACHE_BUILD OFF CACHE BOOL "Set to ON for a ccache enabled build") 142if(LLVM_CCACHE_BUILD) 143 find_program(CCACHE_PROGRAM ccache) 144 if(CCACHE_PROGRAM) 145 set(LLVM_CCACHE_MAXSIZE "" CACHE STRING "Size of ccache") 146 set(LLVM_CCACHE_DIR "" CACHE STRING "Directory to keep ccached data") 147 set(LLVM_CCACHE_PARAMS "CCACHE_CPP2=yes CCACHE_HASHDIR=yes" 148 CACHE STRING "Parameters to pass through to ccache") 149 150 set(CCACHE_PROGRAM "${LLVM_CCACHE_PARAMS} ${CCACHE_PROGRAM}") 151 if (LLVM_CCACHE_MAXSIZE) 152 set(CCACHE_PROGRAM "CCACHE_MAXSIZE=${LLVM_CCACHE_MAXSIZE} ${CCACHE_PROGRAM}") 153 endif() 154 if (LLVM_CCACHE_DIR) 155 set(CCACHE_PROGRAM "CCACHE_DIR=${LLVM_CCACHE_DIR} ${CCACHE_PROGRAM}") 156 endif() 157 set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PROGRAM}) 158 else() 159 message(FATAL_ERROR "Unable to find the program ccache. Set LLVM_CCACHE_BUILD to OFF") 160 endif() 161endif() 162 163option(LLVM_DEPENDENCY_DEBUGGING "Dependency debugging mode to verify correctly expressed library dependencies (Darwin only)" OFF) 164 165# Some features of the LLVM build may be disallowed when dependency debugging is 166# enabled. In particular you cannot use ccache because we want to force compile 167# operations to always happen. 168if(LLVM_DEPENDENCY_DEBUGGING) 169 if(NOT CMAKE_HOST_APPLE) 170 message(FATAL_ERROR "Dependency debugging is only currently supported on Darwin hosts.") 171 endif() 172 if(LLVM_CCACHE_BUILD) 173 message(FATAL_ERROR "Cannot enable dependency debugging while using ccache.") 174 endif() 175endif() 176 177option(LLVM_ENABLE_DAGISEL_COV "Debug: Prints tablegen patterns that were used for selecting" OFF) 178option(LLVM_ENABLE_GISEL_COV "Enable collection of GlobalISel rule coverage" OFF) 179if(LLVM_ENABLE_GISEL_COV) 180 set(LLVM_GISEL_COV_PREFIX "${CMAKE_BINARY_DIR}/gisel-coverage-" CACHE STRING "Provide a filename prefix to collect the GlobalISel rule coverage") 181endif() 182 183# Add path for custom modules 184set(CMAKE_MODULE_PATH 185 ${CMAKE_MODULE_PATH} 186 "${CMAKE_CURRENT_SOURCE_DIR}/cmake" 187 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" 188 ) 189 190# Generate a CompilationDatabase (compile_commands.json file) for our build, 191# for use by clang_complete, YouCompleteMe, etc. 192set(CMAKE_EXPORT_COMPILE_COMMANDS 1) 193 194option(LLVM_INSTALL_BINUTILS_SYMLINKS 195 "Install symlinks from the binutils tool names to the corresponding LLVM tools." OFF) 196 197option(LLVM_INSTALL_UTILS "Include utility binaries in the 'install' target." OFF) 198 199option(LLVM_INSTALL_TOOLCHAIN_ONLY "Only include toolchain files in the 'install' target." OFF) 200 201option(LLVM_USE_FOLDERS "Enable solution folders in Visual Studio. Disable for Express versions." ON) 202if ( LLVM_USE_FOLDERS ) 203 set_property(GLOBAL PROPERTY USE_FOLDERS ON) 204endif() 205 206include(VersionFromVCS) 207 208option(LLVM_APPEND_VC_REV 209 "Embed the version control system revision id in LLVM" ON) 210 211set(PACKAGE_NAME LLVM) 212set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") 213set(PACKAGE_BUGREPORT "https://bugs.llvm.org/") 214 215set(BUG_REPORT_URL "${PACKAGE_BUGREPORT}" CACHE STRING 216 "Default URL where bug reports are to be submitted.") 217 218# Configure CPack. 219set(CPACK_PACKAGE_INSTALL_DIRECTORY "LLVM") 220set(CPACK_PACKAGE_VENDOR "LLVM") 221set(CPACK_PACKAGE_VERSION_MAJOR ${LLVM_VERSION_MAJOR}) 222set(CPACK_PACKAGE_VERSION_MINOR ${LLVM_VERSION_MINOR}) 223set(CPACK_PACKAGE_VERSION_PATCH ${LLVM_VERSION_PATCH}) 224set(CPACK_PACKAGE_VERSION ${PACKAGE_VERSION}) 225set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.TXT") 226set(CPACK_NSIS_COMPRESSOR "/SOLID lzma \r\n SetCompressorDictSize 32") 227if(WIN32 AND NOT UNIX) 228 set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "LLVM") 229 set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_logo.bmp") 230 set(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico") 231 set(CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico") 232 set(CPACK_NSIS_MODIFY_PATH "ON") 233 set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL "ON") 234 if( CMAKE_CL_64 ) 235 set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") 236 endif() 237endif() 238include(CPack) 239 240# Sanity check our source directory to make sure that we are not trying to 241# generate an in-source build (unless on MSVC_IDE, where it is ok), and to make 242# sure that we don't have any stray generated files lying around in the tree 243# (which would end up getting picked up by header search, instead of the correct 244# versions). 245if( CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR AND NOT MSVC_IDE ) 246 message(FATAL_ERROR "In-source builds are not allowed. 247CMake would overwrite the makefiles distributed with LLVM. 248Please create a directory and run cmake from there, passing the path 249to this source directory as the last argument. 250This process created the file `CMakeCache.txt' and the directory `CMakeFiles'. 251Please delete them.") 252endif() 253if( NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR ) 254 file(GLOB_RECURSE 255 tablegenned_files_on_include_dir 256 "${CMAKE_CURRENT_SOURCE_DIR}/include/llvm/*.gen") 257 file(GLOB_RECURSE 258 tablegenned_files_on_lib_dir 259 "${CMAKE_CURRENT_SOURCE_DIR}/lib/Target/*.inc") 260 if( tablegenned_files_on_include_dir OR tablegenned_files_on_lib_dir) 261 message(FATAL_ERROR "Apparently there is a previous in-source build, 262probably as the result of running `configure' and `make' on 263${CMAKE_CURRENT_SOURCE_DIR}. 264This may cause problems. The suspicious files are: 265${tablegenned_files_on_lib_dir} 266${tablegenned_files_on_include_dir} 267Please clean the source directory.") 268 endif() 269endif() 270 271string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) 272 273if (CMAKE_BUILD_TYPE AND 274 NOT uppercase_CMAKE_BUILD_TYPE MATCHES "^(DEBUG|RELEASE|RELWITHDEBINFO|MINSIZEREL)$") 275 message(FATAL_ERROR "Invalid value for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") 276endif() 277 278set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" ) 279 280set(LLVM_TOOLS_INSTALL_DIR "bin" CACHE STRING "Path for binary subdirectory (defaults to 'bin')") 281mark_as_advanced(LLVM_TOOLS_INSTALL_DIR) 282 283set(LLVM_UTILS_INSTALL_DIR "${LLVM_TOOLS_INSTALL_DIR}" CACHE STRING 284 "Path to install LLVM utilities (enabled by LLVM_INSTALL_UTILS=ON) (defaults to LLVM_TOOLS_INSTALL_DIR)") 285mark_as_advanced(LLVM_UTILS_INSTALL_DIR) 286 287# They are used as destination of target generators. 288set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin) 289set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) 290if(WIN32 OR CYGWIN) 291 # DLL platform -- put DLLs into bin. 292 set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) 293else() 294 set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) 295endif() 296 297# Each of them corresponds to llvm-config's. 298set(LLVM_TOOLS_BINARY_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) # --bindir 299set(LLVM_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) # --libdir 300set(LLVM_MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR} ) # --src-root 301set(LLVM_MAIN_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/include ) # --includedir 302set(LLVM_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} ) # --prefix 303 304# Note: LLVM_CMAKE_PATH does not include generated files 305set(LLVM_CMAKE_PATH ${LLVM_MAIN_SRC_DIR}/cmake/modules) 306set(LLVM_EXAMPLES_BINARY_DIR ${LLVM_BINARY_DIR}/examples) 307set(LLVM_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include) 308 309# List of all targets to be built by default: 310set(LLVM_ALL_TARGETS 311 AArch64 312 AMDGPU 313 ARM 314 BPF 315 Hexagon 316 Lanai 317 Mips 318 MSP430 319 NVPTX 320 PowerPC 321 Sparc 322 SystemZ 323 X86 324 XCore 325 ) 326 327# List of targets with JIT support: 328set(LLVM_TARGETS_WITH_JIT X86 PowerPC AArch64 ARM Mips SystemZ) 329 330set(LLVM_TARGETS_TO_BUILD "all" 331 CACHE STRING "Semicolon-separated list of targets to build, or \"all\".") 332 333set(LLVM_EXPERIMENTAL_TARGETS_TO_BUILD "" 334 CACHE STRING "Semicolon-separated list of experimental targets to build.") 335 336option(BUILD_SHARED_LIBS 337 "Build all libraries as shared libraries instead of static" OFF) 338 339option(LLVM_ENABLE_BACKTRACES "Enable embedding backtraces on crash." ON) 340if(LLVM_ENABLE_BACKTRACES) 341 set(ENABLE_BACKTRACES 1) 342endif() 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_FFI "Use libffi to call external functions from the interpreter" OFF) 350set(FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so") 351set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h") 352 353set(LLVM_TARGET_ARCH "host" 354 CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.") 355 356option(LLVM_ENABLE_TERMINFO "Use terminfo database if available." ON) 357 358set(LLVM_ENABLE_LIBXML2 "ON" CACHE STRING "Use libxml2 if available. Can be ON, OFF, or FORCE_ON") 359 360option(LLVM_ENABLE_LIBEDIT "Use libedit if available." ON) 361 362option(LLVM_ENABLE_LIBPFM "Use libpfm for performance counters if available." ON) 363 364option(LLVM_ENABLE_THREADS "Use threads if available." ON) 365 366option(LLVM_ENABLE_ZLIB "Use zlib for compression/decompression if available." ON) 367 368if( LLVM_TARGETS_TO_BUILD STREQUAL "all" ) 369 set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} ) 370endif() 371 372set(LLVM_TARGETS_TO_BUILD 373 ${LLVM_TARGETS_TO_BUILD} 374 ${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD}) 375list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD) 376 377option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON) 378option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON) 379option(LLVM_ENABLE_MODULES "Compile with C++ modules enabled." OFF) 380if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 381 option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." ON) 382 option(LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY "Compile with -fmodules-local-submodule-visibility." OFF) 383else() 384 option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." OFF) 385 option(LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY "Compile with -fmodules-local-submodule-visibility." ON) 386endif() 387option(LLVM_ENABLE_CXX1Y "Compile with C++1y enabled." OFF) 388option(LLVM_ENABLE_CXX1Z "Compile with C++1z enabled." OFF) 389option(LLVM_ENABLE_LIBCXX "Use libc++ if available." OFF) 390option(LLVM_ENABLE_LLD "Use lld as C and C++ linker." OFF) 391option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON) 392option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF) 393 394option(LLVM_ENABLE_DUMP "Enable dump functions even when assertions are disabled" OFF) 395 396if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" ) 397 option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF) 398else() 399 option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON) 400endif() 401 402option(LLVM_ENABLE_EXPENSIVE_CHECKS "Enable expensive checks" OFF) 403 404set(LLVM_ABI_BREAKING_CHECKS "WITH_ASSERTS" CACHE STRING 405 "Enable abi-breaking checks. Can be WITH_ASSERTS, FORCE_ON or FORCE_OFF.") 406 407option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN 408 "Set to ON to force using an old, unsupported host toolchain." OFF) 409 410option(LLVM_USE_INTEL_JITEVENTS 411 "Use Intel JIT API to inform Intel(R) VTune(TM) Amplifier XE 2011 about JIT code" 412 OFF) 413 414if( LLVM_USE_INTEL_JITEVENTS ) 415 # Verify we are on a supported platform 416 if( NOT CMAKE_SYSTEM_NAME MATCHES "Windows" AND NOT CMAKE_SYSTEM_NAME MATCHES "Linux" ) 417 message(FATAL_ERROR 418 "Intel JIT API support is available on Linux and Windows only.") 419 endif() 420endif( LLVM_USE_INTEL_JITEVENTS ) 421 422option(LLVM_USE_OPROFILE 423 "Use opagent JIT interface to inform OProfile about JIT code" OFF) 424 425option(LLVM_EXTERNALIZE_DEBUGINFO 426 "Generate dSYM files and strip executables and libraries (Darwin Only)" OFF) 427 428option(LLVM_CODESIGNING_IDENTITY 429 "Sign executables and dylibs with the given identity (Darwin Only)" OFF) 430 431# If enabled, verify we are on a platform that supports oprofile. 432if( LLVM_USE_OPROFILE ) 433 if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" ) 434 message(FATAL_ERROR "OProfile support is available on Linux only.") 435 endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" ) 436endif( LLVM_USE_OPROFILE ) 437 438option(LLVM_USE_PERF 439 "Use perf JIT interface to inform perf about JIT code" OFF) 440 441# If enabled, verify we are on a platform that supports perf. 442if( LLVM_USE_PERF ) 443 if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" ) 444 message(FATAL_ERROR "perf support is available on Linux only.") 445 endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" ) 446endif( LLVM_USE_PERF ) 447 448set(LLVM_USE_SANITIZER "" CACHE STRING 449 "Define the sanitizer used to build binaries and tests.") 450option(LLVM_OPTIMIZE_SANITIZED_BUILDS "Pass -O1 on debug sanitizer builds" ON) 451set(LLVM_LIB_FUZZING_ENGINE "" CACHE PATH 452 "Path to fuzzing library for linking with fuzz targets") 453 454option(LLVM_USE_SPLIT_DWARF 455 "Use -gsplit-dwarf when compiling llvm." OFF) 456 457option(LLVM_POLLY_LINK_INTO_TOOLS "Statically link Polly into tools (if available)" ON) 458option(LLVM_POLLY_BUILD "Build LLVM with Polly" ON) 459 460if (EXISTS ${LLVM_MAIN_SRC_DIR}/tools/polly/CMakeLists.txt) 461 set(POLLY_IN_TREE TRUE) 462elseif(LLVM_EXTERNAL_POLLY_SOURCE_DIR) 463 set(POLLY_IN_TREE TRUE) 464else() 465 set(POLLY_IN_TREE FALSE) 466endif() 467 468if (LLVM_POLLY_BUILD AND POLLY_IN_TREE) 469 set(WITH_POLLY ON) 470else() 471 set(WITH_POLLY OFF) 472endif() 473 474if (LLVM_POLLY_LINK_INTO_TOOLS AND WITH_POLLY) 475 set(LINK_POLLY_INTO_TOOLS ON) 476else() 477 set(LINK_POLLY_INTO_TOOLS OFF) 478endif() 479 480# Define an option controlling whether we should build for 32-bit on 64-bit 481# platforms, where supported. 482if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 ) 483 # TODO: support other platforms and toolchains. 484 option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF) 485endif() 486 487# Define the default arguments to use with 'lit', and an option for the user to 488# override. 489set(LIT_ARGS_DEFAULT "-sv") 490if (MSVC_IDE OR XCODE) 491 set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar") 492endif() 493set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit") 494 495# On Win32 hosts, provide an option to specify the path to the GnuWin32 tools. 496if( WIN32 AND NOT CYGWIN ) 497 set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools") 498endif() 499 500# Define options to control the inclusion and default build behavior for 501# components which may not strictly be necessary (tools, examples, and tests). 502# 503# This is primarily to support building smaller or faster project files. 504option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON) 505option(LLVM_BUILD_TOOLS 506 "Build the LLVM tools. If OFF, just generate build targets." ON) 507 508option(LLVM_INCLUDE_UTILS "Generate build targets for the LLVM utils." ON) 509option(LLVM_BUILD_UTILS 510 "Build LLVM utility binaries. If OFF, just generate build targets." ON) 511 512option(LLVM_INCLUDE_RUNTIMES "Generate build targets for the LLVM runtimes." ON) 513option(LLVM_BUILD_RUNTIMES 514 "Build the LLVM runtimes. If OFF, just generate build targets." ON) 515 516option(LLVM_BUILD_RUNTIME 517 "Build the LLVM runtime libraries." ON) 518option(LLVM_BUILD_EXAMPLES 519 "Build the LLVM example programs. If OFF, just generate build targets." OFF) 520option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON) 521 522option(LLVM_BUILD_TESTS 523 "Build LLVM unit tests. If OFF, just generate build targets." OFF) 524option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON) 525option(LLVM_INCLUDE_GO_TESTS "Include the Go bindings tests in test build targets." ON) 526 527option (LLVM_BUILD_DOCS "Build the llvm documentation." OFF) 528option (LLVM_INCLUDE_DOCS "Generate build targets for llvm documentation." ON) 529option (LLVM_ENABLE_DOXYGEN "Use doxygen to generate llvm API documentation." OFF) 530option (LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF) 531option (LLVM_ENABLE_OCAMLDOC "Build OCaml bindings documentation." ON) 532option (LLVM_ENABLE_BINDINGS "Build bindings." ON) 533 534set(LLVM_INSTALL_DOXYGEN_HTML_DIR "share/doc/llvm/doxygen-html" 535 CACHE STRING "Doxygen-generated HTML documentation install directory") 536set(LLVM_INSTALL_OCAMLDOC_HTML_DIR "share/doc/llvm/ocaml-html" 537 CACHE STRING "OCamldoc-generated HTML documentation install directory") 538 539option (LLVM_BUILD_EXTERNAL_COMPILER_RT 540 "Build compiler-rt as an external project." OFF) 541 542option (LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO 543 "Show target and host info when tools are invoked with --version." ON) 544 545# You can configure which libraries from LLVM you want to include in the 546# shared library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited 547# list of LLVM components. All component names handled by llvm-config are valid. 548if(NOT DEFINED LLVM_DYLIB_COMPONENTS) 549 set(LLVM_DYLIB_COMPONENTS "all" CACHE STRING 550 "Semicolon-separated list of components to include in libLLVM, or \"all\".") 551endif() 552option(LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF) 553option(LLVM_BUILD_LLVM_C_DYLIB "Build libllvm-c re-export library (Darwin Only)" OFF) 554set(LLVM_BUILD_LLVM_DYLIB_default OFF) 555if(LLVM_LINK_LLVM_DYLIB OR LLVM_BUILD_LLVM_C_DYLIB) 556 set(LLVM_BUILD_LLVM_DYLIB_default ON) 557endif() 558option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${LLVM_BUILD_LLVM_DYLIB_default}) 559 560option(LLVM_OPTIMIZED_TABLEGEN "Force TableGen to be built with optimization" OFF) 561if(CMAKE_CROSSCOMPILING OR (LLVM_OPTIMIZED_TABLEGEN AND (LLVM_ENABLE_ASSERTIONS OR CMAKE_CONFIGURATION_TYPES))) 562 set(LLVM_USE_HOST_TOOLS ON) 563endif() 564 565if (MSVC_IDE AND NOT (MSVC_VERSION LESS 1900)) 566 option(LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION "Configure project to use Visual Studio native visualizers" TRUE) 567else() 568 set(LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION FALSE CACHE INTERNAL "For Visual Studio 2013, manually copy natvis files to Documents\\Visual Studio 2013\\Visualizers" FORCE) 569endif() 570 571if (LLVM_BUILD_INSTRUMENTED OR LLVM_BUILD_INSTRUMENTED_COVERAGE OR 572 LLVM_ENABLE_IR_PGO) 573 if(NOT LLVM_PROFILE_MERGE_POOL_SIZE) 574 # A pool size of 1-2 is probably sufficient on a SSD. 3-4 should be fine 575 # for spining disks. Anything higher may only help on slower mediums. 576 set(LLVM_PROFILE_MERGE_POOL_SIZE "4") 577 endif() 578 if(NOT LLVM_PROFILE_FILE_PATTERN) 579 if(NOT LLVM_PROFILE_DATA_DIR) 580 file(TO_NATIVE_PATH "${LLVM_BINARY_DIR}/profiles" LLVM_PROFILE_DATA_DIR) 581 endif() 582 file(TO_NATIVE_PATH "${LLVM_PROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_PROFILE_FILE_PATTERN) 583 endif() 584endif() 585 586if (LLVM_BUILD_STATIC) 587 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") 588endif() 589 590# Override the default target with an environment variable named by LLVM_TARGET_TRIPLE_ENV. 591set(LLVM_TARGET_TRIPLE_ENV CACHE STRING "The name of environment variable to override default target. Disabled by blank.") 592mark_as_advanced(LLVM_TARGET_TRIPLE_ENV) 593 594set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR OFF CACHE BOOL 595 "Enable per-target runtimes directory") 596 597# All options referred to from HandleLLVMOptions have to be specified 598# BEFORE this include, otherwise options will not be correctly set on 599# first cmake run 600include(config-ix) 601 602string(REPLACE "Native" ${LLVM_NATIVE_ARCH} 603 LLVM_TARGETS_TO_BUILD "${LLVM_TARGETS_TO_BUILD}") 604list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD) 605 606# By default, we target the host, but this can be overridden at CMake 607# invocation time. 608set(LLVM_DEFAULT_TARGET_TRIPLE "${LLVM_HOST_TRIPLE}" CACHE STRING 609 "Default target for which LLVM will generate code." ) 610set(TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}") 611message(STATUS "LLVM host triple: ${LLVM_HOST_TRIPLE}") 612message(STATUS "LLVM default target triple: ${LLVM_DEFAULT_TARGET_TRIPLE}") 613 614include(HandleLLVMOptions) 615 616# Verify that we can find a Python 2 interpreter. Python 3 is unsupported. 617# FIXME: We should support systems with only Python 3, but that requires work 618# on LLDB. 619set(Python_ADDITIONAL_VERSIONS 2.7) 620include(FindPythonInterp) 621if( NOT PYTHONINTERP_FOUND ) 622 message(FATAL_ERROR 623"Unable to find Python interpreter, required for builds and testing. 624 625Please install Python or specify the PYTHON_EXECUTABLE CMake variable.") 626endif() 627 628if( ${PYTHON_VERSION_STRING} VERSION_LESS 2.7 ) 629 message(FATAL_ERROR "Python 2.7 or newer is required") 630endif() 631 632###### 633# LLVMBuild Integration 634# 635# We use llvm-build to generate all the data required by the CMake based 636# build system in one swoop: 637# 638# - We generate a file (a CMake fragment) in the object root which contains 639# all the definitions that are required by CMake. 640# 641# - We generate the library table used by llvm-config. 642# 643# - We generate the dependencies for the CMake fragment, so that we will 644# automatically reconfigure outselves. 645 646set(LLVMBUILDTOOL "${LLVM_MAIN_SRC_DIR}/utils/llvm-build/llvm-build") 647set(LLVMCONFIGLIBRARYDEPENDENCIESINC 648 "${LLVM_BINARY_DIR}/tools/llvm-config/LibraryDependencies.inc") 649set(LLVMBUILDCMAKEFRAG 650 "${LLVM_BINARY_DIR}/LLVMBuild.cmake") 651 652# Create the list of optional components that are enabled 653if (LLVM_USE_INTEL_JITEVENTS) 654 set(LLVMOPTIONALCOMPONENTS IntelJITEvents) 655endif (LLVM_USE_INTEL_JITEVENTS) 656if (LLVM_USE_OPROFILE) 657 set(LLVMOPTIONALCOMPONENTS ${LLVMOPTIONALCOMPONENTS} OProfileJIT) 658endif (LLVM_USE_OPROFILE) 659if (LLVM_USE_PERF) 660 set(LLVMOPTIONALCOMPONENTS ${LLVMOPTIONALCOMPONENTS} PerfJITEvents) 661endif (LLVM_USE_PERF) 662 663message(STATUS "Constructing LLVMBuild project information") 664execute_process( 665 COMMAND ${PYTHON_EXECUTABLE} -B ${LLVMBUILDTOOL} 666 --native-target "${LLVM_NATIVE_ARCH}" 667 --enable-targets "${LLVM_TARGETS_TO_BUILD}" 668 --enable-optional-components "${LLVMOPTIONALCOMPONENTS}" 669 --write-library-table ${LLVMCONFIGLIBRARYDEPENDENCIESINC} 670 --write-cmake-fragment ${LLVMBUILDCMAKEFRAG} 671 OUTPUT_VARIABLE LLVMBUILDOUTPUT 672 ERROR_VARIABLE LLVMBUILDERRORS 673 OUTPUT_STRIP_TRAILING_WHITESPACE 674 ERROR_STRIP_TRAILING_WHITESPACE 675 RESULT_VARIABLE LLVMBUILDRESULT) 676 677# On Win32, CMake doesn't properly handle piping the default output/error 678# streams into the GUI console. So, we explicitly catch and report them. 679if( NOT "${LLVMBUILDOUTPUT}" STREQUAL "") 680 message(STATUS "llvm-build output: ${LLVMBUILDOUTPUT}") 681endif() 682if( NOT "${LLVMBUILDRESULT}" STREQUAL "0" ) 683 message(FATAL_ERROR 684 "Unexpected failure executing llvm-build: ${LLVMBUILDERRORS}") 685endif() 686 687# Include the generated CMake fragment. This will define properties from the 688# LLVMBuild files in a format which is easy to consume from CMake, and will add 689# the dependencies so that CMake will reconfigure properly when the LLVMBuild 690# files change. 691include(${LLVMBUILDCMAKEFRAG}) 692 693###### 694 695# Configure all of the various header file fragments LLVM uses which depend on 696# configuration variables. 697set(LLVM_ENUM_TARGETS "") 698set(LLVM_ENUM_ASM_PRINTERS "") 699set(LLVM_ENUM_ASM_PARSERS "") 700set(LLVM_ENUM_DISASSEMBLERS "") 701foreach(t ${LLVM_TARGETS_TO_BUILD}) 702 set( td ${LLVM_MAIN_SRC_DIR}/lib/Target/${t} ) 703 704 list(FIND LLVM_ALL_TARGETS ${t} idx) 705 list(FIND LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ${t} idy) 706 # At this point, LLVMBUILDTOOL already checked all the targets passed in 707 # LLVM_TARGETS_TO_BUILD and LLVM_EXPERIMENTAL_TARGETS_TO_BUILD, so 708 # this test just makes sure that any experimental targets were passed via 709 # LLVM_EXPERIMENTAL_TARGETS_TO_BUILD, not LLVM_TARGETS_TO_BUILD. 710 if( idx LESS 0 AND idy LESS 0 ) 711 message(FATAL_ERROR "The target `${t}' is experimental and must be passed " 712 "via LLVM_EXPERIMENTAL_TARGETS_TO_BUILD.") 713 else() 714 set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${t})\n") 715 endif() 716 717 file(GLOB asmp_file "${td}/*AsmPrinter.cpp") 718 if( asmp_file ) 719 set(LLVM_ENUM_ASM_PRINTERS 720 "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n") 721 endif() 722 if( EXISTS ${td}/AsmParser/CMakeLists.txt ) 723 set(LLVM_ENUM_ASM_PARSERS 724 "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n") 725 endif() 726 if( EXISTS ${td}/Disassembler/CMakeLists.txt ) 727 set(LLVM_ENUM_DISASSEMBLERS 728 "${LLVM_ENUM_DISASSEMBLERS}LLVM_DISASSEMBLER(${t})\n") 729 endif() 730endforeach(t) 731 732# Produce the target definition files, which provide a way for clients to easily 733# include various classes of targets. 734configure_file( 735 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in 736 ${LLVM_INCLUDE_DIR}/llvm/Config/AsmPrinters.def 737 ) 738configure_file( 739 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in 740 ${LLVM_INCLUDE_DIR}/llvm/Config/AsmParsers.def 741 ) 742configure_file( 743 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in 744 ${LLVM_INCLUDE_DIR}/llvm/Config/Disassemblers.def 745 ) 746configure_file( 747 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in 748 ${LLVM_INCLUDE_DIR}/llvm/Config/Targets.def 749 ) 750 751# Configure the three LLVM configuration header files. 752configure_file( 753 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/config.h.cmake 754 ${LLVM_INCLUDE_DIR}/llvm/Config/config.h) 755configure_file( 756 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/llvm-config.h.cmake 757 ${LLVM_INCLUDE_DIR}/llvm/Config/llvm-config.h) 758configure_file( 759 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/abi-breaking.h.cmake 760 ${LLVM_INCLUDE_DIR}/llvm/Config/abi-breaking.h) 761 762# Add target for generating source rpm package. 763set(LLVM_SRPM_USER_BINARY_SPECFILE ${CMAKE_CURRENT_SOURCE_DIR}/llvm.spec.in 764 CACHE FILEPATH ".spec file to use for srpm generation") 765set(LLVM_SRPM_BINARY_SPECFILE ${CMAKE_CURRENT_BINARY_DIR}/llvm.spec) 766set(LLVM_SRPM_DIR "${CMAKE_CURRENT_BINARY_DIR}/srpm") 767 768# SVN_REVISION and GIT_COMMIT get set by the call to add_version_info_from_vcs. 769# DUMMY_VAR contains a version string which we don't care about. 770add_version_info_from_vcs(DUMMY_VAR) 771if ( SVN_REVISION ) 772 set(LLVM_RPM_SPEC_REVISION "r${SVN_REVISION}") 773elseif ( GIT_COMMIT ) 774 set (LLVM_RPM_SPEC_REVISION "g${GIT_COMMIT}") 775endif() 776 777configure_file( 778 ${LLVM_SRPM_USER_BINARY_SPECFILE} 779 ${LLVM_SRPM_BINARY_SPECFILE} @ONLY) 780 781add_custom_target(srpm 782 COMMAND cpack -G TGZ --config CPackSourceConfig.cmake -B ${LLVM_SRPM_DIR}/SOURCES 783 COMMAND rpmbuild -bs --define '_topdir ${LLVM_SRPM_DIR}' ${LLVM_SRPM_BINARY_SPECFILE}) 784set_target_properties(srpm PROPERTIES FOLDER "Misc") 785 786 787# They are not referenced. See set_output_directory(). 788set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/bin ) 789set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} ) 790set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} ) 791 792if(APPLE AND DARWIN_LTO_LIBRARY) 793 set(CMAKE_EXE_LINKER_FLAGS 794 "${CMAKE_EXE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}") 795 set(CMAKE_SHARED_LINKER_FLAGS 796 "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}") 797 set(CMAKE_MODULE_LINKER_FLAGS 798 "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}") 799endif() 800 801# Work around a broken bfd ld behavior. When linking a binary with a 802# foo.so library, it will try to find any library that foo.so uses and 803# check its symbols. This is wasteful (the check was done when foo.so 804# was created) and can fail since it is not the dynamic linker and 805# doesn't know how to handle search paths correctly. 806if (UNIX AND NOT APPLE AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS|AIX") 807 set(CMAKE_EXE_LINKER_FLAGS 808 "${CMAKE_EXE_LINKER_FLAGS} -Wl,-allow-shlib-undefined") 809endif() 810 811set(CMAKE_INCLUDE_CURRENT_DIR ON) 812 813include_directories( ${LLVM_INCLUDE_DIR} ${LLVM_MAIN_INCLUDE_DIR}) 814 815# when crosscompiling import the executable targets from a file 816if(LLVM_USE_HOST_TOOLS) 817 include(CrossCompile) 818endif(LLVM_USE_HOST_TOOLS) 819if(LLVM_TARGET_IS_CROSSCOMPILE_HOST) 820# Dummy use to avoid CMake Warning: Manually-specified variables were not used 821# (this is a variable that CrossCompile sets on recursive invocations) 822endif() 823 824if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)") 825 # On FreeBSD, /usr/local/* is not used by default. In order to build LLVM 826 # with libxml2, iconv.h, etc., we must add /usr/local paths. 827 include_directories(SYSTEM "/usr/local/include") 828 link_directories("/usr/local/lib") 829endif(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)") 830 831if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS ) 832 # special hack for Solaris to handle crazy system sys/regset.h 833 include_directories("${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/Solaris") 834endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS ) 835 836# Make sure we don't get -rdynamic in every binary. For those that need it, 837# use export_executable_symbols(target). 838set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") 839 840set(LLVM_PROFDATA_FILE "" CACHE FILEPATH 841 "Profiling data file to use when compiling in order to improve runtime performance.") 842 843if(LLVM_PROFDATA_FILE AND EXISTS ${LLVM_PROFDATA_FILE}) 844 if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) 845 add_definitions("-fprofile-instr-use=${LLVM_PROFDATA_FILE}") 846 else() 847 message(FATAL_ERROR "LLVM_PROFDATA_FILE can only be specified when compiling with clang") 848 endif() 849endif() 850 851include(AddLLVM) 852include(TableGen) 853 854if( MINGW AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) 855 # People report that -O3 is unreliable on MinGW. The traditional 856 # build also uses -O2 for that reason: 857 llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2") 858endif() 859 860# Put this before tblgen. Else we have a circular dependence. 861add_subdirectory(lib/Demangle) 862add_subdirectory(lib/Support) 863add_subdirectory(lib/TableGen) 864 865add_subdirectory(utils/TableGen) 866 867add_subdirectory(include/llvm) 868 869add_subdirectory(lib) 870 871if( LLVM_INCLUDE_UTILS ) 872 add_subdirectory(utils/FileCheck) 873 add_subdirectory(utils/PerfectShuffle) 874 add_subdirectory(utils/count) 875 add_subdirectory(utils/not) 876 add_subdirectory(utils/yaml-bench) 877else() 878 if ( LLVM_INCLUDE_TESTS ) 879 message(FATAL_ERROR "Including tests when not building utils will not work. 880 Either set LLVM_INCLUDE_UTILS to On, or set LLVM_INCLDE_TESTS to Off.") 881 endif() 882endif() 883 884# Use LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION instead of LLVM_INCLUDE_UTILS because it is not really a util 885if (LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION) 886 add_subdirectory(utils/LLVMVisualizers) 887endif() 888 889foreach( binding ${LLVM_BINDINGS_LIST} ) 890 if( EXISTS "${LLVM_MAIN_SRC_DIR}/bindings/${binding}/CMakeLists.txt" ) 891 add_subdirectory(bindings/${binding}) 892 endif() 893endforeach() 894 895add_subdirectory(projects) 896 897if( LLVM_INCLUDE_TOOLS ) 898 add_subdirectory(tools) 899endif() 900 901if( LLVM_INCLUDE_RUNTIMES ) 902 add_subdirectory(runtimes) 903endif() 904 905if( LLVM_INCLUDE_EXAMPLES ) 906 add_subdirectory(examples) 907endif() 908 909if( LLVM_INCLUDE_TESTS ) 910 if(EXISTS ${LLVM_MAIN_SRC_DIR}/projects/test-suite AND TARGET clang) 911 include(LLVMExternalProjectUtils) 912 llvm_ExternalProject_Add(test-suite ${LLVM_MAIN_SRC_DIR}/projects/test-suite 913 USE_TOOLCHAIN 914 EXCLUDE_FROM_ALL 915 NO_INSTALL 916 ALWAYS_CLEAN) 917 endif() 918 add_subdirectory(utils/lit) 919 add_subdirectory(test) 920 add_subdirectory(unittests) 921 if( LLVM_INCLUDE_UTILS ) 922 add_subdirectory(utils/unittest) 923 endif() 924 925 if (WIN32) 926 # This utility is used to prevent crashing tests from calling Dr. Watson on 927 # Windows. 928 add_subdirectory(utils/KillTheDoctor) 929 endif() 930 931 # Add a global check rule now that all subdirectories have been traversed 932 # and we know the total set of lit testsuites. 933 get_property(LLVM_LIT_TESTSUITES GLOBAL PROPERTY LLVM_LIT_TESTSUITES) 934 get_property(LLVM_LIT_PARAMS GLOBAL PROPERTY LLVM_LIT_PARAMS) 935 get_property(LLVM_LIT_DEPENDS GLOBAL PROPERTY LLVM_LIT_DEPENDS) 936 get_property(LLVM_LIT_EXTRA_ARGS GLOBAL PROPERTY LLVM_LIT_EXTRA_ARGS) 937 get_property(LLVM_ADDITIONAL_TEST_TARGETS 938 GLOBAL PROPERTY LLVM_ADDITIONAL_TEST_TARGETS) 939 get_property(LLVM_ADDITIONAL_TEST_DEPENDS 940 GLOBAL PROPERTY LLVM_ADDITIONAL_TEST_DEPENDS) 941 add_lit_target(check-all 942 "Running all regression tests" 943 ${LLVM_LIT_TESTSUITES} 944 PARAMS ${LLVM_LIT_PARAMS} 945 DEPENDS ${LLVM_LIT_DEPENDS} ${LLVM_ADDITIONAL_TEST_TARGETS} 946 ARGS ${LLVM_LIT_EXTRA_ARGS} 947 ) 948 if(TARGET check-runtimes) 949 add_dependencies(check-all check-runtimes) 950 endif() 951 add_custom_target(test-depends 952 DEPENDS ${LLVM_LIT_DEPENDS} ${LLVM_ADDITIONAL_TEST_DEPENDS}) 953 set_target_properties(test-depends PROPERTIES FOLDER "Tests") 954endif() 955 956if (LLVM_INCLUDE_DOCS) 957 add_subdirectory(docs) 958endif() 959 960add_subdirectory(cmake/modules) 961 962# Do this last so that all lit targets have already been created. 963if (LLVM_INCLUDE_UTILS) 964 add_subdirectory(utils/llvm-lit) 965endif() 966 967if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) 968 install(DIRECTORY include/llvm include/llvm-c 969 DESTINATION include 970 COMPONENT llvm-headers 971 FILES_MATCHING 972 PATTERN "*.def" 973 PATTERN "*.h" 974 PATTERN "*.td" 975 PATTERN "*.inc" 976 PATTERN "LICENSE.TXT" 977 PATTERN ".svn" EXCLUDE 978 ) 979 980 install(DIRECTORY ${LLVM_INCLUDE_DIR}/llvm ${LLVM_INCLUDE_DIR}/llvm-c 981 DESTINATION include 982 COMPONENT llvm-headers 983 FILES_MATCHING 984 PATTERN "*.def" 985 PATTERN "*.h" 986 PATTERN "*.gen" 987 PATTERN "*.inc" 988 # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def" 989 PATTERN "CMakeFiles" EXCLUDE 990 PATTERN "config.h" EXCLUDE 991 PATTERN ".svn" EXCLUDE 992 ) 993 994 # Installing the headers needs to depend on generating any public 995 # tablegen'd headers. 996 add_custom_target(llvm-headers DEPENDS intrinsics_gen) 997 set_target_properties(llvm-headers PROPERTIES FOLDER "Misc") 998 999 if (NOT CMAKE_CONFIGURATION_TYPES) 1000 add_llvm_install_targets(install-llvm-headers 1001 DEPENDS llvm-headers 1002 COMPONENT llvm-headers) 1003 endif() 1004endif() 1005 1006# This must be at the end of the LLVM root CMakeLists file because it must run 1007# after all targets are created. 1008if(LLVM_DISTRIBUTION_COMPONENTS) 1009 if(CMAKE_CONFIGURATION_TYPES) 1010 message(FATAL_ERROR "LLVM_DISTRIBUTION_COMPONENTS cannot be specified with multi-configuration generators (i.e. Xcode or Visual Studio)") 1011 endif() 1012 1013 add_custom_target(distribution) 1014 add_custom_target(install-distribution) 1015 add_custom_target(install-distribution-stripped) 1016 foreach(target ${LLVM_DISTRIBUTION_COMPONENTS} ${LLVM_RUNTIME_DISTRIBUTION_COMPONENTS}) 1017 if(TARGET ${target}) 1018 add_dependencies(distribution ${target}) 1019 else() 1020 message(SEND_ERROR "Specified distribution component '${target}' doesn't have a target") 1021 endif() 1022 1023 if(TARGET install-${target}) 1024 add_dependencies(install-distribution install-${target}) 1025 else() 1026 message(SEND_ERROR "Specified distribution component '${target}' doesn't have an install target") 1027 endif() 1028 1029 if(TARGET install-${target}-stripped) 1030 add_dependencies(install-distribution-stripped install-${target}-stripped) 1031 else() 1032 message(SEND_ERROR "Specified distribution component '${target}' doesn't have an install-stripped target." 1033 " Its installation target creation should be changed to use add_llvm_install_targets," 1034 " or you should manually create the 'install-${target}-stripped' target.") 1035 endif() 1036 endforeach() 1037endif() 1038 1039# This allows us to deploy the Universal CRT DLLs by passing -DCMAKE_INSTALL_UCRT_LIBRARIES=ON to CMake 1040if (MSVC AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows" AND CMAKE_INSTALL_UCRT_LIBRARIES) 1041 include(InstallRequiredSystemLibraries) 1042endif() 1043