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