1if( WIN32 AND NOT CYGWIN ) 2 # We consider Cygwin as another Unix 3 set(PURE_WINDOWS 1) 4endif() 5 6include(CheckIncludeFile) 7include(CheckIncludeFileCXX) 8include(CheckLibraryExists) 9include(CheckSymbolExists) 10include(CheckFunctionExists) 11include(CheckCXXSourceCompiles) 12include(TestBigEndian) 13 14include(HandleLLVMStdlib) 15 16if( UNIX AND NOT BEOS ) 17 # Used by check_symbol_exists: 18 set(CMAKE_REQUIRED_LIBRARIES m) 19endif() 20# x86_64 FreeBSD 9.2 requires libcxxrt to be specified explicitly. 21if( CMAKE_SYSTEM MATCHES "FreeBSD-9.2-RELEASE" AND 22 CMAKE_SIZEOF_VOID_P EQUAL 8 ) 23 list(APPEND CMAKE_REQUIRED_LIBRARIES "cxxrt") 24endif() 25 26# Helper macros and functions 27macro(add_cxx_include result files) 28 set(${result} "") 29 foreach (file_name ${files}) 30 set(${result} "${${result}}#include<${file_name}>\n") 31 endforeach() 32endmacro(add_cxx_include files result) 33 34function(check_type_exists type files variable) 35 add_cxx_include(includes "${files}") 36 CHECK_CXX_SOURCE_COMPILES(" 37 ${includes} ${type} typeVar; 38 int main() { 39 return 0; 40 } 41 " ${variable}) 42endfunction() 43 44# include checks 45check_include_file(dirent.h HAVE_DIRENT_H) 46check_include_file(dlfcn.h HAVE_DLFCN_H) 47check_include_file(errno.h HAVE_ERRNO_H) 48check_include_file(execinfo.h HAVE_EXECINFO_H) 49check_include_file(fcntl.h HAVE_FCNTL_H) 50check_include_file(inttypes.h HAVE_INTTYPES_H) 51check_include_file(limits.h HAVE_LIMITS_H) 52check_include_file(link.h HAVE_LINK_H) 53check_include_file(malloc.h HAVE_MALLOC_H) 54check_include_file(malloc/malloc.h HAVE_MALLOC_MALLOC_H) 55check_include_file(ndir.h HAVE_NDIR_H) 56if( NOT PURE_WINDOWS ) 57 check_include_file(pthread.h HAVE_PTHREAD_H) 58endif() 59check_include_file(signal.h HAVE_SIGNAL_H) 60check_include_file(stdint.h HAVE_STDINT_H) 61check_include_file(sys/dir.h HAVE_SYS_DIR_H) 62check_include_file(sys/ioctl.h HAVE_SYS_IOCTL_H) 63check_include_file(sys/mman.h HAVE_SYS_MMAN_H) 64check_include_file(sys/ndir.h HAVE_SYS_NDIR_H) 65check_include_file(sys/param.h HAVE_SYS_PARAM_H) 66check_include_file(sys/resource.h HAVE_SYS_RESOURCE_H) 67check_include_file(sys/stat.h HAVE_SYS_STAT_H) 68check_include_file(sys/time.h HAVE_SYS_TIME_H) 69check_include_file(sys/uio.h HAVE_SYS_UIO_H) 70check_include_file(sys/wait.h HAVE_SYS_WAIT_H) 71check_include_file(termios.h HAVE_TERMIOS_H) 72check_include_file(unistd.h HAVE_UNISTD_H) 73check_include_file(utime.h HAVE_UTIME_H) 74check_include_file(valgrind/valgrind.h HAVE_VALGRIND_VALGRIND_H) 75check_include_file(zlib.h HAVE_ZLIB_H) 76check_include_file(fenv.h HAVE_FENV_H) 77check_symbol_exists(FE_ALL_EXCEPT "fenv.h" HAVE_DECL_FE_ALL_EXCEPT) 78check_symbol_exists(FE_INEXACT "fenv.h" HAVE_DECL_FE_INEXACT) 79 80check_include_file(mach/mach.h HAVE_MACH_MACH_H) 81check_include_file(mach-o/dyld.h HAVE_MACH_O_DYLD_H) 82 83# size_t must be defined before including cxxabi.h on FreeBSD 10.0. 84check_cxx_source_compiles(" 85#include <stddef.h> 86#include <cxxabi.h> 87int main() { return 0; } 88" HAVE_CXXABI_H) 89 90# library checks 91if( NOT PURE_WINDOWS ) 92 check_library_exists(pthread pthread_create "" HAVE_LIBPTHREAD) 93 if (HAVE_LIBPTHREAD) 94 check_library_exists(pthread pthread_getspecific "" HAVE_PTHREAD_GETSPECIFIC) 95 check_library_exists(pthread pthread_rwlock_init "" HAVE_PTHREAD_RWLOCK_INIT) 96 check_library_exists(pthread pthread_mutex_lock "" HAVE_PTHREAD_MUTEX_LOCK) 97 else() 98 # this could be Android 99 check_library_exists(c pthread_create "" PTHREAD_IN_LIBC) 100 if (PTHREAD_IN_LIBC) 101 check_library_exists(c pthread_getspecific "" HAVE_PTHREAD_GETSPECIFIC) 102 check_library_exists(c pthread_rwlock_init "" HAVE_PTHREAD_RWLOCK_INIT) 103 check_library_exists(c pthread_mutex_lock "" HAVE_PTHREAD_MUTEX_LOCK) 104 endif() 105 endif() 106 check_library_exists(dl dlopen "" HAVE_LIBDL) 107 check_library_exists(rt clock_gettime "" HAVE_LIBRT) 108 if (LLVM_ENABLE_ZLIB) 109 check_library_exists(z compress2 "" HAVE_LIBZ) 110 else() 111 set(HAVE_LIBZ 0) 112 endif() 113 check_library_exists(edit el_init "" HAVE_LIBEDIT) 114 if(LLVM_ENABLE_TERMINFO) 115 set(HAVE_TERMINFO 0) 116 foreach(library tinfo terminfo curses ncurses ncursesw) 117 string(TOUPPER ${library} library_suffix) 118 check_library_exists(${library} setupterm "" HAVE_TERMINFO_${library_suffix}) 119 if(HAVE_TERMINFO_${library_suffix}) 120 set(HAVE_TERMINFO 1) 121 set(TERMINFO_LIBS "${library}") 122 break() 123 endif() 124 endforeach() 125 else() 126 set(HAVE_TERMINFO 0) 127 endif() 128endif() 129 130# function checks 131check_symbol_exists(arc4random "stdlib.h" HAVE_DECL_ARC4RANDOM) 132check_symbol_exists(backtrace "execinfo.h" HAVE_BACKTRACE) 133check_symbol_exists(getpagesize unistd.h HAVE_GETPAGESIZE) 134check_symbol_exists(getrusage sys/resource.h HAVE_GETRUSAGE) 135check_symbol_exists(setrlimit sys/resource.h HAVE_SETRLIMIT) 136check_symbol_exists(isatty unistd.h HAVE_ISATTY) 137check_symbol_exists(isinf cmath HAVE_ISINF_IN_CMATH) 138check_symbol_exists(isinf math.h HAVE_ISINF_IN_MATH_H) 139check_symbol_exists(finite ieeefp.h HAVE_FINITE_IN_IEEEFP_H) 140check_symbol_exists(isnan cmath HAVE_ISNAN_IN_CMATH) 141check_symbol_exists(isnan math.h HAVE_ISNAN_IN_MATH_H) 142check_symbol_exists(ceilf math.h HAVE_CEILF) 143check_symbol_exists(floorf math.h HAVE_FLOORF) 144check_symbol_exists(fmodf math.h HAVE_FMODF) 145check_symbol_exists(log math.h HAVE_LOG) 146check_symbol_exists(log2 math.h HAVE_LOG2) 147check_symbol_exists(log10 math.h HAVE_LOG10) 148check_symbol_exists(exp math.h HAVE_EXP) 149check_symbol_exists(exp2 math.h HAVE_EXP2) 150check_symbol_exists(exp10 math.h HAVE_EXP10) 151check_symbol_exists(futimens sys/stat.h HAVE_FUTIMENS) 152check_symbol_exists(futimes sys/time.h HAVE_FUTIMES) 153if( HAVE_SETJMP_H ) 154 check_symbol_exists(longjmp setjmp.h HAVE_LONGJMP) 155 check_symbol_exists(setjmp setjmp.h HAVE_SETJMP) 156 check_symbol_exists(siglongjmp setjmp.h HAVE_SIGLONGJMP) 157 check_symbol_exists(sigsetjmp setjmp.h HAVE_SIGSETJMP) 158endif() 159if( HAVE_SYS_UIO_H ) 160 check_symbol_exists(writev sys/uio.h HAVE_WRITEV) 161endif() 162check_symbol_exists(nearbyintf math.h HAVE_NEARBYINTF) 163check_symbol_exists(mallinfo malloc.h HAVE_MALLINFO) 164check_symbol_exists(malloc_zone_statistics malloc/malloc.h 165 HAVE_MALLOC_ZONE_STATISTICS) 166check_symbol_exists(mkdtemp "stdlib.h;unistd.h" HAVE_MKDTEMP) 167check_symbol_exists(mkstemp "stdlib.h;unistd.h" HAVE_MKSTEMP) 168check_symbol_exists(mktemp "stdlib.h;unistd.h" HAVE_MKTEMP) 169check_symbol_exists(closedir "sys/types.h;dirent.h" HAVE_CLOSEDIR) 170check_symbol_exists(opendir "sys/types.h;dirent.h" HAVE_OPENDIR) 171check_symbol_exists(readdir "sys/types.h;dirent.h" HAVE_READDIR) 172check_symbol_exists(getcwd unistd.h HAVE_GETCWD) 173check_symbol_exists(gettimeofday sys/time.h HAVE_GETTIMEOFDAY) 174check_symbol_exists(getrlimit "sys/types.h;sys/time.h;sys/resource.h" HAVE_GETRLIMIT) 175check_symbol_exists(posix_spawn spawn.h HAVE_POSIX_SPAWN) 176check_symbol_exists(pread unistd.h HAVE_PREAD) 177check_symbol_exists(realpath stdlib.h HAVE_REALPATH) 178check_symbol_exists(sbrk unistd.h HAVE_SBRK) 179check_symbol_exists(srand48 stdlib.h HAVE_RAND48_SRAND48) 180if( HAVE_RAND48_SRAND48 ) 181 check_symbol_exists(lrand48 stdlib.h HAVE_RAND48_LRAND48) 182 if( HAVE_RAND48_LRAND48 ) 183 check_symbol_exists(drand48 stdlib.h HAVE_RAND48_DRAND48) 184 if( HAVE_RAND48_DRAND48 ) 185 set(HAVE_RAND48 1 CACHE INTERNAL "are srand48/lrand48/drand48 available?") 186 endif() 187 endif() 188endif() 189check_symbol_exists(strtoll stdlib.h HAVE_STRTOLL) 190check_symbol_exists(strtoq stdlib.h HAVE_STRTOQ) 191check_symbol_exists(strerror string.h HAVE_STRERROR) 192check_symbol_exists(strerror_r string.h HAVE_STRERROR_R) 193check_symbol_exists(strerror_s string.h HAVE_DECL_STRERROR_S) 194check_symbol_exists(setenv stdlib.h HAVE_SETENV) 195if( PURE_WINDOWS ) 196 check_symbol_exists(_chsize_s io.h HAVE__CHSIZE_S) 197 198 check_function_exists(_alloca HAVE__ALLOCA) 199 check_function_exists(__alloca HAVE___ALLOCA) 200 check_function_exists(__chkstk HAVE___CHKSTK) 201 check_function_exists(__chkstk_ms HAVE___CHKSTK_MS) 202 check_function_exists(___chkstk HAVE____CHKSTK) 203 check_function_exists(___chkstk_ms HAVE____CHKSTK_MS) 204 205 check_function_exists(__ashldi3 HAVE___ASHLDI3) 206 check_function_exists(__ashrdi3 HAVE___ASHRDI3) 207 check_function_exists(__divdi3 HAVE___DIVDI3) 208 check_function_exists(__fixdfdi HAVE___FIXDFDI) 209 check_function_exists(__fixsfdi HAVE___FIXSFDI) 210 check_function_exists(__floatdidf HAVE___FLOATDIDF) 211 check_function_exists(__lshrdi3 HAVE___LSHRDI3) 212 check_function_exists(__moddi3 HAVE___MODDI3) 213 check_function_exists(__udivdi3 HAVE___UDIVDI3) 214 check_function_exists(__umoddi3 HAVE___UMODDI3) 215 216 check_function_exists(__main HAVE___MAIN) 217 check_function_exists(__cmpdi2 HAVE___CMPDI2) 218endif() 219if( HAVE_DLFCN_H ) 220 if( HAVE_LIBDL ) 221 list(APPEND CMAKE_REQUIRED_LIBRARIES dl) 222 endif() 223 check_symbol_exists(dlerror dlfcn.h HAVE_DLERROR) 224 check_symbol_exists(dlopen dlfcn.h HAVE_DLOPEN) 225 if( HAVE_LIBDL ) 226 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES dl) 227 endif() 228endif() 229 230check_symbol_exists(__GLIBC__ stdio.h LLVM_USING_GLIBC) 231if( LLVM_USING_GLIBC ) 232 add_llvm_definitions( -D_GNU_SOURCE ) 233endif() 234 235set(headers "sys/types.h") 236 237if (HAVE_INTTYPES_H) 238 set(headers ${headers} "inttypes.h") 239endif() 240 241if (HAVE_STDINT_H) 242 set(headers ${headers} "stdint.h") 243endif() 244 245check_type_exists(int64_t "${headers}" HAVE_INT64_T) 246check_type_exists(uint64_t "${headers}" HAVE_UINT64_T) 247check_type_exists(u_int64_t "${headers}" HAVE_U_INT64_T) 248 249# available programs checks 250function(llvm_find_program name) 251 string(TOUPPER ${name} NAME) 252 string(REGEX REPLACE "\\." "_" NAME ${NAME}) 253 254 find_program(LLVM_PATH_${NAME} NAMES ${ARGV}) 255 mark_as_advanced(LLVM_PATH_${NAME}) 256 if(LLVM_PATH_${NAME}) 257 set(HAVE_${NAME} 1 CACHE INTERNAL "Is ${name} available ?") 258 mark_as_advanced(HAVE_${NAME}) 259 else(LLVM_PATH_${NAME}) 260 set(HAVE_${NAME} "" CACHE INTERNAL "Is ${name} available ?") 261 endif(LLVM_PATH_${NAME}) 262endfunction() 263 264if (LLVM_ENABLE_DOXYGEN) 265 llvm_find_program(dot) 266endif () 267 268if( LLVM_ENABLE_FFI ) 269 find_path(FFI_INCLUDE_PATH ffi.h PATHS ${FFI_INCLUDE_DIR}) 270 if( EXISTS "${FFI_INCLUDE_PATH}/ffi.h" ) 271 set(FFI_HEADER ffi.h CACHE INTERNAL "") 272 set(HAVE_FFI_H 1 CACHE INTERNAL "") 273 else() 274 find_path(FFI_INCLUDE_PATH ffi/ffi.h PATHS ${FFI_INCLUDE_DIR}) 275 if( EXISTS "${FFI_INCLUDE_PATH}/ffi/ffi.h" ) 276 set(FFI_HEADER ffi/ffi.h CACHE INTERNAL "") 277 set(HAVE_FFI_FFI_H 1 CACHE INTERNAL "") 278 endif() 279 endif() 280 281 if( NOT FFI_HEADER ) 282 message(FATAL_ERROR "libffi includes are not found.") 283 endif() 284 285 find_library(FFI_LIBRARY_PATH ffi PATHS ${FFI_LIBRARY_DIR}) 286 if( NOT FFI_LIBRARY_PATH ) 287 message(FATAL_ERROR "libffi is not found.") 288 endif() 289 290 list(APPEND CMAKE_REQUIRED_LIBRARIES ${FFI_LIBRARY_PATH}) 291 list(APPEND CMAKE_REQUIRED_INCLUDES ${FFI_INCLUDE_PATH}) 292 check_symbol_exists(ffi_call ${FFI_HEADER} HAVE_FFI_CALL) 293 list(REMOVE_ITEM CMAKE_REQUIRED_INCLUDES ${FFI_INCLUDE_PATH}) 294 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES ${FFI_LIBRARY_PATH}) 295else() 296 unset(HAVE_FFI_FFI_H CACHE) 297 unset(HAVE_FFI_H CACHE) 298 unset(HAVE_FFI_CALL CACHE) 299endif( LLVM_ENABLE_FFI ) 300 301# Define LLVM_HAS_ATOMICS if gcc or MSVC atomic builtins are supported. 302include(CheckAtomic) 303 304if( LLVM_ENABLE_PIC ) 305 set(ENABLE_PIC 1) 306else() 307 set(ENABLE_PIC 0) 308endif() 309 310check_cxx_compiler_flag("-Wno-variadic-macros" SUPPORTS_NO_VARIADIC_MACROS_FLAG) 311 312set(USE_NO_MAYBE_UNINITIALIZED 0) 313set(USE_NO_UNINITIALIZED 0) 314 315# Disable gcc's potentially uninitialized use analysis as it presents lots of 316# false positives. 317if (CMAKE_COMPILER_IS_GNUCXX) 318 check_cxx_compiler_flag("-Wmaybe-uninitialized" HAS_MAYBE_UNINITIALIZED) 319 if (HAS_MAYBE_UNINITIALIZED) 320 set(USE_NO_MAYBE_UNINITIALIZED 1) 321 else() 322 # Only recent versions of gcc make the distinction between -Wuninitialized 323 # and -Wmaybe-uninitialized. If -Wmaybe-uninitialized isn't supported, just 324 # turn off all uninitialized use warnings. 325 check_cxx_compiler_flag("-Wuninitialized" HAS_UNINITIALIZED) 326 set(USE_NO_UNINITIALIZED ${HAS_UNINITIALIZED}) 327 endif() 328endif() 329 330# By default, we target the host, but this can be overridden at CMake 331# invocation time. 332include(GetHostTriple) 333get_host_triple(LLVM_INFERRED_HOST_TRIPLE) 334 335set(LLVM_HOST_TRIPLE "${LLVM_INFERRED_HOST_TRIPLE}" CACHE STRING 336 "Host on which LLVM binaries will run") 337 338# Determine the native architecture. 339string(TOLOWER "${LLVM_TARGET_ARCH}" LLVM_NATIVE_ARCH) 340if( LLVM_NATIVE_ARCH STREQUAL "host" ) 341 string(REGEX MATCH "^[^-]*" LLVM_NATIVE_ARCH ${LLVM_HOST_TRIPLE}) 342endif () 343 344if (LLVM_NATIVE_ARCH MATCHES "i[2-6]86") 345 set(LLVM_NATIVE_ARCH X86) 346elseif (LLVM_NATIVE_ARCH STREQUAL "x86") 347 set(LLVM_NATIVE_ARCH X86) 348elseif (LLVM_NATIVE_ARCH STREQUAL "amd64") 349 set(LLVM_NATIVE_ARCH X86) 350elseif (LLVM_NATIVE_ARCH STREQUAL "x86_64") 351 set(LLVM_NATIVE_ARCH X86) 352elseif (LLVM_NATIVE_ARCH MATCHES "sparc") 353 set(LLVM_NATIVE_ARCH Sparc) 354elseif (LLVM_NATIVE_ARCH MATCHES "powerpc") 355 set(LLVM_NATIVE_ARCH PowerPC) 356elseif (LLVM_NATIVE_ARCH MATCHES "aarch64") 357 set(LLVM_NATIVE_ARCH AArch64) 358elseif (LLVM_NATIVE_ARCH MATCHES "arm64") 359 set(LLVM_NATIVE_ARCH AArch64) 360elseif (LLVM_NATIVE_ARCH MATCHES "arm") 361 set(LLVM_NATIVE_ARCH ARM) 362elseif (LLVM_NATIVE_ARCH MATCHES "mips") 363 set(LLVM_NATIVE_ARCH Mips) 364elseif (LLVM_NATIVE_ARCH MATCHES "xcore") 365 set(LLVM_NATIVE_ARCH XCore) 366elseif (LLVM_NATIVE_ARCH MATCHES "msp430") 367 set(LLVM_NATIVE_ARCH MSP430) 368elseif (LLVM_NATIVE_ARCH MATCHES "hexagon") 369 set(LLVM_NATIVE_ARCH Hexagon) 370elseif (LLVM_NATIVE_ARCH MATCHES "s390x") 371 set(LLVM_NATIVE_ARCH SystemZ) 372else () 373 message(FATAL_ERROR "Unknown architecture ${LLVM_NATIVE_ARCH}") 374endif () 375 376# If build targets includes "host", then replace with native architecture. 377list(FIND LLVM_TARGETS_TO_BUILD "host" idx) 378if( NOT idx LESS 0 ) 379 list(REMOVE_AT LLVM_TARGETS_TO_BUILD ${idx}) 380 list(APPEND LLVM_TARGETS_TO_BUILD ${LLVM_NATIVE_ARCH}) 381 list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD) 382endif() 383 384list(FIND LLVM_TARGETS_TO_BUILD ${LLVM_NATIVE_ARCH} NATIVE_ARCH_IDX) 385if (NATIVE_ARCH_IDX EQUAL -1) 386 message(STATUS 387 "Native target ${LLVM_NATIVE_ARCH} is not selected; lli will not JIT code") 388else () 389 message(STATUS "Native target architecture is ${LLVM_NATIVE_ARCH}") 390 set(LLVM_NATIVE_TARGET LLVMInitialize${LLVM_NATIVE_ARCH}Target) 391 set(LLVM_NATIVE_TARGETINFO LLVMInitialize${LLVM_NATIVE_ARCH}TargetInfo) 392 set(LLVM_NATIVE_TARGETMC LLVMInitialize${LLVM_NATIVE_ARCH}TargetMC) 393 set(LLVM_NATIVE_ASMPRINTER LLVMInitialize${LLVM_NATIVE_ARCH}AsmPrinter) 394 395 # We don't have an ASM parser for all architectures yet. 396 if (EXISTS ${CMAKE_SOURCE_DIR}/lib/Target/${LLVM_NATIVE_ARCH}/AsmParser/CMakeLists.txt) 397 set(LLVM_NATIVE_ASMPARSER LLVMInitialize${LLVM_NATIVE_ARCH}AsmParser) 398 endif () 399 400 # We don't have an disassembler for all architectures yet. 401 if (EXISTS ${CMAKE_SOURCE_DIR}/lib/Target/${LLVM_NATIVE_ARCH}/Disassembler/CMakeLists.txt) 402 set(LLVM_NATIVE_DISASSEMBLER LLVMInitialize${LLVM_NATIVE_ARCH}Disassembler) 403 endif () 404endif () 405 406if( MINGW ) 407 set(HAVE_LIBIMAGEHLP 1) 408 set(HAVE_LIBPSAPI 1) 409 set(HAVE_LIBSHELL32 1) 410 # TODO: Check existence of libraries. 411 # include(CheckLibraryExists) 412 # CHECK_LIBRARY_EXISTS(imagehlp ??? . HAVE_LIBIMAGEHLP) 413endif( MINGW ) 414 415if (NOT HAVE_STRTOLL) 416 # Use _strtoi64 if strtoll is not available. 417 check_symbol_exists(_strtoi64 stdlib.h have_strtoi64) 418 if (have_strtoi64) 419 set(HAVE_STRTOLL 1) 420 set(strtoll "_strtoi64") 421 set(strtoull "_strtoui64") 422 endif () 423endif () 424 425if( MSVC ) 426 set(SHLIBEXT ".lib") 427 set(stricmp "_stricmp") 428 set(strdup "_strdup") 429endif( MSVC ) 430 431if( PURE_WINDOWS ) 432 CHECK_CXX_SOURCE_COMPILES(" 433 #include <windows.h> 434 #include <imagehlp.h> 435 extern \"C\" void foo(PENUMLOADED_MODULES_CALLBACK); 436 extern \"C\" void foo(BOOL(CALLBACK*)(PCSTR,ULONG_PTR,ULONG,PVOID)); 437 int main(){return 0;}" 438 HAVE_ELMCB_PCSTR) 439 if( HAVE_ELMCB_PCSTR ) 440 set(WIN32_ELMCB_PCSTR "PCSTR") 441 else() 442 set(WIN32_ELMCB_PCSTR "PSTR") 443 endif() 444endif( PURE_WINDOWS ) 445 446# FIXME: Signal handler return type, currently hardcoded to 'void' 447set(RETSIGTYPE void) 448 449if( LLVM_ENABLE_THREADS ) 450 # Check if threading primitives aren't supported on this platform 451 if( NOT HAVE_PTHREAD_H AND NOT WIN32 ) 452 set(LLVM_ENABLE_THREADS 0) 453 endif() 454endif() 455 456if( LLVM_ENABLE_THREADS ) 457 message(STATUS "Threads enabled.") 458else( LLVM_ENABLE_THREADS ) 459 message(STATUS "Threads disabled.") 460endif() 461 462if (LLVM_ENABLE_ZLIB ) 463 # Check if zlib is available in the system. 464 if ( NOT HAVE_ZLIB_H OR NOT HAVE_LIBZ ) 465 set(LLVM_ENABLE_ZLIB 0) 466 endif() 467endif() 468 469set(LLVM_PREFIX ${CMAKE_INSTALL_PREFIX}) 470 471if (LLVM_ENABLE_DOXYGEN) 472 message(STATUS "Doxygen enabled.") 473 find_package(Doxygen REQUIRED) 474 475 if (DOXYGEN_FOUND) 476 # If we find doxygen and we want to enable doxygen by default create a 477 # global aggregate doxygen target for generating llvm and any/all 478 # subprojects doxygen documentation. 479 if (LLVM_BUILD_DOCS) 480 add_custom_target(doxygen ALL) 481 endif() 482 483 option(LLVM_DOXYGEN_EXTERNAL_SEARCH "Enable doxygen external search." OFF) 484 if (LLVM_DOXYGEN_EXTERNAL_SEARCH) 485 set(LLVM_DOXYGEN_SEARCHENGINE_URL "" CACHE STRING "URL to use for external searhc.") 486 set(LLVM_DOXYGEN_SEARCH_MAPPINGS "" CACHE STRING "Doxygen Search Mappings") 487 endif() 488 endif() 489else() 490 message(STATUS "Doxygen disabled.") 491endif() 492 493if (LLVM_ENABLE_SPHINX) 494 message(STATUS "Sphinx enabled.") 495 find_package(Sphinx REQUIRED) 496 if (LLVM_BUILD_DOCS) 497 add_custom_target(sphinx ALL) 498 endif() 499else() 500 message(STATUS "Sphinx disabled.") 501endif() 502 503set(LLVM_BINDINGS "") 504if(WIN32) 505 message(STATUS "Go bindings disabled.") 506else() 507 find_program(GO_EXECUTABLE NAMES go DOC "go executable") 508 if(GO_EXECUTABLE STREQUAL "GO_EXECUTABLE-NOTFOUND") 509 message(STATUS "Go bindings disabled.") 510 else() 511 execute_process(COMMAND ${GO_EXECUTABLE} run ${CMAKE_SOURCE_DIR}/bindings/go/conftest.go 512 RESULT_VARIABLE GO_CONFTEST) 513 if(GO_CONFTEST STREQUAL "0") 514 set(LLVM_BINDINGS "${LLVM_BINDINGS} go") 515 message(STATUS "Go bindings enabled.") 516 else() 517 message(STATUS "Go bindings disabled, need at least Go 1.2.") 518 endif() 519 endif() 520endif() 521 522include(FindOCaml) 523include(AddOCaml) 524if(WIN32) 525 message(STATUS "OCaml bindings disabled.") 526else() 527 find_package(OCaml) 528 if( NOT OCAML_FOUND ) 529 message(STATUS "OCaml bindings disabled.") 530 else() 531 if( OCAML_VERSION VERSION_LESS "4.00.0" ) 532 message(STATUS "OCaml bindings disabled, need OCaml >=4.00.0.") 533 else() 534 find_ocamlfind_package(ctypes VERSION 0.3 OPTIONAL) 535 if( HAVE_OCAML_CTYPES ) 536 message(STATUS "OCaml bindings enabled.") 537 find_ocamlfind_package(oUnit VERSION 2 OPTIONAL) 538 set(LLVM_BINDINGS "${LLVM_BINDINGS} ocaml") 539 else() 540 message(STATUS "OCaml bindings disabled, need ctypes >=0.3.") 541 endif() 542 endif() 543 endif() 544endif() 545 546string(REPLACE " " ";" LLVM_BINDINGS_LIST "${LLVM_BINDINGS}") 547