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