]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - opencl/llvm.git/blob - cmake/config-ix.cmake
Updates to sync with changes in upstream.
[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 "c6000")
367   set(LLVM_NATIVE_ARCH C6000)
368 elseif (LLVM_NATIVE_ARCH MATCHES "hexagon")
369   set(LLVM_NATIVE_ARCH Hexagon)
370 elseif (LLVM_NATIVE_ARCH MATCHES "s390x")
371   set(LLVM_NATIVE_ARCH SystemZ)
372 else ()
373   message(FATAL_ERROR "Unknown architecture ${LLVM_NATIVE_ARCH}")
374 endif ()
376 # If build targets includes "host", then replace with native architecture.
377 list(FIND LLVM_TARGETS_TO_BUILD "host" idx)
378 if( 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)
382 endif()
384 list(FIND LLVM_TARGETS_TO_BUILD ${LLVM_NATIVE_ARCH} NATIVE_ARCH_IDX)
385 if (NATIVE_ARCH_IDX EQUAL -1)
386   message(STATUS
387     "Native target ${LLVM_NATIVE_ARCH} is not selected; lli will not JIT code")
388 else ()
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)
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 ()
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 ()
404 endif ()
406 if( 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)
413 endif( MINGW )
415 if (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 ()
423 endif ()
425 if( MSVC )
426   set(SHLIBEXT ".lib")
427   set(stricmp "_stricmp")
428   set(strdup "_strdup")
429 endif( MSVC )
431 if( 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()
444 endif( PURE_WINDOWS )
446 # FIXME: Signal handler return type, currently hardcoded to 'void'
447 set(RETSIGTYPE void)
449 if( 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()
454 endif()
456 if( LLVM_ENABLE_THREADS )
457   message(STATUS "Threads enabled.")
458 else( LLVM_ENABLE_THREADS )
459   message(STATUS "Threads disabled.")
460 endif()
462 if (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()
467 endif()
469 set(LLVM_PREFIX ${CMAKE_INSTALL_PREFIX})
471 if (LLVM_ENABLE_DOXYGEN)
472   message(STATUS "Doxygen enabled.")
473   find_package(Doxygen REQUIRED)
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()
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()
489 else()
490   message(STATUS "Doxygen disabled.")
491 endif()
493 if (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()
499 else()
500   message(STATUS "Sphinx disabled.")
501 endif()
503 set(LLVM_BINDINGS "")
504 if(WIN32)
505   message(STATUS "Go bindings disabled.")
506 else()
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()
520 endif()
522 include(FindOCaml)
523 include(AddOCaml)
524 if(WIN32)
525   message(STATUS "OCaml bindings disabled.")
526 else()
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()
544 endif()
546 string(REPLACE " " ";" LLVM_BINDINGS_LIST "${LLVM_BINDINGS}")