]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - opencl/llvm.git/blob - cmake/config-ix.cmake
[OCaml] [cmake] Add CMake buildsystem for OCaml.
[opencl/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()
6 include(CheckIncludeFile)
7 include(CheckIncludeFileCXX)
8 include(CheckLibraryExists)
9 include(CheckSymbolExists)
10 include(CheckFunctionExists)
11 include(CheckCXXSourceCompiles)
12 include(TestBigEndian)
14 include(HandleLLVMStdlib)
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()
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)
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()
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)
80 check_include_file(mach/mach.h HAVE_MACH_MACH_H)
81 check_include_file(mach-o/dyld.h HAVE_MACH_O_DYLD_H)
83 # size_t must be defined before including cxxabi.h on FreeBSD 10.0.
84 check_cxx_source_compiles("
85 #include <stddef.h>
86 #include <cxxabi.h>
87 int main() { return 0; }
88 " HAVE_CXXABI_H)
90 # library checks
91 if( 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()
128 endif()
130 # function checks
131 check_symbol_exists(arc4random "stdlib.h" HAVE_DECL_ARC4RANDOM)
132 check_symbol_exists(backtrace "execinfo.h" HAVE_BACKTRACE)
133 check_symbol_exists(getpagesize unistd.h HAVE_GETPAGESIZE)
134 check_symbol_exists(getrusage sys/resource.h HAVE_GETRUSAGE)
135 check_symbol_exists(setrlimit sys/resource.h HAVE_SETRLIMIT)
136 check_symbol_exists(isatty unistd.h HAVE_ISATTY)
137 check_symbol_exists(isinf cmath HAVE_ISINF_IN_CMATH)
138 check_symbol_exists(isinf math.h HAVE_ISINF_IN_MATH_H)
139 check_symbol_exists(finite ieeefp.h HAVE_FINITE_IN_IEEEFP_H)
140 check_symbol_exists(isnan cmath HAVE_ISNAN_IN_CMATH)
141 check_symbol_exists(isnan math.h HAVE_ISNAN_IN_MATH_H)
142 check_symbol_exists(ceilf math.h HAVE_CEILF)
143 check_symbol_exists(floorf math.h HAVE_FLOORF)
144 check_symbol_exists(fmodf math.h HAVE_FMODF)
145 check_symbol_exists(log math.h HAVE_LOG)
146 check_symbol_exists(log2 math.h HAVE_LOG2)
147 check_symbol_exists(log10 math.h HAVE_LOG10)
148 check_symbol_exists(exp math.h HAVE_EXP)
149 check_symbol_exists(exp2 math.h HAVE_EXP2)
150 check_symbol_exists(exp10 math.h HAVE_EXP10)
151 check_symbol_exists(futimens sys/stat.h HAVE_FUTIMENS)
152 check_symbol_exists(futimes sys/time.h HAVE_FUTIMES)
153 if( 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)
158 endif()
159 if( HAVE_SYS_UIO_H )
160   check_symbol_exists(writev sys/uio.h HAVE_WRITEV)
161 endif()
162 check_symbol_exists(nearbyintf math.h HAVE_NEARBYINTF)
163 check_symbol_exists(mallinfo malloc.h HAVE_MALLINFO)
164 check_symbol_exists(malloc_zone_statistics malloc/malloc.h
165                     HAVE_MALLOC_ZONE_STATISTICS)
166 check_symbol_exists(mkdtemp "stdlib.h;unistd.h" HAVE_MKDTEMP)
167 check_symbol_exists(mkstemp "stdlib.h;unistd.h" HAVE_MKSTEMP)
168 check_symbol_exists(mktemp "stdlib.h;unistd.h" HAVE_MKTEMP)
169 check_symbol_exists(closedir "sys/types.h;dirent.h" HAVE_CLOSEDIR)
170 check_symbol_exists(opendir "sys/types.h;dirent.h" HAVE_OPENDIR)
171 check_symbol_exists(readdir "sys/types.h;dirent.h" HAVE_READDIR)
172 check_symbol_exists(getcwd unistd.h HAVE_GETCWD)
173 check_symbol_exists(gettimeofday sys/time.h HAVE_GETTIMEOFDAY)
174 check_symbol_exists(getrlimit "sys/types.h;sys/time.h;sys/resource.h" HAVE_GETRLIMIT)
175 check_symbol_exists(posix_spawn spawn.h HAVE_POSIX_SPAWN)
176 check_symbol_exists(pread unistd.h HAVE_PREAD)
177 check_symbol_exists(realpath stdlib.h HAVE_REALPATH)
178 check_symbol_exists(sbrk unistd.h HAVE_SBRK)
179 check_symbol_exists(srand48 stdlib.h HAVE_RAND48_SRAND48)
180 if( 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()
188 endif()
189 check_symbol_exists(strtoll stdlib.h HAVE_STRTOLL)
190 check_symbol_exists(strtoq stdlib.h HAVE_STRTOQ)
191 check_symbol_exists(strerror string.h HAVE_STRERROR)
192 check_symbol_exists(strerror_r string.h HAVE_STRERROR_R)
193 check_symbol_exists(strerror_s string.h HAVE_DECL_STRERROR_S)
194 check_symbol_exists(setenv stdlib.h HAVE_SETENV)
195 if( PURE_WINDOWS )
196   check_symbol_exists(_chsize_s io.h HAVE__CHSIZE_S)
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 HAVE____CHKSTK)
203   check_function_exists(__ashldi3 HAVE___ASHLDI3)
204   check_function_exists(__ashrdi3 HAVE___ASHRDI3)
205   check_function_exists(__divdi3 HAVE___DIVDI3)
206   check_function_exists(__fixdfdi HAVE___FIXDFDI)
207   check_function_exists(__fixsfdi HAVE___FIXSFDI)
208   check_function_exists(__floatdidf HAVE___FLOATDIDF)
209   check_function_exists(__lshrdi3 HAVE___LSHRDI3)
210   check_function_exists(__moddi3 HAVE___MODDI3)
211   check_function_exists(__udivdi3 HAVE___UDIVDI3)
212   check_function_exists(__umoddi3 HAVE___UMODDI3)
214   check_function_exists(__main HAVE___MAIN)
215   check_function_exists(__cmpdi2 HAVE___CMPDI2)
216 endif()
217 if( HAVE_DLFCN_H )
218   if( HAVE_LIBDL )
219     list(APPEND CMAKE_REQUIRED_LIBRARIES dl)
220   endif()
221   check_symbol_exists(dlerror dlfcn.h HAVE_DLERROR)
222   check_symbol_exists(dlopen dlfcn.h HAVE_DLOPEN)
223   if( HAVE_LIBDL )
224     list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES dl)
225   endif()
226 endif()
228 check_symbol_exists(__GLIBC__ stdio.h LLVM_USING_GLIBC)
229 if( LLVM_USING_GLIBC )
230   add_llvm_definitions( -D_GNU_SOURCE )
231 endif()
233 set(headers "sys/types.h")
235 if (HAVE_INTTYPES_H)
236   set(headers ${headers} "inttypes.h")
237 endif()
239 if (HAVE_STDINT_H)
240   set(headers ${headers} "stdint.h")
241 endif()
243 check_type_exists(int64_t "${headers}" HAVE_INT64_T)
244 check_type_exists(uint64_t "${headers}" HAVE_UINT64_T)
245 check_type_exists(u_int64_t "${headers}" HAVE_U_INT64_T)
247 # available programs checks
248 function(llvm_find_program name)
249   string(TOUPPER ${name} NAME)
250   string(REGEX REPLACE "\\." "_" NAME ${NAME})
252   find_program(LLVM_PATH_${NAME} NAMES ${ARGV})
253   mark_as_advanced(LLVM_PATH_${NAME})
254   if(LLVM_PATH_${NAME})
255     set(HAVE_${NAME} 1 CACHE INTERNAL "Is ${name} available ?")
256     mark_as_advanced(HAVE_${NAME})
257   else(LLVM_PATH_${NAME})
258     set(HAVE_${NAME} "" CACHE INTERNAL "Is ${name} available ?")
259   endif(LLVM_PATH_${NAME})
260 endfunction()
262 if (LLVM_ENABLE_DOXYGEN)
263   llvm_find_program(dot)
264 endif ()
266 if( LLVM_ENABLE_FFI )
267   find_path(FFI_INCLUDE_PATH ffi.h PATHS ${FFI_INCLUDE_DIR})
268   if( EXISTS "${FFI_INCLUDE_PATH}/ffi.h" )
269     set(FFI_HEADER ffi.h CACHE INTERNAL "")
270     set(HAVE_FFI_H 1 CACHE INTERNAL "")
271   else()
272     find_path(FFI_INCLUDE_PATH ffi/ffi.h PATHS ${FFI_INCLUDE_DIR})
273     if( EXISTS "${FFI_INCLUDE_PATH}/ffi/ffi.h" )
274       set(FFI_HEADER ffi/ffi.h CACHE INTERNAL "")
275       set(HAVE_FFI_FFI_H 1 CACHE INTERNAL "")
276     endif()
277   endif()
279   if( NOT FFI_HEADER )
280     message(FATAL_ERROR "libffi includes are not found.")
281   endif()
283   find_library(FFI_LIBRARY_PATH ffi PATHS ${FFI_LIBRARY_DIR})
284   if( NOT FFI_LIBRARY_PATH )
285     message(FATAL_ERROR "libffi is not found.")
286   endif()
288   list(APPEND CMAKE_REQUIRED_LIBRARIES ${FFI_LIBRARY_PATH})
289   list(APPEND CMAKE_REQUIRED_INCLUDES ${FFI_INCLUDE_PATH})
290   check_symbol_exists(ffi_call ${FFI_HEADER} HAVE_FFI_CALL)
291   list(REMOVE_ITEM CMAKE_REQUIRED_INCLUDES ${FFI_INCLUDE_PATH})
292   list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES ${FFI_LIBRARY_PATH})
293 else()
294   unset(HAVE_FFI_FFI_H CACHE)
295   unset(HAVE_FFI_H CACHE)
296   unset(HAVE_FFI_CALL CACHE)
297 endif( LLVM_ENABLE_FFI )
299 # Define LLVM_HAS_ATOMICS if gcc or MSVC atomic builtins are supported.
300 include(CheckAtomic)
302 if( LLVM_ENABLE_PIC )
303   set(ENABLE_PIC 1)
304 else()
305   set(ENABLE_PIC 0)
306 endif()
308 check_cxx_compiler_flag("-Wno-variadic-macros" SUPPORTS_NO_VARIADIC_MACROS_FLAG)
310 set(USE_NO_MAYBE_UNINITIALIZED 0)
311 set(USE_NO_UNINITIALIZED 0)
313 # Disable gcc's potentially uninitialized use analysis as it presents lots of
314 # false positives.
315 if (CMAKE_COMPILER_IS_GNUCXX)
316   check_cxx_compiler_flag("-Wmaybe-uninitialized" HAS_MAYBE_UNINITIALIZED)
317   if (HAS_MAYBE_UNINITIALIZED)
318     set(USE_NO_MAYBE_UNINITIALIZED 1)
319   else()
320     # Only recent versions of gcc make the distinction between -Wuninitialized
321     # and -Wmaybe-uninitialized. If -Wmaybe-uninitialized isn't supported, just
322     # turn off all uninitialized use warnings.
323     check_cxx_compiler_flag("-Wuninitialized" HAS_UNINITIALIZED)
324     set(USE_NO_UNINITIALIZED ${HAS_UNINITIALIZED})
325   endif()
326 endif()
328 # By default, we target the host, but this can be overridden at CMake
329 # invocation time.
330 include(GetHostTriple)
331 get_host_triple(LLVM_INFERRED_HOST_TRIPLE)
333 set(LLVM_HOST_TRIPLE "${LLVM_INFERRED_HOST_TRIPLE}" CACHE STRING
334     "Host on which LLVM binaries will run")
336 # Determine the native architecture.
337 string(TOLOWER "${LLVM_TARGET_ARCH}" LLVM_NATIVE_ARCH)
338 if( LLVM_NATIVE_ARCH STREQUAL "host" )
339   string(REGEX MATCH "^[^-]*" LLVM_NATIVE_ARCH ${LLVM_HOST_TRIPLE})
340 endif ()
342 if (LLVM_NATIVE_ARCH MATCHES "i[2-6]86")
343   set(LLVM_NATIVE_ARCH X86)
344 elseif (LLVM_NATIVE_ARCH STREQUAL "x86")
345   set(LLVM_NATIVE_ARCH X86)
346 elseif (LLVM_NATIVE_ARCH STREQUAL "amd64")
347   set(LLVM_NATIVE_ARCH X86)
348 elseif (LLVM_NATIVE_ARCH STREQUAL "x86_64")
349   set(LLVM_NATIVE_ARCH X86)
350 elseif (LLVM_NATIVE_ARCH MATCHES "sparc")
351   set(LLVM_NATIVE_ARCH Sparc)
352 elseif (LLVM_NATIVE_ARCH MATCHES "powerpc")
353   set(LLVM_NATIVE_ARCH PowerPC)
354 elseif (LLVM_NATIVE_ARCH MATCHES "aarch64")
355   set(LLVM_NATIVE_ARCH AArch64)
356 elseif (LLVM_NATIVE_ARCH MATCHES "arm64")
357   set(LLVM_NATIVE_ARCH AArch64)
358 elseif (LLVM_NATIVE_ARCH MATCHES "arm")
359   set(LLVM_NATIVE_ARCH ARM)
360 elseif (LLVM_NATIVE_ARCH MATCHES "mips")
361   set(LLVM_NATIVE_ARCH Mips)
362 elseif (LLVM_NATIVE_ARCH MATCHES "xcore")
363   set(LLVM_NATIVE_ARCH XCore)
364 elseif (LLVM_NATIVE_ARCH MATCHES "msp430")
365   set(LLVM_NATIVE_ARCH MSP430)
366 elseif (LLVM_NATIVE_ARCH MATCHES "hexagon")
367   set(LLVM_NATIVE_ARCH Hexagon)
368 elseif (LLVM_NATIVE_ARCH MATCHES "s390x")
369   set(LLVM_NATIVE_ARCH SystemZ)
370 else ()
371   message(FATAL_ERROR "Unknown architecture ${LLVM_NATIVE_ARCH}")
372 endif ()
374 # If build targets includes "host", then replace with native architecture.
375 list(FIND LLVM_TARGETS_TO_BUILD "host" idx)
376 if( NOT idx LESS 0 )
377   list(REMOVE_AT LLVM_TARGETS_TO_BUILD ${idx})
378   list(APPEND LLVM_TARGETS_TO_BUILD ${LLVM_NATIVE_ARCH})
379   list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD)
380 endif()
382 list(FIND LLVM_TARGETS_TO_BUILD ${LLVM_NATIVE_ARCH} NATIVE_ARCH_IDX)
383 if (NATIVE_ARCH_IDX EQUAL -1)
384   message(STATUS
385     "Native target ${LLVM_NATIVE_ARCH} is not selected; lli will not JIT code")
386 else ()
387   message(STATUS "Native target architecture is ${LLVM_NATIVE_ARCH}")
388   set(LLVM_NATIVE_TARGET LLVMInitialize${LLVM_NATIVE_ARCH}Target)
389   set(LLVM_NATIVE_TARGETINFO LLVMInitialize${LLVM_NATIVE_ARCH}TargetInfo)
390   set(LLVM_NATIVE_TARGETMC LLVMInitialize${LLVM_NATIVE_ARCH}TargetMC)
391   set(LLVM_NATIVE_ASMPRINTER LLVMInitialize${LLVM_NATIVE_ARCH}AsmPrinter)
393   # We don't have an ASM parser for all architectures yet.
394   if (EXISTS ${CMAKE_SOURCE_DIR}/lib/Target/${LLVM_NATIVE_ARCH}/AsmParser/CMakeLists.txt)
395     set(LLVM_NATIVE_ASMPARSER LLVMInitialize${LLVM_NATIVE_ARCH}AsmParser)
396   endif ()
398   # We don't have an disassembler for all architectures yet.
399   if (EXISTS ${CMAKE_SOURCE_DIR}/lib/Target/${LLVM_NATIVE_ARCH}/Disassembler/CMakeLists.txt)
400     set(LLVM_NATIVE_DISASSEMBLER LLVMInitialize${LLVM_NATIVE_ARCH}Disassembler)
401   endif ()
402 endif ()
404 if( MINGW )
405   set(HAVE_LIBIMAGEHLP 1)
406   set(HAVE_LIBPSAPI 1)
407   set(HAVE_LIBSHELL32 1)
408   # TODO: Check existence of libraries.
409   #   include(CheckLibraryExists)
410   #   CHECK_LIBRARY_EXISTS(imagehlp ??? . HAVE_LIBIMAGEHLP)
411 endif( MINGW )
413 if (NOT HAVE_STRTOLL)
414   # Use _strtoi64 if strtoll is not available.
415   check_symbol_exists(_strtoi64 stdlib.h have_strtoi64)
416   if (have_strtoi64)
417     set(HAVE_STRTOLL 1)
418     set(strtoll "_strtoi64")
419     set(strtoull "_strtoui64")
420   endif ()
421 endif ()
423 if( MSVC )
424   set(SHLIBEXT ".lib")
425   set(stricmp "_stricmp")
426   set(strdup "_strdup")
427 endif( MSVC )
429 if( PURE_WINDOWS )
430   CHECK_CXX_SOURCE_COMPILES("
431     #include <windows.h>
432     #include <imagehlp.h>
433     extern \"C\" void foo(PENUMLOADED_MODULES_CALLBACK);
434     extern \"C\" void foo(BOOL(CALLBACK*)(PCSTR,ULONG_PTR,ULONG,PVOID));
435     int main(){return 0;}"
436     HAVE_ELMCB_PCSTR)
437   if( HAVE_ELMCB_PCSTR )
438     set(WIN32_ELMCB_PCSTR "PCSTR")
439   else()
440     set(WIN32_ELMCB_PCSTR "PSTR")
441   endif()
442 endif( PURE_WINDOWS )
444 # FIXME: Signal handler return type, currently hardcoded to 'void'
445 set(RETSIGTYPE void)
447 if( LLVM_ENABLE_THREADS )
448   # Check if threading primitives aren't supported on this platform
449   if( NOT HAVE_PTHREAD_H AND NOT WIN32 )
450     set(LLVM_ENABLE_THREADS 0)
451   endif()
452 endif()
454 if( LLVM_ENABLE_THREADS )
455   message(STATUS "Threads enabled.")
456 else( LLVM_ENABLE_THREADS )
457   message(STATUS "Threads disabled.")
458 endif()
460 if (LLVM_ENABLE_ZLIB )
461   # Check if zlib is available in the system.
462   if ( NOT HAVE_ZLIB_H OR NOT HAVE_LIBZ )
463     set(LLVM_ENABLE_ZLIB 0)
464   endif()
465 endif()
467 set(LLVM_PREFIX ${CMAKE_INSTALL_PREFIX})
469 if (LLVM_ENABLE_DOXYGEN)
470   message(STATUS "Doxygen enabled.")
471   find_package(Doxygen REQUIRED)
473   if (DOXYGEN_FOUND)
474     # If we find doxygen and we want to enable doxygen by default create a
475     # global aggregate doxygen target for generating llvm and any/all
476     # subprojects doxygen documentation.
477     if (LLVM_BUILD_DOCS)
478       add_custom_target(doxygen ALL)
479     endif()
481     option(LLVM_DOXYGEN_EXTERNAL_SEARCH "Enable doxygen external search." OFF)
482     if (LLVM_DOXYGEN_EXTERNAL_SEARCH)
483       set(LLVM_DOXYGEN_SEARCHENGINE_URL "" CACHE STRING "URL to use for external searhc.")
484       set(LLVM_DOXYGEN_SEARCH_MAPPINGS "" CACHE STRING "Doxygen Search Mappings")
485     endif()
486   endif()
487 else()
488   message(STATUS "Doxygen disabled.")
489 endif()
491 if (LLVM_ENABLE_SPHINX)
492   message(STATUS "Sphinx enabled.")
493   find_package(Sphinx REQUIRED)
494   if (LLVM_BUILD_DOCS)
495     add_custom_target(sphinx ALL)
496   endif()
497 else()
498   message(STATUS "Sphinx disabled.")
499 endif()
501 set(LLVM_BINDINGS "")
502 if(WIN32)
503   message(STATUS "Go bindings disabled.")
504 else()
505   find_program(GO_EXECUTABLE NAMES go DOC "go executable")
506   if(GO_EXECUTABLE STREQUAL "GO_EXECUTABLE-NOTFOUND")
507     message(STATUS "Go bindings disabled.")
508   else()
509     execute_process(COMMAND ${GO_EXECUTABLE} run ${CMAKE_SOURCE_DIR}/bindings/go/conftest.go
510                     RESULT_VARIABLE GO_CONFTEST)
511     if(GO_CONFTEST STREQUAL "0")
512       set(LLVM_BINDINGS "${LLVM_BINDINGS} go")
513       message(STATUS "Go bindings enabled.")
514     else()
515       message(STATUS "Go bindings disabled, need at least Go 1.2.")
516     endif()
517   endif()
518 endif()
520 include(FindOCaml)
521 include(AddOCaml)
522 if(WIN32)
523   message(STATUS "OCaml bindings disabled.")
524 else()
525   find_package(OCaml)
526   if( NOT OCAML_FOUND )
527     message(STATUS "OCaml bindings disabled.")
528   else()
529     if( OCAML_VERSION VERSION_LESS "4.00.0" )
530       message(STATUS "OCaml bindings disabled, need OCaml >=4.00.0.")
531     else()
532       message(STATUS "OCaml bindings enabled.")
533       find_ocamlfind_package(ctypes VERSION 0.3)
534       find_ocamlfind_package(oUnit VERSION 2 OPTIONAL)
535       set(LLVM_BINDINGS "${LLVM_BINDINGS} ocaml")
536     endif()
537   endif()
538 endif()
540 string(REPLACE " " ";" LLVM_BINDINGS_LIST "${LLVM_BINDINGS}")