[Cygming] Seek also chkstk_ms, or JIT fails with DLL builds. It is fixup for r227519.
[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_ms HAVE___CHKSTK_MS)
205   check_function_exists(___chkstk HAVE____CHKSTK)
206   check_function_exists(___chkstk_ms HAVE____CHKSTK_MS)
207
208   check_function_exists(__ashldi3 HAVE___ASHLDI3)
209   check_function_exists(__ashrdi3 HAVE___ASHRDI3)
210   check_function_exists(__divdi3 HAVE___DIVDI3)
211   check_function_exists(__fixdfdi HAVE___FIXDFDI)
212   check_function_exists(__fixsfdi HAVE___FIXSFDI)
213   check_function_exists(__floatdidf HAVE___FLOATDIDF)
214   check_function_exists(__lshrdi3 HAVE___LSHRDI3)
215   check_function_exists(__moddi3 HAVE___MODDI3)
216   check_function_exists(__udivdi3 HAVE___UDIVDI3)
217   check_function_exists(__umoddi3 HAVE___UMODDI3)
218
219   check_function_exists(__main HAVE___MAIN)
220   check_function_exists(__cmpdi2 HAVE___CMPDI2)
221 endif()
222 if( HAVE_DLFCN_H )
223   if( HAVE_LIBDL )
224     list(APPEND CMAKE_REQUIRED_LIBRARIES dl)
225   endif()
226   check_symbol_exists(dlerror dlfcn.h HAVE_DLERROR)
227   check_symbol_exists(dlopen dlfcn.h HAVE_DLOPEN)
228   if( HAVE_LIBDL )
229     list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES dl)
230   endif()
231 endif()
232
233 check_symbol_exists(__GLIBC__ stdio.h LLVM_USING_GLIBC)
234 if( LLVM_USING_GLIBC )
235   add_llvm_definitions( -D_GNU_SOURCE )
236 endif()
237
238 set(headers "sys/types.h")
239
240 if (HAVE_INTTYPES_H)
241   set(headers ${headers} "inttypes.h")
242 endif()
243
244 if (HAVE_STDINT_H)
245   set(headers ${headers} "stdint.h")
246 endif()
247
248 check_type_exists(int64_t "${headers}" HAVE_INT64_T)
249 check_type_exists(uint64_t "${headers}" HAVE_UINT64_T)
250 check_type_exists(u_int64_t "${headers}" HAVE_U_INT64_T)
251
252 # available programs checks
253 function(llvm_find_program name)
254   string(TOUPPER ${name} NAME)
255   string(REGEX REPLACE "\\." "_" NAME ${NAME})
256
257   find_program(LLVM_PATH_${NAME} NAMES ${ARGV})
258   mark_as_advanced(LLVM_PATH_${NAME})
259   if(LLVM_PATH_${NAME})
260     set(HAVE_${NAME} 1 CACHE INTERNAL "Is ${name} available ?")
261     mark_as_advanced(HAVE_${NAME})
262   else(LLVM_PATH_${NAME})
263     set(HAVE_${NAME} "" CACHE INTERNAL "Is ${name} available ?")
264   endif(LLVM_PATH_${NAME})
265 endfunction()
266
267 if (LLVM_ENABLE_DOXYGEN)
268   llvm_find_program(dot)
269 endif ()
270
271 if( LLVM_ENABLE_FFI )
272   find_path(FFI_INCLUDE_PATH ffi.h PATHS ${FFI_INCLUDE_DIR})
273   if( EXISTS "${FFI_INCLUDE_PATH}/ffi.h" )
274     set(FFI_HEADER ffi.h CACHE INTERNAL "")
275     set(HAVE_FFI_H 1 CACHE INTERNAL "")
276   else()
277     find_path(FFI_INCLUDE_PATH ffi/ffi.h PATHS ${FFI_INCLUDE_DIR})
278     if( EXISTS "${FFI_INCLUDE_PATH}/ffi/ffi.h" )
279       set(FFI_HEADER ffi/ffi.h CACHE INTERNAL "")
280       set(HAVE_FFI_FFI_H 1 CACHE INTERNAL "")
281     endif()
282   endif()
283
284   if( NOT FFI_HEADER )
285     message(FATAL_ERROR "libffi includes are not found.")
286   endif()
287
288   find_library(FFI_LIBRARY_PATH ffi PATHS ${FFI_LIBRARY_DIR})
289   if( NOT FFI_LIBRARY_PATH )
290     message(FATAL_ERROR "libffi is not found.")
291   endif()
292
293   list(APPEND CMAKE_REQUIRED_LIBRARIES ${FFI_LIBRARY_PATH})
294   list(APPEND CMAKE_REQUIRED_INCLUDES ${FFI_INCLUDE_PATH})
295   check_symbol_exists(ffi_call ${FFI_HEADER} HAVE_FFI_CALL)
296   list(REMOVE_ITEM CMAKE_REQUIRED_INCLUDES ${FFI_INCLUDE_PATH})
297   list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES ${FFI_LIBRARY_PATH})
298 else()
299   unset(HAVE_FFI_FFI_H CACHE)
300   unset(HAVE_FFI_H CACHE)
301   unset(HAVE_FFI_CALL CACHE)
302 endif( LLVM_ENABLE_FFI )
303
304 # Define LLVM_HAS_ATOMICS if gcc or MSVC atomic builtins are supported.
305 include(CheckAtomic)
306
307 if( LLVM_ENABLE_PIC )
308   set(ENABLE_PIC 1)
309 else()
310   set(ENABLE_PIC 0)
311 endif()
312
313 check_cxx_compiler_flag("-Wno-variadic-macros" SUPPORTS_NO_VARIADIC_MACROS_FLAG)
314
315 set(USE_NO_MAYBE_UNINITIALIZED 0)
316 set(USE_NO_UNINITIALIZED 0)
317
318 # Disable gcc's potentially uninitialized use analysis as it presents lots of
319 # false positives.
320 if (CMAKE_COMPILER_IS_GNUCXX)
321   check_cxx_compiler_flag("-Wmaybe-uninitialized" HAS_MAYBE_UNINITIALIZED)
322   if (HAS_MAYBE_UNINITIALIZED)
323     set(USE_NO_MAYBE_UNINITIALIZED 1)
324   else()
325     # Only recent versions of gcc make the distinction between -Wuninitialized
326     # and -Wmaybe-uninitialized. If -Wmaybe-uninitialized isn't supported, just
327     # turn off all uninitialized use warnings.
328     check_cxx_compiler_flag("-Wuninitialized" HAS_UNINITIALIZED)
329     set(USE_NO_UNINITIALIZED ${HAS_UNINITIALIZED})
330   endif()
331 endif()
332
333 # By default, we target the host, but this can be overridden at CMake
334 # invocation time.
335 include(GetHostTriple)
336 get_host_triple(LLVM_INFERRED_HOST_TRIPLE)
337
338 set(LLVM_HOST_TRIPLE "${LLVM_INFERRED_HOST_TRIPLE}" CACHE STRING
339     "Host on which LLVM binaries will run")
340
341 # Determine the native architecture.
342 string(TOLOWER "${LLVM_TARGET_ARCH}" LLVM_NATIVE_ARCH)
343 if( LLVM_NATIVE_ARCH STREQUAL "host" )
344   string(REGEX MATCH "^[^-]*" LLVM_NATIVE_ARCH ${LLVM_HOST_TRIPLE})
345 endif ()
346
347 if (LLVM_NATIVE_ARCH MATCHES "i[2-6]86")
348   set(LLVM_NATIVE_ARCH X86)
349 elseif (LLVM_NATIVE_ARCH STREQUAL "x86")
350   set(LLVM_NATIVE_ARCH X86)
351 elseif (LLVM_NATIVE_ARCH STREQUAL "amd64")
352   set(LLVM_NATIVE_ARCH X86)
353 elseif (LLVM_NATIVE_ARCH STREQUAL "x86_64")
354   set(LLVM_NATIVE_ARCH X86)
355 elseif (LLVM_NATIVE_ARCH MATCHES "sparc")
356   set(LLVM_NATIVE_ARCH Sparc)
357 elseif (LLVM_NATIVE_ARCH MATCHES "powerpc")
358   set(LLVM_NATIVE_ARCH PowerPC)
359 elseif (LLVM_NATIVE_ARCH MATCHES "aarch64")
360   set(LLVM_NATIVE_ARCH AArch64)
361 elseif (LLVM_NATIVE_ARCH MATCHES "arm64")
362   set(LLVM_NATIVE_ARCH AArch64)
363 elseif (LLVM_NATIVE_ARCH MATCHES "arm")
364   set(LLVM_NATIVE_ARCH ARM)
365 elseif (LLVM_NATIVE_ARCH MATCHES "mips")
366   set(LLVM_NATIVE_ARCH Mips)
367 elseif (LLVM_NATIVE_ARCH MATCHES "xcore")
368   set(LLVM_NATIVE_ARCH XCore)
369 elseif (LLVM_NATIVE_ARCH MATCHES "msp430")
370   set(LLVM_NATIVE_ARCH MSP430)
371 elseif (LLVM_NATIVE_ARCH MATCHES "hexagon")
372   set(LLVM_NATIVE_ARCH Hexagon)
373 elseif (LLVM_NATIVE_ARCH MATCHES "s390x")
374   set(LLVM_NATIVE_ARCH SystemZ)
375 else ()
376   message(FATAL_ERROR "Unknown architecture ${LLVM_NATIVE_ARCH}")
377 endif ()
378
379 # If build targets includes "host", then replace with native architecture.
380 list(FIND LLVM_TARGETS_TO_BUILD "host" idx)
381 if( NOT idx LESS 0 )
382   list(REMOVE_AT LLVM_TARGETS_TO_BUILD ${idx})
383   list(APPEND LLVM_TARGETS_TO_BUILD ${LLVM_NATIVE_ARCH})
384   list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD)
385 endif()
386
387 list(FIND LLVM_TARGETS_TO_BUILD ${LLVM_NATIVE_ARCH} NATIVE_ARCH_IDX)
388 if (NATIVE_ARCH_IDX EQUAL -1)
389   message(STATUS
390     "Native target ${LLVM_NATIVE_ARCH} is not selected; lli will not JIT code")
391 else ()
392   message(STATUS "Native target architecture is ${LLVM_NATIVE_ARCH}")
393   set(LLVM_NATIVE_TARGET LLVMInitialize${LLVM_NATIVE_ARCH}Target)
394   set(LLVM_NATIVE_TARGETINFO LLVMInitialize${LLVM_NATIVE_ARCH}TargetInfo)
395   set(LLVM_NATIVE_TARGETMC LLVMInitialize${LLVM_NATIVE_ARCH}TargetMC)
396   set(LLVM_NATIVE_ASMPRINTER LLVMInitialize${LLVM_NATIVE_ARCH}AsmPrinter)
397
398   # We don't have an ASM parser for all architectures yet.
399   if (EXISTS ${CMAKE_SOURCE_DIR}/lib/Target/${LLVM_NATIVE_ARCH}/AsmParser/CMakeLists.txt)
400     set(LLVM_NATIVE_ASMPARSER LLVMInitialize${LLVM_NATIVE_ARCH}AsmParser)
401   endif ()
402
403   # We don't have an disassembler for all architectures yet.
404   if (EXISTS ${CMAKE_SOURCE_DIR}/lib/Target/${LLVM_NATIVE_ARCH}/Disassembler/CMakeLists.txt)
405     set(LLVM_NATIVE_DISASSEMBLER LLVMInitialize${LLVM_NATIVE_ARCH}Disassembler)
406   endif ()
407 endif ()
408
409 if( MINGW )
410   set(HAVE_LIBIMAGEHLP 1)
411   set(HAVE_LIBPSAPI 1)
412   set(HAVE_LIBSHELL32 1)
413   # TODO: Check existence of libraries.
414   #   include(CheckLibraryExists)
415   #   CHECK_LIBRARY_EXISTS(imagehlp ??? . HAVE_LIBIMAGEHLP)
416 endif( MINGW )
417
418 if (NOT HAVE_STRTOLL)
419   # Use _strtoi64 if strtoll is not available.
420   check_symbol_exists(_strtoi64 stdlib.h have_strtoi64)
421   if (have_strtoi64)
422     set(HAVE_STRTOLL 1)
423     set(strtoll "_strtoi64")
424     set(strtoull "_strtoui64")
425   endif ()
426 endif ()
427
428 if( MSVC )
429   set(SHLIBEXT ".lib")
430   set(stricmp "_stricmp")
431   set(strdup "_strdup")
432 endif( MSVC )
433
434 if( PURE_WINDOWS )
435   CHECK_CXX_SOURCE_COMPILES("
436     #include <windows.h>
437     #include <imagehlp.h>
438     extern \"C\" void foo(PENUMLOADED_MODULES_CALLBACK);
439     extern \"C\" void foo(BOOL(CALLBACK*)(PCSTR,ULONG_PTR,ULONG,PVOID));
440     int main(){return 0;}"
441     HAVE_ELMCB_PCSTR)
442   if( HAVE_ELMCB_PCSTR )
443     set(WIN32_ELMCB_PCSTR "PCSTR")
444   else()
445     set(WIN32_ELMCB_PCSTR "PSTR")
446   endif()
447 endif( PURE_WINDOWS )
448
449 # FIXME: Signal handler return type, currently hardcoded to 'void'
450 set(RETSIGTYPE void)
451
452 if( LLVM_ENABLE_THREADS )
453   # Check if threading primitives aren't supported on this platform
454   if( NOT HAVE_PTHREAD_H AND NOT WIN32 )
455     set(LLVM_ENABLE_THREADS 0)
456   endif()
457 endif()
458
459 if( LLVM_ENABLE_THREADS )
460   message(STATUS "Threads enabled.")
461 else( LLVM_ENABLE_THREADS )
462   message(STATUS "Threads disabled.")
463 endif()
464
465 if (LLVM_ENABLE_ZLIB )
466   # Check if zlib is available in the system.
467   if ( NOT HAVE_ZLIB_H OR NOT HAVE_LIBZ )
468     set(LLVM_ENABLE_ZLIB 0)
469   endif()
470 endif()
471
472 set(LLVM_PREFIX ${CMAKE_INSTALL_PREFIX})
473
474 if (LLVM_ENABLE_DOXYGEN)
475   message(STATUS "Doxygen enabled.")
476   find_package(Doxygen REQUIRED)
477
478   if (DOXYGEN_FOUND)
479     # If we find doxygen and we want to enable doxygen by default create a
480     # global aggregate doxygen target for generating llvm and any/all
481     # subprojects doxygen documentation.
482     if (LLVM_BUILD_DOCS)
483       add_custom_target(doxygen ALL)
484     endif()
485
486     option(LLVM_DOXYGEN_EXTERNAL_SEARCH "Enable doxygen external search." OFF)
487     if (LLVM_DOXYGEN_EXTERNAL_SEARCH)
488       set(LLVM_DOXYGEN_SEARCHENGINE_URL "" CACHE STRING "URL to use for external searhc.")
489       set(LLVM_DOXYGEN_SEARCH_MAPPINGS "" CACHE STRING "Doxygen Search Mappings")
490     endif()
491   endif()
492 else()
493   message(STATUS "Doxygen disabled.")
494 endif()
495
496 if (LLVM_ENABLE_SPHINX)
497   message(STATUS "Sphinx enabled.")
498   find_package(Sphinx REQUIRED)
499   if (LLVM_BUILD_DOCS)
500     add_custom_target(sphinx ALL)
501   endif()
502 else()
503   message(STATUS "Sphinx disabled.")
504 endif()
505
506 set(LLVM_BINDINGS "")
507 if(WIN32)
508   message(STATUS "Go bindings disabled.")
509 else()
510   find_program(GO_EXECUTABLE NAMES go DOC "go executable")
511   if(GO_EXECUTABLE STREQUAL "GO_EXECUTABLE-NOTFOUND")
512     message(STATUS "Go bindings disabled.")
513   else()
514     execute_process(COMMAND ${GO_EXECUTABLE} run ${CMAKE_SOURCE_DIR}/bindings/go/conftest.go
515                     RESULT_VARIABLE GO_CONFTEST)
516     if(GO_CONFTEST STREQUAL "0")
517       set(LLVM_BINDINGS "${LLVM_BINDINGS} go")
518       message(STATUS "Go bindings enabled.")
519     else()
520       message(STATUS "Go bindings disabled, need at least Go 1.2.")
521     endif()
522   endif()
523 endif()
524
525 include(FindOCaml)
526 include(AddOCaml)
527 if(WIN32)
528   message(STATUS "OCaml bindings disabled.")
529 else()
530   find_package(OCaml)
531   if( NOT OCAML_FOUND )
532     message(STATUS "OCaml bindings disabled.")
533   else()
534     if( OCAML_VERSION VERSION_LESS "4.00.0" )
535       message(STATUS "OCaml bindings disabled, need OCaml >=4.00.0.")
536     else()
537       find_ocamlfind_package(ctypes VERSION 0.3 OPTIONAL)
538       if( HAVE_OCAML_CTYPES )
539         message(STATUS "OCaml bindings enabled.")
540         find_ocamlfind_package(oUnit VERSION 2 OPTIONAL)
541         set(LLVM_BINDINGS "${LLVM_BINDINGS} ocaml")
542       else()
543         message(STATUS "OCaml bindings disabled, need ctypes >=0.3.")
544       endif()
545     endif()
546   endif()
547 endif()
548
549 string(REPLACE " " ";" LLVM_BINDINGS_LIST "${LLVM_BINDINGS}")