1# See docs/CMake.html for instructions about how to build LLVM with CMake. 2 3project(LLVM) 4cmake_minimum_required(VERSION 2.8) 5 6# Add path for custom modules 7set(CMAKE_MODULE_PATH 8 ${CMAKE_MODULE_PATH} 9 "${CMAKE_CURRENT_SOURCE_DIR}/cmake" 10 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" 11 ) 12 13set(PACKAGE_VERSION "3.0") 14 15set_property(GLOBAL PROPERTY USE_FOLDERS ON) 16 17include(VersionFromVCS) 18 19option(LLVM_APPEND_VC_REV 20 "Append the version control system revision id to LLVM version" OFF) 21 22if( LLVM_APPEND_VC_REV ) 23 add_version_info_from_vcs(PACKAGE_VERSION) 24endif() 25 26set(PACKAGE_NAME llvm) 27set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") 28set(PACKAGE_BUGREPORT "llvmbugs@cs.uiuc.edu") 29 30if( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE ) 31 message(FATAL_ERROR "In-source builds are not allowed. 32CMake would overwrite the makefiles distributed with LLVM. 33Please create a directory and run cmake from there, passing the path 34to this source directory as the last argument. 35This process created the file `CMakeCache.txt' and the directory `CMakeFiles'. 36Please delete them.") 37endif() 38 39string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) 40 41set(LLVM_MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}) 42set(LLVM_MAIN_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/include) 43set(LLVM_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) 44set(LLVM_TOOLS_BINARY_DIR ${LLVM_BINARY_DIR}/bin) 45set(LLVM_EXAMPLES_BINARY_DIR ${LLVM_BINARY_DIR}/examples) 46set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" ) 47 48if( NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR ) 49 file(GLOB_RECURSE 50 tablegenned_files_on_include_dir 51 "${LLVM_MAIN_SRC_DIR}/include/llvm/*.gen") 52 file(GLOB_RECURSE 53 tablegenned_files_on_lib_dir 54 "${LLVM_MAIN_SRC_DIR}/lib/Target/*.inc") 55 if( tablegenned_files_on_include_dir OR tablegenned_files_on_lib_dir) 56 message(FATAL_ERROR "Apparently there is a previous in-source build, 57probably as the result of running `configure' and `make' on 58${LLVM_MAIN_SRC_DIR}. 59This may cause problems. The suspicious files are: 60${tablegenned_files_on_lib_dir} 61${tablegenned_files_on_include_dir} 62Please clean the source directory.") 63 endif() 64endif() 65 66set(LLVM_ALL_TARGETS 67 Alpha 68 ARM 69 Blackfin 70 CBackend 71 CellSPU 72 CppBackend 73 Mips 74 MBlaze 75 MSP430 76 PowerPC 77 PTX 78 Sparc 79 SystemZ 80 X86 81 XCore 82 ) 83 84# List of targets with JIT support: 85set(LLVM_TARGETS_WITH_JIT X86 PowerPC ARM) 86 87if( MSVC ) 88 set(LLVM_TARGETS_TO_BUILD X86 89 CACHE STRING "Semicolon-separated list of targets to build, or \"all\".") 90else( MSVC ) 91 set(LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} 92 CACHE STRING "Semicolon-separated list of targets to build, or \"all\".") 93endif( MSVC ) 94 95option(LLVM_ENABLE_CBE_PRINTF_A "Set to ON if CBE is enabled for printf %a output" ON) 96if(LLVM_ENABLE_CBE_PRINTF_A) 97 set(ENABLE_CBE_PRINTF_A 1) 98endif() 99 100option(LLVM_ENABLE_TIMESTAMPS "Enable embedding timestamp information in build" ON) 101if(LLVM_ENABLE_TIMESTAMPS) 102 set(ENABLE_TIMESTAMPS 1) 103endif() 104 105option(LLVM_ENABLE_FFI "Use libffi to call external functions from the interpreter" OFF) 106set(FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so") 107set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h") 108 109set(LLVM_TARGET_ARCH "host" 110 CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.") 111 112option(LLVM_ENABLE_THREADS "Use threads if available." ON) 113 114if( LLVM_TARGETS_TO_BUILD STREQUAL "all" ) 115 set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} ) 116endif() 117 118set(LLVM_ENUM_TARGETS "") 119foreach(c ${LLVM_TARGETS_TO_BUILD}) 120 list(FIND LLVM_ALL_TARGETS ${c} idx) 121 if( idx LESS 0 ) 122 message(FATAL_ERROR "The target `${c}' does not exist. 123 It should be one of\n${LLVM_ALL_TARGETS}") 124 else() 125 set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${c})\n") 126 endif() 127endforeach(c) 128 129# Produce llvm/Config/Targets.def 130configure_file( 131 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in 132 ${LLVM_BINARY_DIR}/include/llvm/Config/Targets.def 133 ) 134 135set(llvm_builded_incs_dir ${LLVM_BINARY_DIR}/include/llvm) 136 137include(AddLLVMDefinitions) 138 139option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON) 140 141# MSVC has a gazillion warnings with this. 142if( MSVC ) 143 option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." OFF) 144else( MSVC ) 145 option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON) 146endif() 147 148option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON) 149option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF) 150 151if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" ) 152 option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF) 153else() 154 option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON) 155endif() 156 157# All options referred to from HandleLLVMOptions have to be specified 158# BEFORE this include, otherwise options will not be correctly set on 159# first cmake run 160include(config-ix) 161include(HandleLLVMOptions) 162 163configure_file( 164 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/config.h.cmake 165 ${LLVM_BINARY_DIR}/include/llvm/Config/config.h) 166 167configure_file( 168 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/llvm-config.h.cmake 169 ${LLVM_BINARY_DIR}/include/llvm/Config/llvm-config.h) 170 171configure_file( 172 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/DataTypes.h.cmake 173 ${LLVM_BINARY_DIR}/include/llvm/Support/DataTypes.h) 174 175set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} ) 176set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib ) 177set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib ) 178 179set(CMAKE_INCLUDE_CURRENT_DIR ON) 180 181include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR}) 182 183if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS ) 184 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include llvm/Support/Solaris.h") 185endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS ) 186 187include(AddLLVM) 188include(TableGen) 189 190if( MINGW ) 191 # People report that -O3 is unreliable on MinGW. The traditional 192 # build also uses -O2 for that reason: 193 llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2") 194endif() 195 196# Put this before tblgen. Else we have a circular dependence. 197add_subdirectory(lib/Support) 198 199set(LLVM_TABLEGEN "tblgen" CACHE 200 STRING "Native TableGen executable. Saves building one when cross-compiling.") 201# Effective tblgen executable to be used: 202set(LLVM_TABLEGEN_EXE ${LLVM_TABLEGEN}) 203 204add_subdirectory(utils/TableGen) 205 206if( CMAKE_CROSSCOMPILING ) 207 # This adds a dependency on target `tblgen', so must go after utils/TableGen 208 include( CrossCompileLLVM ) 209endif( CMAKE_CROSSCOMPILING ) 210 211add_subdirectory(include/llvm) 212 213add_subdirectory(lib) 214 215add_subdirectory(utils/FileCheck) 216add_subdirectory(utils/FileUpdate) 217add_subdirectory(utils/count) 218add_subdirectory(utils/not) 219add_subdirectory(utils/llvm-lit) 220 221add_subdirectory(projects) 222 223option(LLVM_BUILD_TOOLS 224 "Build the LLVM tools. If OFF, just generate build targets." ON) 225option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON) 226if( LLVM_INCLUDE_TOOLS ) 227 add_subdirectory(tools) 228endif() 229 230option(LLVM_BUILD_RUNTIME 231 "Build the LLVM runtime libraries. If OFF, just generate build targets." ON) 232option(LLVM_INCLUDE_RUNTIME "Generate build targets for the LLVM runtimes" ON) 233if( LLVM_INCLUDE_RUNTIME ) 234 add_subdirectory(runtime) 235endif() 236 237option(LLVM_BUILD_EXAMPLES 238 "Build the LLVM example programs. If OFF, just generate build targets." OFF) 239option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON) 240if( LLVM_INCLUDE_EXAMPLES ) 241 add_subdirectory(examples) 242endif() 243 244option(LLVM_BUILD_TESTS 245 "Build LLVM unit tests. If OFF, just generate build targets." OFF) 246if( LLVM_INCLUDE_TESTS ) 247 add_subdirectory(test) 248 add_subdirectory(utils/unittest) 249 add_subdirectory(unittests) 250 if (MSVC) 251 # This utility is used to prevent chrashing tests from calling Dr. Watson on 252 # Windows. 253 add_subdirectory(utils/KillTheDoctor) 254 endif() 255endif() 256 257add_subdirectory(cmake/modules) 258 259install(DIRECTORY include/ 260 DESTINATION include 261 FILES_MATCHING 262 PATTERN "*.def" 263 PATTERN "*.h" 264 PATTERN "*.td" 265 PATTERN "*.inc" 266 PATTERN "LICENSE.TXT" 267 PATTERN ".svn" EXCLUDE 268 ) 269 270install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/ 271 DESTINATION include 272 FILES_MATCHING 273 PATTERN "*.def" 274 PATTERN "*.h" 275 PATTERN "*.gen" 276 PATTERN "*.inc" 277 # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def" 278 PATTERN "CMakeFiles" EXCLUDE 279 PATTERN ".svn" EXCLUDE 280 ) 281 282# TODO: make and install documentation. 283 284set(CPACK_PACKAGE_VENDOR "LLVM") 285set(CPACK_PACKAGE_VERSION_MAJOR 2) 286set(CPACK_PACKAGE_VERSION_MINOR 9) 287add_version_info_from_vcs(CPACK_PACKAGE_VERSION_PATCH) 288include(CPack) 289 290# Workaround for MSVS10 to avoid the Dialog Hell 291# FIXME: This could be removed with future version of CMake. 292if(MSVC_VERSION EQUAL 1600) 293 set(LLVM_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/LLVM.sln") 294 if( EXISTS "${LLVM_SLN_FILENAME}" ) 295 file(APPEND "${LLVM_SLN_FILENAME}" "\n# This should be regenerated!\n") 296 endif() 297endif() 298