Do not allow recursive calls to vasm.
[hiphop-php.git] / CMake / HPHPFindLibs.cmake
blob0441c28ae1c9617bf6abb776efccf4459932d195
2 #   +----------------------------------------------------------------------+
3 #   | HipHop for PHP                                                       |
4 #   +----------------------------------------------------------------------+
5 #   | Copyright (c) 2010 Facebook, Inc. (http://www.facebook.com)          |
6 #   | Copyright (c) 1997-2010 The PHP Group                                |
7 #   +----------------------------------------------------------------------+
8 #   | This source file is subject to version 3.01 of the PHP license,      |
9 #   | that is bundled with this package in the file LICENSE, and is        |
10 #   | available through the world-wide-web at the following url:           |
11 #   | http://www.php.net/license/3_01.txt                                  |
12 #   | If you did not receive a copy of the PHP license and are unable to   |
13 #   | obtain it through the world-wide-web, please send a note to          |
14 #   | license@php.net so we can mail you a copy immediately.               |
15 #   +----------------------------------------------------------------------+
18 include(CheckFunctionExists)
20 add_definitions("-DHAVE_QUICKLZ")
22 # libdl
23 find_package(LibDL)
24 if (LIBDL_INCLUDE_DIRS)
25   add_definitions("-DHAVE_LIBDL")
26   include_directories(${LIBDL_INCLUDE_DIRS})
27   if (LIBDL_NEEDS_UNDERSCORE)
28     add_definitions("-DLIBDL_NEEDS_UNDERSCORE")
29   endif()
30 endif()
32 # boost checks
33 find_package(Boost 1.49.0 COMPONENTS system program_options filesystem REQUIRED)
34 include_directories(${Boost_INCLUDE_DIRS})
35 link_directories(${Boost_LIBRARY_DIRS})
36 add_definitions("-DHAVE_BOOST1_49")
39 # features.h
40 FIND_PATH(FEATURES_HEADER features.h)
41 if (FEATURES_HEADER)
42   add_definitions("-DHAVE_FEATURES_H=1")
43 endif()
45 # google-glog
46 find_package(Glog REQUIRED)
47 include_directories(${LIBGLOG_INCLUDE_DIR})
49 # inotify checks
50 find_package(Libinotify)
51 if (LIBINOTIFY_INCLUDE_DIR)
52   include_directories(${LIBINOTIFY_INCLUDE_DIR})
53 endif()
55 # iconv checks
56 find_package(Libiconv REQUIRED)
57 include_directories(${LIBICONV_INCLUDE_DIR})
58 if (LIBICONV_CONST)
59   message(STATUS "Using const for input to iconv() call")
60   add_definitions("-DICONV_CONST=const")
61 endif()
63 # mysql checks
64 find_package(MySQL REQUIRED)
65 include_directories(${MYSQL_INCLUDE_DIR})
66 link_directories(${MYSQL_LIB_DIR})
67 MYSQL_SOCKET_SEARCH()
68 if (MYSQL_UNIX_SOCK_ADDR)
69   add_definitions(-DPHP_MYSQL_UNIX_SOCK_ADDR="${MYSQL_UNIX_SOCK_ADDR}")
70 endif()
72 # libmemcached checks
73 find_package(Libmemcached REQUIRED)
74 if (LIBMEMCACHED_VERSION VERSION_LESS "0.39")
75   unset(LIBMEMCACHED_INCLUDE_DIR CACHE)
76   unset(LIBMEMCACHED_LIBRARY CACHE)
77   unset(LIBMEMCACHED_VERSION CACHE)
78   message(FATAL_ERROR "libmemcache is too old, found ${LIBMEMCACHED_VERSION} and we need 0.39")
79 endif ()
80 include_directories(${LIBMEMCACHED_INCLUDE_DIR})
81 link_directories(${LIBMEMCACHED_LIBRARY_DIRS})
83 # pcre checks
84 find_package(PCRE REQUIRED)
85 include_directories(${PCRE_INCLUDE_DIR})
87 # libevent checks
88 find_package(LibEvent REQUIRED)
89 include_directories(${LIBEVENT_INCLUDE_DIR})
91 set(CMAKE_REQUIRED_LIBRARIES "${LIBEVENT_LIB}")
92 CHECK_FUNCTION_EXISTS("evhttp_bind_socket_with_fd" HAVE_CUSTOM_LIBEVENT)
93 if(HAVE_CUSTOM_LIBEVENT)
94         message("Using custom LIBEVENT")
95         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_CUSTOM_LIBEVENT")
96 endif()
97 set(CMAKE_REQUIRED_LIBRARIES)
99 find_package(LibUODBC)
100 if (LIBUODBC_INCLUDE_DIRS)
101   include_directories(${LIBUODBC_INCLUDE_DIRS})
102   add_definitions("-DHAVE_UODBC")
103 endif ()
105 # libXed
106 find_package(LibXed)
107 if (LibXed_INCLUDE_DIR AND LibXed_LIBRARY)
108   include_directories(${LibXed_INCLUDE_DIR})
109   add_definitions("-DHAVE_LIBXED")
110 endif()
112 # CURL checks
113 find_package(CURL REQUIRED)
114 include_directories(${CURL_INCLUDE_DIR})
116 set(CMAKE_REQUIRED_LIBRARIES "${CURL_LIBRARIES}")
117 CHECK_FUNCTION_EXISTS("curl_multi_select" HAVE_CURL_MULTI_SELECT)
118 CHECK_FUNCTION_EXISTS("curl_multi_wait" HAVE_CURL_MULTI_WAIT)
119 if (HAVE_CURL_MULTI_SELECT)
120   add_definitions("-DHAVE_CURL_MULTI_SELECT")
121 endif()
122 if (HAVE_CURL_MULTI_WAIT)
123   add_definitions("-DHAVE_CURL_MULTI_WAIT")
124 endif()
125 set(CMAKE_REQUIRED_LIBRARIES)
127 # LibXML2 checks
128 find_package(LibXml2 REQUIRED)
129 include_directories(${LIBXML2_INCLUDE_DIR})
130 add_definitions(${LIBXML2_DEFINITIONS})
132 find_package(LibXslt REQUIRED)
133 include_directories(${LIBXSLT_INCLUDE_DIR})
134 add_definitions(${LIBXSLT_DEFINITIONS})
136 find_package(EXPAT REQUIRED)
137 include_directories(${EXPAT_INCLUDE_DIRS})
139 # libsqlite3
140 find_package(LibSQLite)
141 if (LIBSQLITE_INCLUDE_DIR)
142   include_directories(${LIBSQLITE_INCLUDE_DIR})
143 endif ()
145 # libdouble-conversion
146 find_package(DoubleConversion)
147 if (DOUBLE_CONVERSION_INCLUDE_DIR)
148   include_directories(${DOUBLE_CONVERSION_INCLUDE_DIR})
149 endif ()
151 # liblz4
152 find_package(LZ4)
153 if (LZ4_INCLUDE_DIR)
154   include_directories(${LZ4_INCLUDE_DIR})
155 endif()
157 # libzip
158 find_package(LibZip)
159 if (LIBZIP_INCLUDE_DIR_ZIP AND LIBZIP_INCLUDE_DIR_ZIPCONF)
160   if (LIBZIP_VERSION VERSION_LESS "0.11")
161     unset(LIBZIP_FOUND CACHE)
162     unset(LIBZIP_LIBRARY CACHE)
163     unset(LIBZIP_INCLUDE_DIR_ZIP CACHE)
164     unset(LIBZIP_INCLUDE_DIR_ZIPCONF CACHE)
165     message(STATUS "libzip is too old, found ${LIBZIP_VERSION} and we need 0.11+, using third-party bundled libzip")
166   else ()
167     include_directories(${LIBZIP_INCLUDE_DIR_ZIP} ${LIBZIP_INCLUDE_DIR_ZIPCONF})
168     message(STATUS "Found libzip: ${LIBZIP_LIBRARY} ${LIBZIP_VERSION}")
169   endif ()
170 else ()
171   message(STATUS "Using third-party bundled libzip")
172 endif()
174 # ICU
175 find_package(ICU REQUIRED)
176 if (ICU_FOUND)
177   if (ICU_VERSION VERSION_LESS "4.2")
178     unset(ICU_FOUND CACHE)
179     unset(ICU_INCLUDE_DIRS CACHE)
180     unset(ICU_LIBRARIES CACHE)
181     message(FATAL_ERROR "ICU is too old, found ${ICU_VERSION} and we need 4.2")
182   endif ()
183   include_directories(${ICU_INCLUDE_DIRS})
184 endif (ICU_FOUND)
186 # jemalloc/tmalloc and profiler
187 if (USE_GOOGLE_HEAP_PROFILER OR USE_GOOGLE_CPU_PROFILER)
188   FIND_LIBRARY(GOOGLE_PROFILER_LIB profiler)
189   FIND_PATH(GOOGLE_PROFILER_INCLUDE_DIR NAMES google/profiler.h)
190   if (GOOGLE_PROFILER_INCLUDE_DIR)
191     include_directories(${GOOGLE_PROFILER_INCLUDE_DIR})
192   endif()
193   if (GOOGLE_PROFILER_LIB)
194     message(STATUS "Found Google profiler: ${GOOGLE_PROFILER_LIB}")
195     if (USE_GOOGLE_CPU_PROFILER)
196       set(GOOGLE_CPU_PROFILER_ENABLED 1)
197     endif()
198   else()
199     message(STATUS "Can't find Google profiler")
200   endif()
201 endif()
203 if (USE_GOOGLE_HEAP_PROFILER AND GOOGLE_PROFILER_LIB)
204   FIND_LIBRARY(GOOGLE_TCMALLOC_FULL_LIB tcmalloc)
205   if (GOOGLE_TCMALLOC_FULL_LIB)
206     message(STATUS "Found full tcmalloc: ${GOOGLE_TCMALLOC_FULL_LIB}")
207     set(GOOGLE_HEAP_PROFILER_ENABLED 1)
208     set(GOOGLE_TCMALLOC_ENABLED 1)
209   else()
210     message(STATUS "Can't find full tcmalloc - heap profiling is disabled")
211   endif()
212 endif()
214 if (USE_JEMALLOC AND NOT GOOGLE_TCMALLOC_ENABLED)
215   FIND_LIBRARY(JEMALLOC_LIB NAMES jemalloc)
216   FIND_PATH(JEMALLOC_INCLUDE_DIR NAMES jemalloc/jemalloc.h)
218   if (JEMALLOC_INCLUDE_DIR AND JEMALLOC_LIB)
219     include_directories(${JEMALLOC_INCLUDE_DIR})
221     set (CMAKE_REQUIRED_INCLUDES ${JEMALLOC_INCLUDE_DIR})
222     INCLUDE(CheckCXXSourceCompiles)
223     CHECK_CXX_SOURCE_COMPILES("
224 #include <jemalloc/jemalloc.h>
226 #define JEMALLOC_VERSION_NUMERIC ((JEMALLOC_VERSION_MAJOR << 24) | (JEMALLOC_VERSION_MINOR << 16) | (JEMALLOC_VERSION_BUGFIX << 8) | JEMALLOC_VERSION_NDEV)
228 #if JEMALLOC_VERSION_NUMERIC < 0x03050100
229 # error jemalloc version >= 3.5.1 required
230 #endif
232 int main(void) { return 0; }" JEMALLOC_VERSION_MINIMUM)
233     set (CMAKE_REQUIRED_INCLUDES)
235     if (JEMALLOC_VERSION_MINIMUM)
236       message(STATUS "Found jemalloc: ${JEMALLOC_LIB}")
237       set(JEMALLOC_ENABLED 1)
238     else()
239       message(STATUS "Found jemalloc, but it was too old")
240     endif()
241   endif()
242 endif()
244 if (USE_TCMALLOC AND NOT JEMALLOC_ENABLED AND NOT GOOGLE_TCMALLOC_ENABLED)
245   FIND_LIBRARY(GOOGLE_TCMALLOC_MIN_LIB tcmalloc_minimal)
246   if (GOOGLE_TCMALLOC_MIN_LIB)
247     message(STATUS "Found minimal tcmalloc: ${GOOGLE_TCMALLOC_MIN_LIB}")
248     set(GOOGLE_TCMALLOC_ENABLED 1)
249   else()
250     message(STATUS "Can't find minimal tcmalloc")
251   endif()
252 endif()
254 if (JEMALLOC_ENABLED)
255   add_definitions(-DUSE_JEMALLOC=1)
256 else()
257   add_definitions(-DNO_JEMALLOC=1)
258 endif()
259 if (GOOGLE_TCMALLOC_ENABLED)
260   add_definitions(-DGOOGLE_TCMALLOC=1)
261 else()
262   add_definitions(-DNO_TCMALLOC=1)
263 endif()
264 if (GOOGLE_HEAP_PROFILER_ENABLED)
265   add_definitions(-DGOOGLE_HEAP_PROFILER=1)
266 endif()
267 if (GOOGLE_CPU_PROFILER_ENABLED)
268   add_definitions(-DGOOGLE_CPU_PROFILER=1)
269 endif()
271 # tbb libs
272 find_package(TBB REQUIRED)
273 if (${TBB_INTERFACE_VERSION} LESS 5005)
274   unset(TBB_FOUND CACHE)
275   unset(TBB_INCLUDE_DIRS CACHE)
276   unset(TBB_LIBRARIES CACHE)
277   message(FATAL_ERROR "TBB is too old, please install at least 3.0(5005), preferably 4.0(6000) or higher")
278 endif()
279 include_directories(${TBB_INCLUDE_DIRS})
280 link_directories(${TBB_LIBRARY_DIRS})
282 # mcrypt libs
283 find_package(Mcrypt REQUIRED)
284 include_directories(${Mcrypt_INCLUDE_DIR})
286 # OpenSSL libs
287 find_package(OpenSSL REQUIRED)
288 include_directories(${OPENSSL_INCLUDE_DIR})
290 # ZLIB
291 find_package(ZLIB REQUIRED)
292 include_directories(${ZLIB_INCLUDE_DIR})
294 find_package(BZip2 REQUIRED)
295 include_directories(${BZIP2_INCLUDE_DIR})
296 add_definitions(${BZIP2_DEFINITIONS})
298 # oniguruma
299 find_package(ONIGURUMA REQUIRED)
300 include_directories(${ONIGURUMA_INCLUDE_DIRS})
302 # LDAP
303 find_package(Ldap REQUIRED)
304 include_directories(${LDAP_INCLUDE_DIR})
306 # libpthreads
307 find_package(PThread REQUIRED)
308 include_directories(${LIBPTHREAD_INCLUDE_DIRS})
310 # Either Readline or Editline (for hphpd)
311 find_package(Readline)
312 find_package(Editline)
313 if (EDITLINE_INCLUDE_DIRS)
314   add_definitions("-DUSE_EDITLINE")
315   include_directories(${EDITLINE_INCLUDE_DIRS})
316 elseif (READLINE_INCLUDE_DIR)
317   include_directories(${READLINE_INCLUDE_DIR})
318 else()
319   message(FATAL_ERROR "Could not find Readline or Editline")
320 endif()
322 find_package(LibDwarf REQUIRED)
323 include_directories(${LIBDWARF_INCLUDE_DIRS})
324 if (LIBDWARF_CONST_NAME)
325   add_definitions("-DLIBDWARF_CONST_NAME")
326 endif()
327 if (LIBDWARF_USE_INIT_C)
328   add_definitions("-DLIBDWARF_USE_INIT_C")
329 endif()
331 find_package(LibElf REQUIRED)
332 include_directories(${LIBELF_INCLUDE_DIRS})
333 if (ELF_GETSHDRSTRNDX)
334   add_definitions("-DHAVE_ELF_GETSHDRSTRNDX")
335 endif()
337 find_package(Libpam)
338 if (PAM_INCLUDE_PATH)
339   include_directories(${PAM_INCLUDE_PATH})
340 endif()
342 # LLVM. Disabled in OSS for now: t5056266
343 # find_package(LLVM)
344 # if (LIBLLVM_INCLUDE_DIR)
345 #   include_directories(LIBLLVM_INCLUDE_DIR)
346 #   add_definitions("-DUSE_LLVM")
347 # endif()
349 FIND_LIBRARY(CRYPT_LIB NAMES xcrypt crypt crypto)
350 if (LINUX OR FREEBSD)
351   FIND_LIBRARY (RT_LIB rt)
352 endif()
354 if (LINUX)
355   FIND_LIBRARY (CAP_LIB cap)
357   if (NOT CAP_LIB)
358     message(FATAL_ERROR "You need to install libcap")
359   endif()
360 endif()
362 if (LINUX OR APPLE)
363   FIND_LIBRARY (DL_LIB dl)
364   FIND_LIBRARY (RESOLV_LIB resolv)
365 endif()
367 FIND_LIBRARY (BFD_LIB libbfd.a)
368 FIND_LIBRARY (LIBIBERTY_LIB iberty)
370 if (NOT BFD_LIB)
371   message(FATAL_ERROR "You need to install binutils")
372 endif()
374 if (NOT LIBIBERTY_LIB)
375   message(FATAL_ERROR "You need to install libiberty (usually bundled with binutils)")
376 endif()
378 if (FREEBSD)
379   FIND_LIBRARY (EXECINFO_LIB execinfo)
380   if (NOT EXECINFO_LIB)
381     message(FATAL_ERROR "You need to install libexecinfo")
382   endif()
383 endif()
385 if (APPLE)
386   find_library(LIBINTL_LIBRARIES NAMES intl libintl)
387   if (LIBINTL_INCLUDE_DIR)
388     include_directories(${LIBINTL_INCLUDE_DIR})
389   endif()
390   find_library(KERBEROS_LIB NAMES gssapi_krb5)
391 endif()
393 #find_package(BISON REQUIRED)
394 #find_package(FLEX REQUIRED)
396 #if (${FLEX_VERSION} VERSION_LESS 2.5.33)
397 #  message(FATAL_ERROR "Flex is too old, found ${FLEX_VERSION} and we need 2.5.33")
398 #endif()
400 include_directories(${HPHP_HOME}/hphp)
402 macro(hphp_link target)
403   if (LIBDL_LIBRARIES)
404     target_link_libraries(${target} ${LIBDL_LIBRARIES})
405   endif ()
407   if (GOOGLE_HEAP_PROFILER_ENABLED OR GOOGLE_CPU_PROFILER_ENABLED)
408     target_link_libraries(${target} ${GOOGLE_PROFILER_LIB})
409   endif()
411   if (JEMALLOC_ENABLED)
412     target_link_libraries(${target} ${JEMALLOC_LIB})
413   endif()
415   if (GOOGLE_HEAP_PROFILER_ENABLED)
416     target_link_libraries(${target} ${GOOGLE_TCMALLOC_FULL_LIB})
417   elseif (GOOGLE_TCMALLOC_ENABLED)
418     target_link_libraries(${target} ${GOOGLE_TCMALLOC_MIN_LIB})
419   endif()
421   target_link_libraries(${target} ${Boost_LIBRARIES})
422   target_link_libraries(${target} ${MYSQL_CLIENT_LIBS})
423   target_link_libraries(${target} ${PCRE_LIBRARY})
424   target_link_libraries(${target} ${ICU_DATA_LIBRARIES} ${ICU_I18N_LIBRARIES} ${ICU_LIBRARIES})
425   target_link_libraries(${target} ${LIBEVENT_LIB})
426   target_link_libraries(${target} ${CURL_LIBRARIES})
427   target_link_libraries(${target} ${LIBGLOG_LIBRARY})
428   if (LIBJSONC_LIBRARY)
429     target_link_libraries(${target} ${LIBJSONC_LIBRARY})
430   endif()
432   if (LibXed_LIBRARY)
433     target_link_libraries(${target} ${LibXed_LIBRARY})
434   endif()
436   if (LIBINOTIFY_LIBRARY)
437     target_link_libraries(${target} ${LIBINOTIFY_LIBRARY})
438   endif()
440   if (LIBICONV_LIBRARY)
441     target_link_libraries(${target} ${LIBICONV_LIBRARY})
442   endif()
444   if (LINUX)
445     target_link_libraries(${target} ${CAP_LIB})
446   endif()
448   if (LINUX OR APPLE)
449     target_link_libraries(${target} ${RESOLV_LIB})
450     target_link_libraries(${target} ${DL_LIB})
451   endif()
453   if (FREEBSD)
454     target_link_libraries(${target} ${EXECINFO_LIB})
455   endif()
457   if (APPLE)
458     target_link_libraries(${target} ${LIBINTL_LIBRARIES})
459     target_link_libraries(${target} ${KERBEROS_LIB})
460   endif()
462   target_link_libraries(${target} ${BFD_LIB})
463   target_link_libraries(${target} ${LIBIBERTY_LIB})
465   if (${LIBPTHREAD_LIBRARIES})
466     target_link_libraries(${target} ${LIBPTHREAD_LIBRARIES})
467   endif()
469   target_link_libraries(${target} ${TBB_LIBRARIES})
470   target_link_libraries(${target} ${OPENSSL_LIBRARIES})
471   target_link_libraries(${target} ${ZLIB_LIBRARIES})
472   target_link_libraries(${target} ${BZIP2_LIBRARIES})
474   target_link_libraries(${target} ${LIBXML2_LIBRARIES})
475   target_link_libraries(${target} ${LIBXSLT_LIBRARIES})
476   target_link_libraries(${target} ${LIBXSLT_EXSLT_LIBRARIES})
477   target_link_libraries(${target} ${EXPAT_LIBRARY})
478   target_link_libraries(${target} ${ONIGURUMA_LIBRARIES})
479   target_link_libraries(${target} ${Mcrypt_LIB})
481   if (LIBUODBC_LIBRARIES)
482     target_link_libraries(${target} ${LIBUODBC_LIBRARIES})
483   endif()
485   target_link_libraries(${target} ${LDAP_LIBRARIES})
486   target_link_libraries(${target} ${LBER_LIBRARIES})
488   target_link_libraries(${target} ${LIBMEMCACHED_LIBRARIES})
490   target_link_libraries(${target} ${CRYPT_LIB})
492   if (LINUX OR FREEBSD)
493     target_link_libraries(${target} ${RT_LIB})
494   endif()
496   if (LIBSQLITE3_FOUND AND LIBSQLITE3_LIBRARY)
497     target_link_libraries(${target} ${LIBSQLITE3_LIBRARY})
498   else()
499     target_link_libraries(${target} sqlite3)
500   endif()
502   if (DOUBLE_CONVERSION_LIBRARY)
503     target_link_libraries(${target} ${DOUBLE_CONVERSION_LIBRARY})
504   else()
505     target_link_libraries(${target} double-conversion)
506   endif()
508   if (LZ4_LIBRARY)
509     target_link_libraries(${target} ${LZ4_LIBRARY})
510   else()
511     target_link_libraries(${target} lz4)
512   endif()
514   if (LIBZIP_LIBRARY)
515     target_link_libraries(${target} ${LIBZIP_LIBRARY})
516   else()
517     target_link_libraries(${target} zip_static)
518   endif()
520   if (PCRE_LIBRARY)
521     target_link_libraries(${target} ${PCRE_LIBRARY})
522   else()
523     target_link_libraries(${target} pcre)
524   endif()
526   target_link_libraries(${target} fastlz)
527   target_link_libraries(${target} timelib)
528   target_link_libraries(${target} folly)
530   target_link_libraries(${target} afdt)
531   target_link_libraries(${target} mbfl)
533   if (EDITLINE_LIBRARIES)
534     target_link_libraries(${target} ${EDITLINE_LIBRARIES})
535   elseif (READLINE_LIBRARY)
536     target_link_libraries(${target} ${READLINE_LIBRARY})
537   endif()
539   if (PAM_LIBRARY)
540     target_link_libraries(${target} ${PAM_LIBRARY})
541   endif()
543   target_link_libraries(${target} ${LIBDWARF_LIBRARIES})
544   target_link_libraries(${target} ${LIBELF_LIBRARIES})
546   if (LIBLLVM_LIBRARY)
547     target_link_libraries(${target} ${LIBLLVM_LIBRARY})
548   endif()
550   if (LINUX)
551     target_link_libraries(${target} -Wl,--wrap=pthread_create -Wl,--wrap=pthread_exit -Wl,--wrap=pthread_join)
552   endif()
553 endmacro()