Home | History | Annotate | Download | only in llvm
      1 # See docs/CMake.html for instructions about how to build LLVM with CMake.
      2 
      3 cmake_minimum_required(VERSION 3.4.3)
      4 
      5 cmake_policy(SET CMP0022 NEW)
      6 
      7 cmake_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.
     14 cmake_policy(SET CMP0051 OLD)
     15 
     16 cmake_policy(SET CMP0056 NEW)
     17 
     18 cmake_policy(SET CMP0057 NEW)
     19 
     20 if(POLICY CMP0068)
     21   cmake_policy(SET CMP0068 NEW)
     22   set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
     23 endif()
     24 
     25 if(NOT DEFINED LLVM_VERSION_MAJOR)
     26   set(LLVM_VERSION_MAJOR 7)
     27 endif()
     28 if(NOT DEFINED LLVM_VERSION_MINOR)
     29   set(LLVM_VERSION_MINOR 0)
     30 endif()
     31 if(NOT DEFINED LLVM_VERSION_PATCH)
     32   set(LLVM_VERSION_PATCH 1)
     33 endif()
     34 if(NOT DEFINED LLVM_VERSION_SUFFIX)
     35   set(LLVM_VERSION_SUFFIX "")
     36 endif()
     37 
     38 if (NOT PACKAGE_VERSION)
     39   set(PACKAGE_VERSION
     40     "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}")
     41 endif()
     42 
     43 if ((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.")
     48 endif()
     49 
     50 project(LLVM
     51   VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}
     52   LANGUAGES C CXX ASM)
     53 
     54 if (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)
     57 endif()
     58 
     59 # This should only apply if you are both on an Apple host, and targeting Apple.
     60 if(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()
    112 endif()
    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.
    118 set(LLVM_ALL_PROJECTS "clang;libcxx;libcxxabi;lldb;compiler-rt;lld;polly;debuginfo-tests")
    119 set(LLVM_ENABLE_PROJECTS "" CACHE STRING
    120 	"Semicolon-separated list of projects to build (${LLVM_ALL_PROJECTS}), or \"all\".")
    121 if( LLVM_ENABLE_PROJECTS STREQUAL "all" )
    122   set( LLVM_ENABLE_PROJECTS ${LLVM_ALL_PROJECTS})
    123 endif()
    124 foreach(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()
    138 endforeach()
    139 
    140 # Build llvm with ccache if the package is present
    141 set(LLVM_CCACHE_BUILD OFF CACHE BOOL "Set to ON for a ccache enabled build")
    142 if(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()
    161 endif()
    162 
    163 option(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.
    168 if(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()
    175 endif()
    176 
    177 option(LLVM_ENABLE_DAGISEL_COV "Debug: Prints tablegen patterns that were used for selecting" OFF)
    178 option(LLVM_ENABLE_GISEL_COV "Enable collection of GlobalISel rule coverage" OFF)
    179 if(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")
    181 endif()
    182 
    183 # Add path for custom modules
    184 set(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.
    192 set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
    193 
    194 option(LLVM_INSTALL_BINUTILS_SYMLINKS
    195   "Install symlinks from the binutils tool names to the corresponding LLVM tools." OFF)
    196 
    197 option(LLVM_INSTALL_UTILS "Include utility binaries in the 'install' target." OFF)
    198 
    199 option(LLVM_INSTALL_TOOLCHAIN_ONLY "Only include toolchain files in the 'install' target." OFF)
    200 
    201 option(LLVM_USE_FOLDERS "Enable solution folders in Visual Studio. Disable for Express versions." ON)
    202 if ( LLVM_USE_FOLDERS )
    203   set_property(GLOBAL PROPERTY USE_FOLDERS ON)
    204 endif()
    205 
    206 include(VersionFromVCS)
    207 
    208 option(LLVM_APPEND_VC_REV
    209   "Embed the version control system revision id in LLVM" ON)
    210 
    211 set(PACKAGE_NAME LLVM)
    212 set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
    213 set(PACKAGE_BUGREPORT "https://bugs.llvm.org/")
    214 
    215 set(BUG_REPORT_URL "${PACKAGE_BUGREPORT}" CACHE STRING
    216   "Default URL where bug reports are to be submitted.")
    217 
    218 # Configure CPack.
    219 set(CPACK_PACKAGE_INSTALL_DIRECTORY "LLVM")
    220 set(CPACK_PACKAGE_VENDOR "LLVM")
    221 set(CPACK_PACKAGE_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
    222 set(CPACK_PACKAGE_VERSION_MINOR ${LLVM_VERSION_MINOR})
    223 set(CPACK_PACKAGE_VERSION_PATCH ${LLVM_VERSION_PATCH})
    224 set(CPACK_PACKAGE_VERSION ${PACKAGE_VERSION})
    225 set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.TXT")
    226 set(CPACK_NSIS_COMPRESSOR "/SOLID lzma \r\n SetCompressorDictSize 32")
    227 if(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()
    237 endif()
    238 include(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).
    245 if( CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR AND NOT MSVC_IDE )
    246   message(FATAL_ERROR "In-source builds are not allowed.
    247 CMake would overwrite the makefiles distributed with LLVM.
    248 Please create a directory and run cmake from there, passing the path
    249 to this source directory as the last argument.
    250 This process created the file `CMakeCache.txt' and the directory `CMakeFiles'.
    251 Please delete them.")
    252 endif()
    253 if( 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,
    262 probably as the result of running `configure' and `make' on
    263 ${CMAKE_CURRENT_SOURCE_DIR}.
    264 This may cause problems. The suspicious files are:
    265 ${tablegenned_files_on_lib_dir}
    266 ${tablegenned_files_on_include_dir}
    267 Please clean the source directory.")
    268   endif()
    269 endif()
    270 
    271 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
    272 
    273 if (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}")
    276 endif()
    277 
    278 set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" )
    279 
    280 set(LLVM_TOOLS_INSTALL_DIR "bin" CACHE STRING "Path for binary subdirectory (defaults to 'bin')")
    281 mark_as_advanced(LLVM_TOOLS_INSTALL_DIR)
    282 
    283 set(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)")
    285 mark_as_advanced(LLVM_UTILS_INSTALL_DIR)
    286 
    287 # They are used as destination of target generators.
    288 set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
    289 set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
    290 if(WIN32 OR CYGWIN)
    291   # DLL platform -- put DLLs into bin.
    292   set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR})
    293 else()
    294   set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
    295 endif()
    296 
    297 # Each of them corresponds to llvm-config's.
    298 set(LLVM_TOOLS_BINARY_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) # --bindir
    299 set(LLVM_LIBRARY_DIR      ${LLVM_LIBRARY_OUTPUT_INTDIR}) # --libdir
    300 set(LLVM_MAIN_SRC_DIR     ${CMAKE_CURRENT_SOURCE_DIR}  ) # --src-root
    301 set(LLVM_MAIN_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/include ) # --includedir
    302 set(LLVM_BINARY_DIR       ${CMAKE_CURRENT_BINARY_DIR}  ) # --prefix
    303 
    304 # Note: LLVM_CMAKE_PATH does not include generated files
    305 set(LLVM_CMAKE_PATH ${LLVM_MAIN_SRC_DIR}/cmake/modules)
    306 set(LLVM_EXAMPLES_BINARY_DIR ${LLVM_BINARY_DIR}/examples)
    307 set(LLVM_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include)
    308 
    309 # List of all targets to be built by default:
    310 set(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:
    328 set(LLVM_TARGETS_WITH_JIT X86 PowerPC AArch64 ARM Mips SystemZ)
    329 
    330 set(LLVM_TARGETS_TO_BUILD "all"
    331     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
    332 
    333 set(LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ""
    334   CACHE STRING "Semicolon-separated list of experimental targets to build.")
    335 
    336 option(BUILD_SHARED_LIBS
    337   "Build all libraries as shared libraries instead of static" OFF)
    338 
    339 option(LLVM_ENABLE_BACKTRACES "Enable embedding backtraces on crash." ON)
    340 if(LLVM_ENABLE_BACKTRACES)
    341   set(ENABLE_BACKTRACES 1)
    342 endif()
    343 
    344 option(LLVM_ENABLE_CRASH_OVERRIDES "Enable crash overrides." ON)
    345 if(LLVM_ENABLE_CRASH_OVERRIDES)
    346   set(ENABLE_CRASH_OVERRIDES 1)
    347 endif()
    348 
    349 option(LLVM_ENABLE_FFI "Use libffi to call external functions from the interpreter" OFF)
    350 set(FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so")
    351 set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h")
    352 
    353 set(LLVM_TARGET_ARCH "host"
    354   CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
    355 
    356 option(LLVM_ENABLE_TERMINFO "Use terminfo database if available." ON)
    357 
    358 set(LLVM_ENABLE_LIBXML2 "ON" CACHE STRING "Use libxml2 if available. Can be ON, OFF, or FORCE_ON")
    359 
    360 option(LLVM_ENABLE_LIBEDIT "Use libedit if available." ON)
    361 
    362 option(LLVM_ENABLE_LIBPFM "Use libpfm for performance counters if available." ON)
    363 
    364 option(LLVM_ENABLE_THREADS "Use threads if available." ON)
    365 
    366 option(LLVM_ENABLE_ZLIB "Use zlib for compression/decompression if available." ON)
    367 
    368 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
    369   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
    370 endif()
    371 
    372 set(LLVM_TARGETS_TO_BUILD
    373    ${LLVM_TARGETS_TO_BUILD}
    374    ${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD})
    375 list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD)
    376 
    377 option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
    378 option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON)
    379 option(LLVM_ENABLE_MODULES "Compile with C++ modules enabled." OFF)
    380 if(${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)
    383 else()
    384   option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." OFF)
    385   option(LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY "Compile with -fmodules-local-submodule-visibility." ON)
    386 endif()
    387 option(LLVM_ENABLE_CXX1Y "Compile with C++1y enabled." OFF)
    388 option(LLVM_ENABLE_CXX1Z "Compile with C++1z enabled." OFF)
    389 option(LLVM_ENABLE_LIBCXX "Use libc++ if available." OFF)
    390 option(LLVM_ENABLE_LLD "Use lld as C and C++ linker." OFF)
    391 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
    392 option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
    393 
    394 option(LLVM_ENABLE_DUMP "Enable dump functions even when assertions are disabled" OFF)
    395 
    396 if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" )
    397   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
    398 else()
    399   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
    400 endif()
    401 
    402 option(LLVM_ENABLE_EXPENSIVE_CHECKS "Enable expensive checks" OFF)
    403 
    404 set(LLVM_ABI_BREAKING_CHECKS "WITH_ASSERTS" CACHE STRING
    405   "Enable abi-breaking checks.  Can be WITH_ASSERTS, FORCE_ON or FORCE_OFF.")
    406 
    407 option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN
    408        "Set to ON to force using an old, unsupported host toolchain." OFF)
    409 
    410 option(LLVM_USE_INTEL_JITEVENTS
    411   "Use Intel JIT API to inform Intel(R) VTune(TM) Amplifier XE 2011 about JIT code"
    412   OFF)
    413 
    414 if( 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()
    420 endif( LLVM_USE_INTEL_JITEVENTS )
    421 
    422 option(LLVM_USE_OPROFILE
    423   "Use opagent JIT interface to inform OProfile about JIT code" OFF)
    424 
    425 option(LLVM_EXTERNALIZE_DEBUGINFO
    426   "Generate dSYM files and strip executables and libraries (Darwin Only)" OFF)
    427 
    428 option(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.
    432 if( 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" )
    436 endif( LLVM_USE_OPROFILE )
    437 
    438 option(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.
    442 if( 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" )
    446 endif( LLVM_USE_PERF )
    447 
    448 set(LLVM_USE_SANITIZER "" CACHE STRING
    449   "Define the sanitizer used to build binaries and tests.")
    450 option(LLVM_OPTIMIZE_SANITIZED_BUILDS "Pass -O1 on debug sanitizer builds" ON)
    451 set(LLVM_LIB_FUZZING_ENGINE "" CACHE PATH
    452   "Path to fuzzing library for linking with fuzz targets")
    453 
    454 option(LLVM_USE_SPLIT_DWARF
    455   "Use -gsplit-dwarf when compiling llvm." OFF)
    456 
    457 option(LLVM_POLLY_LINK_INTO_TOOLS "Statically link Polly into tools (if available)" ON)
    458 option(LLVM_POLLY_BUILD "Build LLVM with Polly" ON)
    459 
    460 if (EXISTS ${LLVM_MAIN_SRC_DIR}/tools/polly/CMakeLists.txt)
    461   set(POLLY_IN_TREE TRUE)
    462 elseif(LLVM_EXTERNAL_POLLY_SOURCE_DIR)
    463   set(POLLY_IN_TREE TRUE)
    464 else()
    465   set(POLLY_IN_TREE FALSE)
    466 endif()
    467 
    468 if (LLVM_POLLY_BUILD AND POLLY_IN_TREE)
    469   set(WITH_POLLY ON)
    470 else()
    471   set(WITH_POLLY OFF)
    472 endif()
    473 
    474 if (LLVM_POLLY_LINK_INTO_TOOLS AND WITH_POLLY)
    475   set(LINK_POLLY_INTO_TOOLS ON)
    476 else()
    477   set(LINK_POLLY_INTO_TOOLS OFF)
    478 endif()
    479 
    480 # Define an option controlling whether we should build for 32-bit on 64-bit
    481 # platforms, where supported.
    482 if( 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)
    485 endif()
    486 
    487 # Define the default arguments to use with 'lit', and an option for the user to
    488 # override.
    489 set(LIT_ARGS_DEFAULT "-sv")
    490 if (MSVC_IDE OR XCODE)
    491   set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
    492 endif()
    493 set(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.
    496 if( WIN32 AND NOT CYGWIN )
    497   set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
    498 endif()
    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.
    504 option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
    505 option(LLVM_BUILD_TOOLS
    506   "Build the LLVM tools. If OFF, just generate build targets." ON)
    507 
    508 option(LLVM_INCLUDE_UTILS "Generate build targets for the LLVM utils." ON)
    509 option(LLVM_BUILD_UTILS
    510   "Build LLVM utility binaries. If OFF, just generate build targets." ON)
    511 
    512 option(LLVM_INCLUDE_RUNTIMES "Generate build targets for the LLVM runtimes." ON)
    513 option(LLVM_BUILD_RUNTIMES
    514   "Build the LLVM runtimes. If OFF, just generate build targets." ON)
    515 
    516 option(LLVM_BUILD_RUNTIME
    517   "Build the LLVM runtime libraries." ON)
    518 option(LLVM_BUILD_EXAMPLES
    519   "Build the LLVM example programs. If OFF, just generate build targets." OFF)
    520 option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
    521 
    522 option(LLVM_BUILD_TESTS
    523   "Build LLVM unit tests. If OFF, just generate build targets." OFF)
    524 option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
    525 option(LLVM_INCLUDE_GO_TESTS "Include the Go bindings tests in test build targets." ON)
    526 
    527 option (LLVM_BUILD_DOCS "Build the llvm documentation." OFF)
    528 option (LLVM_INCLUDE_DOCS "Generate build targets for llvm documentation." ON)
    529 option (LLVM_ENABLE_DOXYGEN "Use doxygen to generate llvm API documentation." OFF)
    530 option (LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF)
    531 option (LLVM_ENABLE_OCAMLDOC "Build OCaml bindings documentation." ON)
    532 option (LLVM_ENABLE_BINDINGS "Build bindings." ON)
    533 
    534 set(LLVM_INSTALL_DOXYGEN_HTML_DIR "share/doc/llvm/doxygen-html"
    535     CACHE STRING "Doxygen-generated HTML documentation install directory")
    536 set(LLVM_INSTALL_OCAMLDOC_HTML_DIR "share/doc/llvm/ocaml-html"
    537     CACHE STRING "OCamldoc-generated HTML documentation install directory")
    538 
    539 option (LLVM_BUILD_EXTERNAL_COMPILER_RT
    540   "Build compiler-rt as an external project." OFF)
    541 
    542 option (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.
    548 if(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\".")
    551 endif()
    552 option(LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF)
    553 option(LLVM_BUILD_LLVM_C_DYLIB "Build libllvm-c re-export library (Darwin Only)" OFF)
    554 set(LLVM_BUILD_LLVM_DYLIB_default OFF)
    555 if(LLVM_LINK_LLVM_DYLIB OR LLVM_BUILD_LLVM_C_DYLIB)
    556   set(LLVM_BUILD_LLVM_DYLIB_default ON)
    557 endif()
    558 option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${LLVM_BUILD_LLVM_DYLIB_default})
    559 
    560 option(LLVM_OPTIMIZED_TABLEGEN "Force TableGen to be built with optimization" OFF)
    561 if(CMAKE_CROSSCOMPILING OR (LLVM_OPTIMIZED_TABLEGEN AND (LLVM_ENABLE_ASSERTIONS OR CMAKE_CONFIGURATION_TYPES)))
    562   set(LLVM_USE_HOST_TOOLS ON)
    563 endif()
    564 
    565 if (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)
    567 else()
    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)
    569 endif()
    570 
    571 if (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()
    584 endif()
    585 
    586 if (LLVM_BUILD_STATIC)
    587   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
    588 endif()
    589 
    590 # Override the default target with an environment variable named by LLVM_TARGET_TRIPLE_ENV.
    591 set(LLVM_TARGET_TRIPLE_ENV CACHE STRING "The name of environment variable to override default target. Disabled by blank.")
    592 mark_as_advanced(LLVM_TARGET_TRIPLE_ENV)
    593 
    594 set(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
    600 include(config-ix)
    601 
    602 string(REPLACE "Native" ${LLVM_NATIVE_ARCH}
    603   LLVM_TARGETS_TO_BUILD "${LLVM_TARGETS_TO_BUILD}")
    604 list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD)
    605 
    606 # By default, we target the host, but this can be overridden at CMake
    607 # invocation time.
    608 set(LLVM_DEFAULT_TARGET_TRIPLE "${LLVM_HOST_TRIPLE}" CACHE STRING
    609   "Default target for which LLVM will generate code." )
    610 set(TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}")
    611 message(STATUS "LLVM host triple: ${LLVM_HOST_TRIPLE}")
    612 message(STATUS "LLVM default target triple: ${LLVM_DEFAULT_TARGET_TRIPLE}")
    613 
    614 include(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.
    619 set(Python_ADDITIONAL_VERSIONS 2.7)
    620 include(FindPythonInterp)
    621 if( NOT PYTHONINTERP_FOUND )
    622   message(FATAL_ERROR
    623 "Unable to find Python interpreter, required for builds and testing.
    624 
    625 Please install Python or specify the PYTHON_EXECUTABLE CMake variable.")
    626 endif()
    627 
    628 if( ${PYTHON_VERSION_STRING} VERSION_LESS 2.7 )
    629   message(FATAL_ERROR "Python 2.7 or newer is required")
    630 endif()
    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 
    646 set(LLVMBUILDTOOL "${LLVM_MAIN_SRC_DIR}/utils/llvm-build/llvm-build")
    647 set(LLVMCONFIGLIBRARYDEPENDENCIESINC
    648   "${LLVM_BINARY_DIR}/tools/llvm-config/LibraryDependencies.inc")
    649 set(LLVMBUILDCMAKEFRAG
    650   "${LLVM_BINARY_DIR}/LLVMBuild.cmake")
    651 
    652 # Create the list of optional components that are enabled
    653 if (LLVM_USE_INTEL_JITEVENTS)
    654   set(LLVMOPTIONALCOMPONENTS IntelJITEvents)
    655 endif (LLVM_USE_INTEL_JITEVENTS)
    656 if (LLVM_USE_OPROFILE)
    657   set(LLVMOPTIONALCOMPONENTS ${LLVMOPTIONALCOMPONENTS} OProfileJIT)
    658 endif (LLVM_USE_OPROFILE)
    659 if (LLVM_USE_PERF)
    660   set(LLVMOPTIONALCOMPONENTS ${LLVMOPTIONALCOMPONENTS} PerfJITEvents)
    661 endif (LLVM_USE_PERF)
    662 
    663 message(STATUS "Constructing LLVMBuild project information")
    664 execute_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.
    679 if( NOT "${LLVMBUILDOUTPUT}" STREQUAL "")
    680   message(STATUS "llvm-build output: ${LLVMBUILDOUTPUT}")
    681 endif()
    682 if( NOT "${LLVMBUILDRESULT}" STREQUAL "0" )
    683   message(FATAL_ERROR
    684     "Unexpected failure executing llvm-build: ${LLVMBUILDERRORS}")
    685 endif()
    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.
    691 include(${LLVMBUILDCMAKEFRAG})
    692 
    693 ######
    694 
    695 # Configure all of the various header file fragments LLVM uses which depend on
    696 # configuration variables.
    697 set(LLVM_ENUM_TARGETS "")
    698 set(LLVM_ENUM_ASM_PRINTERS "")
    699 set(LLVM_ENUM_ASM_PARSERS "")
    700 set(LLVM_ENUM_DISASSEMBLERS "")
    701 foreach(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()
    730 endforeach(t)
    731 
    732 # Produce the target definition files, which provide a way for clients to easily
    733 # include various classes of targets.
    734 configure_file(
    735   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
    736   ${LLVM_INCLUDE_DIR}/llvm/Config/AsmPrinters.def
    737   )
    738 configure_file(
    739   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
    740   ${LLVM_INCLUDE_DIR}/llvm/Config/AsmParsers.def
    741   )
    742 configure_file(
    743   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in
    744   ${LLVM_INCLUDE_DIR}/llvm/Config/Disassemblers.def
    745   )
    746 configure_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.
    752 configure_file(
    753   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/config.h.cmake
    754   ${LLVM_INCLUDE_DIR}/llvm/Config/config.h)
    755 configure_file(
    756   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/llvm-config.h.cmake
    757   ${LLVM_INCLUDE_DIR}/llvm/Config/llvm-config.h)
    758 configure_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.
    763 set(LLVM_SRPM_USER_BINARY_SPECFILE ${CMAKE_CURRENT_SOURCE_DIR}/llvm.spec.in
    764     CACHE FILEPATH ".spec file to use for srpm generation")
    765 set(LLVM_SRPM_BINARY_SPECFILE ${CMAKE_CURRENT_BINARY_DIR}/llvm.spec)
    766 set(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.
    770 add_version_info_from_vcs(DUMMY_VAR)
    771 if ( SVN_REVISION )
    772   set(LLVM_RPM_SPEC_REVISION "r${SVN_REVISION}")
    773 elseif ( GIT_COMMIT )
    774   set (LLVM_RPM_SPEC_REVISION "g${GIT_COMMIT}")
    775 endif()
    776 
    777 configure_file(
    778   ${LLVM_SRPM_USER_BINARY_SPECFILE}
    779   ${LLVM_SRPM_BINARY_SPECFILE} @ONLY)
    780 
    781 add_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})
    784 set_target_properties(srpm PROPERTIES FOLDER "Misc")
    785 
    786 
    787 # They are not referenced. See set_output_directory().
    788 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/bin )
    789 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
    790 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
    791 
    792 if(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}")
    799 endif()
    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.
    806 if (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")
    809 endif()
    810 
    811 set(CMAKE_INCLUDE_CURRENT_DIR ON)
    812 
    813 include_directories( ${LLVM_INCLUDE_DIR} ${LLVM_MAIN_INCLUDE_DIR})
    814 
    815 # when crosscompiling import the executable targets from a file
    816 if(LLVM_USE_HOST_TOOLS)
    817   include(CrossCompile)
    818 endif(LLVM_USE_HOST_TOOLS)
    819 if(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)
    822 endif()
    823 
    824 if(${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")
    829 endif(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
    830 
    831 if( ${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")
    834 endif( ${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).
    838 set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
    839 
    840 set(LLVM_PROFDATA_FILE "" CACHE FILEPATH
    841   "Profiling data file to use when compiling in order to improve runtime performance.")
    842 
    843 if(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()
    849 endif()
    850 
    851 include(AddLLVM)
    852 include(TableGen)
    853 
    854 if( 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")
    858 endif()
    859 
    860 # Put this before tblgen. Else we have a circular dependence.
    861 add_subdirectory(lib/Demangle)
    862 add_subdirectory(lib/Support)
    863 add_subdirectory(lib/TableGen)
    864 
    865 add_subdirectory(utils/TableGen)
    866 
    867 add_subdirectory(include/llvm)
    868 
    869 add_subdirectory(lib)
    870 
    871 if( 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)
    877 else()
    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()
    882 endif()
    883 
    884 # Use LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION instead of LLVM_INCLUDE_UTILS because it is not really a util
    885 if (LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION)
    886   add_subdirectory(utils/LLVMVisualizers)
    887 endif()
    888 
    889 foreach( binding ${LLVM_BINDINGS_LIST} )
    890   if( EXISTS "${LLVM_MAIN_SRC_DIR}/bindings/${binding}/CMakeLists.txt" )
    891     add_subdirectory(bindings/${binding})
    892   endif()
    893 endforeach()
    894 
    895 add_subdirectory(projects)
    896 
    897 if( LLVM_INCLUDE_TOOLS )
    898   add_subdirectory(tools)
    899 endif()
    900 
    901 if( LLVM_INCLUDE_RUNTIMES )
    902   add_subdirectory(runtimes)
    903 endif()
    904 
    905 if( LLVM_INCLUDE_EXAMPLES )
    906   add_subdirectory(examples)
    907 endif()
    908 
    909 if( 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")
    954 endif()
    955 
    956 if (LLVM_INCLUDE_DOCS)
    957   add_subdirectory(docs)
    958 endif()
    959 
    960 add_subdirectory(cmake/modules)
    961 
    962 # Do this last so that all lit targets have already been created.
    963 if (LLVM_INCLUDE_UTILS)
    964   add_subdirectory(utils/llvm-lit)
    965 endif()
    966 
    967 if (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()
   1004 endif()
   1005 
   1006 # This must be at the end of the LLVM root CMakeLists file because it must run
   1007 # after all targets are created.
   1008 if(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()
   1037 endif()
   1038 
   1039 # This allows us to deploy the Universal CRT DLLs by passing -DCMAKE_INSTALL_UCRT_LIBRARIES=ON to CMake
   1040 if (MSVC AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows" AND CMAKE_INSTALL_UCRT_LIBRARIES)
   1041   include(InstallRequiredSystemLibraries)
   1042 endif()
   1043