Remove QuickLZ from OSS builds
[hiphop-php.git] / CMake / HPHPFindLibs.cmake
blob332c2f54c58f63c4227026d80db00342e5755be4
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 # libdl
21 find_package(LibDL)
22 if (LIBDL_INCLUDE_DIRS)
23   add_definitions("-DHAVE_LIBDL")
24   include_directories(${LIBDL_INCLUDE_DIRS})
25   if (LIBDL_NEEDS_UNDERSCORE)
26     add_definitions("-DLIBDL_NEEDS_UNDERSCORE")
27   endif()
28 endif()
30 # boost checks
31 find_package(Boost 1.49.0 COMPONENTS system program_options filesystem REQUIRED)
32 include_directories(${Boost_INCLUDE_DIRS})
33 link_directories(${Boost_LIBRARY_DIRS})
34 add_definitions("-DHAVE_BOOST1_49")
37 # features.h
38 FIND_PATH(FEATURES_HEADER features.h)
39 if (FEATURES_HEADER)
40   add_definitions("-DHAVE_FEATURES_H=1")
41 endif()
43 # google-glog
44 find_package(Glog REQUIRED)
45 include_directories(${LIBGLOG_INCLUDE_DIR})
47 # inotify checks
48 find_package(Libinotify)
49 if (LIBINOTIFY_INCLUDE_DIR)
50   include_directories(${LIBINOTIFY_INCLUDE_DIR})
51 endif()
53 # iconv checks
54 find_package(Libiconv REQUIRED)
55 include_directories(${LIBICONV_INCLUDE_DIR})
56 if (LIBICONV_CONST)
57   message(STATUS "Using const for input to iconv() call")
58   add_definitions("-DICONV_CONST=const")
59 endif()
61 # mysql checks
62 find_package(MySQL REQUIRED)
63 include_directories(${MYSQL_INCLUDE_DIR})
64 link_directories(${MYSQL_LIB_DIR})
65 MYSQL_SOCKET_SEARCH()
66 if (MYSQL_UNIX_SOCK_ADDR)
67   add_definitions(-DPHP_MYSQL_UNIX_SOCK_ADDR="${MYSQL_UNIX_SOCK_ADDR}")
68 endif()
70 # libmemcached checks
71 find_package(Libmemcached REQUIRED)
72 if (LIBMEMCACHED_VERSION VERSION_LESS "0.39")
73   unset(LIBMEMCACHED_INCLUDE_DIR CACHE)
74   unset(LIBMEMCACHED_LIBRARY CACHE)
75   unset(LIBMEMCACHED_VERSION CACHE)
76   message(FATAL_ERROR "libmemcache is too old, found ${LIBMEMCACHED_VERSION} and we need 0.39")
77 endif ()
78 include_directories(${LIBMEMCACHED_INCLUDE_DIR})
79 link_directories(${LIBMEMCACHED_LIBRARY_DIRS})
81 # pcre checks
82 find_package(PCRE REQUIRED)
83 include_directories(${PCRE_INCLUDE_DIR})
85 # libevent checks
86 find_package(LibEvent REQUIRED)
87 include_directories(${LIBEVENT_INCLUDE_DIR})
89 set(CMAKE_REQUIRED_LIBRARIES "${LIBEVENT_LIB}")
90 CHECK_FUNCTION_EXISTS("evhttp_bind_socket_with_fd" HAVE_CUSTOM_LIBEVENT)
91 if(HAVE_CUSTOM_LIBEVENT)
92         message("Using custom LIBEVENT")
93         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_CUSTOM_LIBEVENT")
94 endif()
95 set(CMAKE_REQUIRED_LIBRARIES)
97 find_package(LibUODBC)
98 if (LIBUODBC_INCLUDE_DIRS)
99   include_directories(${LIBUODBC_INCLUDE_DIRS})
100   add_definitions("-DHAVE_UODBC")
101 endif ()
103 # libXed
104 find_package(LibXed)
105 if (LibXed_INCLUDE_DIR AND LibXed_LIBRARY)
106   include_directories(${LibXed_INCLUDE_DIR})
107   add_definitions("-DHAVE_LIBXED")
108 endif()
110 # CURL checks
111 find_package(CURL REQUIRED)
112 include_directories(${CURL_INCLUDE_DIR})
114 set(CMAKE_REQUIRED_LIBRARIES "${CURL_LIBRARIES}")
115 CHECK_FUNCTION_EXISTS("curl_multi_select" HAVE_CURL_MULTI_SELECT)
116 CHECK_FUNCTION_EXISTS("curl_multi_wait" HAVE_CURL_MULTI_WAIT)
117 if (HAVE_CURL_MULTI_SELECT)
118   add_definitions("-DHAVE_CURL_MULTI_SELECT")
119 endif()
120 if (HAVE_CURL_MULTI_WAIT)
121   add_definitions("-DHAVE_CURL_MULTI_WAIT")
122 endif()
123 set(CMAKE_REQUIRED_LIBRARIES)
125 # LibXML2 checks
126 find_package(LibXml2 REQUIRED)
127 include_directories(${LIBXML2_INCLUDE_DIR})
128 add_definitions(${LIBXML2_DEFINITIONS})
130 find_package(LibXslt REQUIRED)
131 include_directories(${LIBXSLT_INCLUDE_DIR})
132 add_definitions(${LIBXSLT_DEFINITIONS})
134 find_package(EXPAT REQUIRED)
135 include_directories(${EXPAT_INCLUDE_DIRS})
137 # libsqlite3
138 find_package(LibSQLite)
139 if (LIBSQLITE_INCLUDE_DIR)
140   include_directories(${LIBSQLITE_INCLUDE_DIR})
141 endif ()
143 # libdouble-conversion
144 find_package(DoubleConversion)
145 if (DOUBLE_CONVERSION_INCLUDE_DIR)
146   include_directories(${DOUBLE_CONVERSION_INCLUDE_DIR})
147 endif ()
149 # liblz4
150 find_package(LZ4)
151 if (LZ4_INCLUDE_DIR)
152   include_directories(${LZ4_INCLUDE_DIR})
153 endif()
155 # libzip
156 find_package(LibZip)
157 if (LIBZIP_INCLUDE_DIR_ZIP AND LIBZIP_INCLUDE_DIR_ZIPCONF)
158   if (LIBZIP_VERSION VERSION_LESS "0.11")
159     unset(LIBZIP_FOUND CACHE)
160     unset(LIBZIP_LIBRARY CACHE)
161     unset(LIBZIP_INCLUDE_DIR_ZIP CACHE)
162     unset(LIBZIP_INCLUDE_DIR_ZIPCONF CACHE)
163     message(STATUS "libzip is too old, found ${LIBZIP_VERSION} and we need 0.11+, using third-party bundled libzip")
164   else ()
165     include_directories(${LIBZIP_INCLUDE_DIR_ZIP} ${LIBZIP_INCLUDE_DIR_ZIPCONF})
166     message(STATUS "Found libzip: ${LIBZIP_LIBRARY} ${LIBZIP_VERSION}")
167   endif ()
168 else ()
169   message(STATUS "Using third-party bundled libzip")
170 endif()
172 # ICU
173 find_package(ICU REQUIRED)
174 if (ICU_FOUND)
175   if (ICU_VERSION VERSION_LESS "4.2")
176     unset(ICU_FOUND CACHE)
177     unset(ICU_INCLUDE_DIRS CACHE)
178     unset(ICU_LIBRARIES CACHE)
179     message(FATAL_ERROR "ICU is too old, found ${ICU_VERSION} and we need 4.2")
180   endif ()
181   include_directories(${ICU_INCLUDE_DIRS})
182 endif (ICU_FOUND)
184 # jemalloc/tmalloc and profiler
185 if (USE_GOOGLE_HEAP_PROFILER OR USE_GOOGLE_CPU_PROFILER)
186   FIND_LIBRARY(GOOGLE_PROFILER_LIB profiler)
187   FIND_PATH(GOOGLE_PROFILER_INCLUDE_DIR NAMES google/profiler.h)
188   if (GOOGLE_PROFILER_INCLUDE_DIR)
189     include_directories(${GOOGLE_PROFILER_INCLUDE_DIR})
190   endif()
191   if (GOOGLE_PROFILER_LIB)
192     message(STATUS "Found Google profiler: ${GOOGLE_PROFILER_LIB}")
193     if (USE_GOOGLE_CPU_PROFILER)
194       set(GOOGLE_CPU_PROFILER_ENABLED 1)
195     endif()
196   else()
197     message(STATUS "Can't find Google profiler")
198   endif()
199 endif()
201 if (USE_GOOGLE_HEAP_PROFILER AND GOOGLE_PROFILER_LIB)
202   FIND_LIBRARY(GOOGLE_TCMALLOC_FULL_LIB tcmalloc)
203   if (GOOGLE_TCMALLOC_FULL_LIB)
204     message(STATUS "Found full tcmalloc: ${GOOGLE_TCMALLOC_FULL_LIB}")
205     set(GOOGLE_HEAP_PROFILER_ENABLED 1)
206     set(GOOGLE_TCMALLOC_ENABLED 1)
207   else()
208     message(STATUS "Can't find full tcmalloc - heap profiling is disabled")
209   endif()
210 endif()
212 if (USE_JEMALLOC AND NOT GOOGLE_TCMALLOC_ENABLED)
213   FIND_LIBRARY(JEMALLOC_LIB NAMES jemalloc)
214   FIND_PATH(JEMALLOC_INCLUDE_DIR NAMES jemalloc/jemalloc.h)
216   if (JEMALLOC_INCLUDE_DIR AND JEMALLOC_LIB)
217     include_directories(${JEMALLOC_INCLUDE_DIR})
219     set (CMAKE_REQUIRED_INCLUDES ${JEMALLOC_INCLUDE_DIR})
220     INCLUDE(CheckCXXSourceCompiles)
221     CHECK_CXX_SOURCE_COMPILES("
222 #include <jemalloc/jemalloc.h>
224 #define JEMALLOC_VERSION_NUMERIC ((JEMALLOC_VERSION_MAJOR << 24) | (JEMALLOC_VERSION_MINOR << 16) | (JEMALLOC_VERSION_BUGFIX << 8) | JEMALLOC_VERSION_NDEV)
226 #if JEMALLOC_VERSION_NUMERIC < 0x03050100
227 # error jemalloc version >= 3.5.1 required
228 #endif
230 int main(void) { return 0; }" JEMALLOC_VERSION_MINIMUM)
231     set (CMAKE_REQUIRED_INCLUDES)
233     if (JEMALLOC_VERSION_MINIMUM)
234       message(STATUS "Found jemalloc: ${JEMALLOC_LIB}")
235       set(JEMALLOC_ENABLED 1)
236     else()
237       message(STATUS "Found jemalloc, but it was too old")
238     endif()
239   endif()
240 endif()
242 if (USE_TCMALLOC AND NOT JEMALLOC_ENABLED AND NOT GOOGLE_TCMALLOC_ENABLED)
243   FIND_LIBRARY(GOOGLE_TCMALLOC_MIN_LIB tcmalloc_minimal)
244   if (GOOGLE_TCMALLOC_MIN_LIB)
245     message(STATUS "Found minimal tcmalloc: ${GOOGLE_TCMALLOC_MIN_LIB}")
246     set(GOOGLE_TCMALLOC_ENABLED 1)
247   else()
248     message(STATUS "Can't find minimal tcmalloc")
249   endif()
250 endif()
252 if (JEMALLOC_ENABLED)
253   add_definitions(-DUSE_JEMALLOC=1)
254 else()
255   add_definitions(-DNO_JEMALLOC=1)
256 endif()
257 if (GOOGLE_TCMALLOC_ENABLED)
258   add_definitions(-DGOOGLE_TCMALLOC=1)
259 else()
260   add_definitions(-DNO_TCMALLOC=1)
261 endif()
262 if (GOOGLE_HEAP_PROFILER_ENABLED)
263   add_definitions(-DGOOGLE_HEAP_PROFILER=1)
264 endif()
265 if (GOOGLE_CPU_PROFILER_ENABLED)
266   add_definitions(-DGOOGLE_CPU_PROFILER=1)
267 endif()
269 # tbb libs
270 find_package(TBB REQUIRED)
271 if (${TBB_INTERFACE_VERSION} LESS 5005)
272   unset(TBB_FOUND CACHE)
273   unset(TBB_INCLUDE_DIRS CACHE)
274   unset(TBB_LIBRARIES CACHE)
275   message(FATAL_ERROR "TBB is too old, please install at least 3.0(5005), preferably 4.0(6000) or higher")
276 endif()
277 include_directories(${TBB_INCLUDE_DIRS})
278 link_directories(${TBB_LIBRARY_DIRS})
280 # mcrypt libs
281 find_package(Mcrypt REQUIRED)
282 include_directories(${Mcrypt_INCLUDE_DIR})
284 # OpenSSL libs
285 find_package(OpenSSL REQUIRED)
286 include_directories(${OPENSSL_INCLUDE_DIR})
288 # ZLIB
289 find_package(ZLIB REQUIRED)
290 include_directories(${ZLIB_INCLUDE_DIR})
292 find_package(BZip2 REQUIRED)
293 include_directories(${BZIP2_INCLUDE_DIR})
294 add_definitions(${BZIP2_DEFINITIONS})
296 # oniguruma
297 find_package(ONIGURUMA REQUIRED)
298 include_directories(${ONIGURUMA_INCLUDE_DIRS})
300 # LDAP
301 find_package(Ldap REQUIRED)
302 include_directories(${LDAP_INCLUDE_DIR})
304 # libpthreads
305 find_package(PThread REQUIRED)
306 include_directories(${LIBPTHREAD_INCLUDE_DIRS})
308 # Either Readline or Editline (for hphpd)
309 find_package(Readline)
310 find_package(Editline)
311 if (EDITLINE_INCLUDE_DIRS)
312   add_definitions("-DUSE_EDITLINE")
313   include_directories(${EDITLINE_INCLUDE_DIRS})
314 elseif (READLINE_INCLUDE_DIR)
315   include_directories(${READLINE_INCLUDE_DIR})
316 else()
317   message(FATAL_ERROR "Could not find Readline or Editline")
318 endif()
320 find_package(LibDwarf REQUIRED)
321 include_directories(${LIBDWARF_INCLUDE_DIRS})
322 if (LIBDWARF_CONST_NAME)
323   add_definitions("-DLIBDWARF_CONST_NAME")
324 endif()
325 if (LIBDWARF_USE_INIT_C)
326   add_definitions("-DLIBDWARF_USE_INIT_C")
327 endif()
329 find_package(LibElf REQUIRED)
330 include_directories(${LIBELF_INCLUDE_DIRS})
331 if (ELF_GETSHDRSTRNDX)
332   add_definitions("-DHAVE_ELF_GETSHDRSTRNDX")
333 endif()
335 find_package(Libpam)
336 if (PAM_INCLUDE_PATH)
337   include_directories(${PAM_INCLUDE_PATH})
338 endif()
340 # LLVM. Disabled in OSS for now: t5056266
341 # find_package(LLVM)
342 # if (LIBLLVM_INCLUDE_DIR)
343 #   include_directories(LIBLLVM_INCLUDE_DIR)
344 #   add_definitions("-DUSE_LLVM")
345 # endif()
347 FIND_LIBRARY(CRYPT_LIB NAMES xcrypt crypt crypto)
348 if (LINUX OR FREEBSD)
349   FIND_LIBRARY (RT_LIB rt)
350 endif()
352 if (LINUX)
353   FIND_LIBRARY (CAP_LIB cap)
355   if (NOT CAP_LIB)
356     message(FATAL_ERROR "You need to install libcap")
357   endif()
358 endif()
360 if (LINUX OR APPLE)
361   FIND_LIBRARY (DL_LIB dl)
362   FIND_LIBRARY (RESOLV_LIB resolv)
363 endif()
365 FIND_LIBRARY (BFD_LIB libbfd.a)
366 FIND_LIBRARY (LIBIBERTY_LIB iberty)
368 if (NOT BFD_LIB)
369   message(FATAL_ERROR "You need to install binutils")
370 endif()
372 if (NOT LIBIBERTY_LIB)
373   message(FATAL_ERROR "You need to install libiberty (usually bundled with binutils)")
374 endif()
376 if (FREEBSD)
377   FIND_LIBRARY (EXECINFO_LIB execinfo)
378   if (NOT EXECINFO_LIB)
379     message(FATAL_ERROR "You need to install libexecinfo")
380   endif()
381 endif()
383 if (APPLE)
384   find_library(LIBINTL_LIBRARIES NAMES intl libintl)
385   if (LIBINTL_INCLUDE_DIR)
386     include_directories(${LIBINTL_INCLUDE_DIR})
387   endif()
388   find_library(KERBEROS_LIB NAMES gssapi_krb5)
389 endif()
391 #find_package(BISON REQUIRED)
392 #find_package(FLEX REQUIRED)
394 #if (${FLEX_VERSION} VERSION_LESS 2.5.33)
395 #  message(FATAL_ERROR "Flex is too old, found ${FLEX_VERSION} and we need 2.5.33")
396 #endif()
398 include_directories(${HPHP_HOME}/hphp)
400 macro(hphp_link target)
401   if (LIBDL_LIBRARIES)
402     target_link_libraries(${target} ${LIBDL_LIBRARIES})
403   endif ()
405   if (GOOGLE_HEAP_PROFILER_ENABLED OR GOOGLE_CPU_PROFILER_ENABLED)
406     target_link_libraries(${target} ${GOOGLE_PROFILER_LIB})
407   endif()
409   if (JEMALLOC_ENABLED)
410     target_link_libraries(${target} ${JEMALLOC_LIB})
411   endif()
413   if (GOOGLE_HEAP_PROFILER_ENABLED)
414     target_link_libraries(${target} ${GOOGLE_TCMALLOC_FULL_LIB})
415   elseif (GOOGLE_TCMALLOC_ENABLED)
416     target_link_libraries(${target} ${GOOGLE_TCMALLOC_MIN_LIB})
417   endif()
419   target_link_libraries(${target} ${Boost_LIBRARIES})
420   target_link_libraries(${target} ${MYSQL_CLIENT_LIBS})
421   target_link_libraries(${target} ${PCRE_LIBRARY})
422   target_link_libraries(${target} ${ICU_DATA_LIBRARIES} ${ICU_I18N_LIBRARIES} ${ICU_LIBRARIES})
423   target_link_libraries(${target} ${LIBEVENT_LIB})
424   target_link_libraries(${target} ${CURL_LIBRARIES})
425   target_link_libraries(${target} ${LIBGLOG_LIBRARY})
426   if (LIBJSONC_LIBRARY)
427     target_link_libraries(${target} ${LIBJSONC_LIBRARY})
428   endif()
430   if (LibXed_LIBRARY)
431     target_link_libraries(${target} ${LibXed_LIBRARY})
432   endif()
434   if (LIBINOTIFY_LIBRARY)
435     target_link_libraries(${target} ${LIBINOTIFY_LIBRARY})
436   endif()
438   if (LIBICONV_LIBRARY)
439     target_link_libraries(${target} ${LIBICONV_LIBRARY})
440   endif()
442   if (LINUX)
443     target_link_libraries(${target} ${CAP_LIB})
444   endif()
446   if (LINUX OR APPLE)
447     target_link_libraries(${target} ${RESOLV_LIB})
448     target_link_libraries(${target} ${DL_LIB})
449   endif()
451   if (FREEBSD)
452     target_link_libraries(${target} ${EXECINFO_LIB})
453   endif()
455   if (APPLE)
456     target_link_libraries(${target} ${LIBINTL_LIBRARIES})
457     target_link_libraries(${target} ${KERBEROS_LIB})
458   endif()
460   target_link_libraries(${target} ${BFD_LIB})
461   target_link_libraries(${target} ${LIBIBERTY_LIB})
463   if (${LIBPTHREAD_LIBRARIES})
464     target_link_libraries(${target} ${LIBPTHREAD_LIBRARIES})
465   endif()
467   target_link_libraries(${target} ${TBB_LIBRARIES})
468   target_link_libraries(${target} ${OPENSSL_LIBRARIES})
469   target_link_libraries(${target} ${ZLIB_LIBRARIES})
470   target_link_libraries(${target} ${BZIP2_LIBRARIES})
472   target_link_libraries(${target} ${LIBXML2_LIBRARIES})
473   target_link_libraries(${target} ${LIBXSLT_LIBRARIES})
474   target_link_libraries(${target} ${LIBXSLT_EXSLT_LIBRARIES})
475   target_link_libraries(${target} ${EXPAT_LIBRARY})
476   target_link_libraries(${target} ${ONIGURUMA_LIBRARIES})
477   target_link_libraries(${target} ${Mcrypt_LIB})
479   if (LIBUODBC_LIBRARIES)
480     target_link_libraries(${target} ${LIBUODBC_LIBRARIES})
481   endif()
483   target_link_libraries(${target} ${LDAP_LIBRARIES})
484   target_link_libraries(${target} ${LBER_LIBRARIES})
486   target_link_libraries(${target} ${LIBMEMCACHED_LIBRARIES})
488   target_link_libraries(${target} ${CRYPT_LIB})
490   if (LINUX OR FREEBSD)
491     target_link_libraries(${target} ${RT_LIB})
492   endif()
494   if (LIBSQLITE3_FOUND AND LIBSQLITE3_LIBRARY)
495     target_link_libraries(${target} ${LIBSQLITE3_LIBRARY})
496   else()
497     target_link_libraries(${target} sqlite3)
498   endif()
500   if (DOUBLE_CONVERSION_LIBRARY)
501     target_link_libraries(${target} ${DOUBLE_CONVERSION_LIBRARY})
502   else()
503     target_link_libraries(${target} double-conversion)
504   endif()
506   if (LZ4_LIBRARY)
507     target_link_libraries(${target} ${LZ4_LIBRARY})
508   else()
509     target_link_libraries(${target} lz4)
510   endif()
512   if (LIBZIP_LIBRARY)
513     target_link_libraries(${target} ${LIBZIP_LIBRARY})
514   else()
515     target_link_libraries(${target} zip_static)
516   endif()
518   if (PCRE_LIBRARY)
519     target_link_libraries(${target} ${PCRE_LIBRARY})
520   else()
521     target_link_libraries(${target} pcre)
522   endif()
524   target_link_libraries(${target} fastlz)
525   target_link_libraries(${target} timelib)
526   target_link_libraries(${target} folly)
528   target_link_libraries(${target} afdt)
529   target_link_libraries(${target} mbfl)
531   if (EDITLINE_LIBRARIES)
532     target_link_libraries(${target} ${EDITLINE_LIBRARIES})
533   elseif (READLINE_LIBRARY)
534     target_link_libraries(${target} ${READLINE_LIBRARY})
535   endif()
537   if (PAM_LIBRARY)
538     target_link_libraries(${target} ${PAM_LIBRARY})
539   endif()
541   target_link_libraries(${target} ${LIBDWARF_LIBRARIES})
542   target_link_libraries(${target} ${LIBELF_LIBRARIES})
544   if (LIBLLVM_LIBRARY)
545     target_link_libraries(${target} ${LIBLLVM_LIBRARY})
546   endif()
548   if (LINUX)
549     target_link_libraries(${target} -Wl,--wrap=pthread_create -Wl,--wrap=pthread_exit -Wl,--wrap=pthread_join)
550   endif()
551 endmacro()