Fix hhir guard relaxation for specialized types
[hiphop-php.git] / CMake / HPHPFindLibs.cmake
blobf13dda5d9bb05abbc70991e926ece0c0328331b2
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})
82 # pcre checks
83 find_package(PCRE REQUIRED)
84 include_directories(${PCRE_INCLUDE_DIRS})
86 # libevent checks
87 find_package(LibEvent REQUIRED)
88 include_directories(${LIBEVENT_INCLUDE_DIR})
90 set(CMAKE_REQUIRED_LIBRARIES "${LIBEVENT_LIB}")
91 CHECK_FUNCTION_EXISTS("evhttp_bind_socket_with_fd" HAVE_CUSTOM_LIBEVENT)
92 if(HAVE_CUSTOM_LIBEVENT)
93         message("Using custom LIBEVENT")
94         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_CUSTOM_LIBEVENT")
95 endif()
96 set(CMAKE_REQUIRED_LIBRARIES)
98 find_package(LibUODBC)
99 if (LIBUODBC_INCLUDE_DIRS)
100   include_directories(${LIBUODBC_INCLUDE_DIRS})
101   add_definitions("-DHAVE_UODBC")
102 endif ()
104 # libXed
105 find_package(LibXed)
106 if (LibXed_INCLUDE_DIR AND LibXed_LIBRARY)
107   include_directories(${LibXed_INCLUDE_DIR})
108   add_definitions("-DHAVE_LIBXED")
109 endif()
111 # CURL checks
112 find_package(CURL REQUIRED)
113 include_directories(${CURL_INCLUDE_DIR})
115 set(CMAKE_REQUIRED_LIBRARIES "${CURL_LIBRARIES}")
116 CHECK_FUNCTION_EXISTS("curl_multi_select" HAVE_CURL_MULTI_SELECT)
117 CHECK_FUNCTION_EXISTS("curl_multi_wait" HAVE_CURL_MULTI_WAIT)
118 if (HAVE_CURL_MULTI_SELECT)
119   add_definitions("-DHAVE_CURL_MULTI_SELECT")
120 endif()
121 if (HAVE_CURL_MULTI_WAIT)
122   add_definitions("-DHAVE_CURL_MULTI_WAIT")
123 endif()
124 set(CMAKE_REQUIRED_LIBRARIES)
126 # LibXML2 checks
127 find_package(LibXml2 REQUIRED)
128 include_directories(${LIBXML2_INCLUDE_DIR})
129 add_definitions(${LIBXML2_DEFINITIONS})
131 find_package(LibXslt REQUIRED)
132 include_directories(${LIBXSLT_INCLUDE_DIR})
133 add_definitions(${LIBXSLT_DEFINITIONS})
135 find_package(EXPAT REQUIRED)
136 include_directories(${EXPAT_INCLUDE_DIRS})
138 # ICU
139 find_package(ICU REQUIRED)
140 if (ICU_FOUND)
141   if (ICU_VERSION VERSION_LESS "4.2")
142     unset(ICU_FOUND CACHE)
143     unset(ICU_INCLUDE_DIRS CACHE)
144     unset(ICU_LIBRARIES CACHE)
145     message(FATAL_ERROR "ICU is too old, found ${ICU_VERSION} and we need 4.2")
146   endif ()
147   include_directories(${ICU_INCLUDE_DIRS})
148 endif (ICU_FOUND)
150 # jemalloc/tmalloc and profiler
151 if (USE_GOOGLE_HEAP_PROFILER OR USE_GOOGLE_CPU_PROFILER)
152   FIND_LIBRARY(GOOGLE_PROFILER_LIB profiler)
153   if (GOOGLE_PROFILER_LIB)
154     message(STATUS "Found Google profiler: ${GOOGLE_PROFILER_LIB}")
155     if (USE_GOOGLE_CPU_PROFILER)
156       set(GOOGLE_CPU_PROFILER_ENABLED 1)
157     endif()
158   else()
159     message(STATUS "Can't find Google profiler")
160   endif()
161 endif()
163 if (USE_GOOGLE_HEAP_PROFILER AND GOOGLE_PROFILER_LIB)
164   FIND_LIBRARY(GOOGLE_TCMALLOC_FULL_LIB tcmalloc)
165   if (GOOGLE_TCMALLOC_FULL_LIB)
166     message(STATUS "Found full tcmalloc: ${GOOGLE_TCMALLOC_FULL_LIB}")
167     set(GOOGLE_HEAP_PROFILER_ENABLED 1)
168     set(GOOGLE_TCMALLOC_ENABLED 1)
169   else()
170     message(STATUS "Can't find full tcmalloc - heap profiling is disabled")
171   endif()
172 endif()
174 if (USE_JEMALLOC AND NOT GOOGLE_TCMALLOC_ENABLED)
175   FIND_LIBRARY(JEMALLOC_LIB NAMES jemalloc)
176   FIND_PATH(JEMALLOC_INCLUDE_DIR NAMES jemalloc/jemalloc.h)
178   if (JEMALLOC_INCLUDE_DIR AND JEMALLOC_LIB)
179     include_directories(${JEMALLOC_INCLUDE_DIR})
181     set (CMAKE_REQUIRED_INCLUDES ${JEMALLOC_INCLUDE_DIR})
182     INCLUDE(CheckCXXSourceCompiles)
183     CHECK_CXX_SOURCE_COMPILES("
184 #include <jemalloc/jemalloc.h>
185 int main(void) {
186 #if !defined(JEMALLOC_VERSION_MAJOR) || (JEMALLOC_VERSION_MAJOR < 3)
187 # error \"jemalloc version >= 3.0.0 required\"
188 #endif
189   return 0;
190 }" JEMALLOC_VERSION_3)
191     set (CMAKE_REQUIRED_INCLUDES)
193     if (JEMALLOC_VERSION_3)
194       message(STATUS "Found jemalloc: ${JEMALLOC_LIB}")
195       set(JEMALLOC_ENABLED 1)
196     else()
197       message(STATUS "Found jemalloc, but it was too old")
198     endif()
199   endif()
200 endif()
202 if (USE_TCMALLOC AND NOT JEMALLOC_ENABLED AND NOT GOOGLE_TCMALLOC_ENABLED)
203   FIND_LIBRARY(GOOGLE_TCMALLOC_MIN_LIB tcmalloc_minimal)
204   if (GOOGLE_TCMALLOC_MIN_LIB)
205     message(STATUS "Found minimal tcmalloc: ${GOOGLE_TCMALLOC_MIN_LIB}")
206     set(GOOGLE_TCMALLOC_ENABLED 1)
207   else()
208     message(STATUS "Can't find minimal tcmalloc")
209   endif()
210 endif()
212 if (JEMALLOC_ENABLED)
213   add_definitions(-DUSE_JEMALLOC=1)
214 else()
215   add_definitions(-DNO_JEMALLOC=1)
216 endif()
217 if (GOOGLE_TCMALLOC_ENABLED)
218   add_definitions(-DGOOGLE_TCMALLOC=1)
219 else()
220   add_definitions(-DNO_TCMALLOC=1)
221 endif()
222 if (GOOGLE_HEAP_PROFILER_ENABLED)
223   add_definitions(-DGOOGLE_HEAP_PROFILER=1)
224 endif()
225 if (GOOGLE_CPU_PROFILER_ENABLED)
226   add_definitions(-DGOOGLE_CPU_PROFILER=1)
227 endif()
229 # tbb libs
230 find_package(TBB REQUIRED)
231 if (${TBB_INTERFACE_VERSION} LESS 5005)
232   unset(TBB_FOUND CACHE)
233   unset(TBB_INCLUDE_DIRS CACHE)
234   unset(TBB_LIBRARIES CACHE)
235   message(FATAL_ERROR "TBB is too old, please install at least 3.0(5005), preferably 4.0(6000) or higher")
236 endif()
237 include_directories(${TBB_INCLUDE_DIRS})
238 link_directories(${TBB_LIBRARY_DIRS})
240 # mcrypt libs
241 find_package(Mcrypt REQUIRED)
242 include_directories(${Mcrypt_INCLUDE_DIR})
244 # OpenSSL libs
245 find_package(OpenSSL REQUIRED)
246 include_directories(${OPENSSL_INCLUDE_DIR})
248 # ZLIB
249 find_package(ZLIB REQUIRED)
250 include_directories(${ZLIB_INCLUDE_DIR})
252 find_package(BZip2 REQUIRED)
253 include_directories(${BZIP2_INCLUDE_DIR})
254 add_definitions(${BZIP2_DEFINITIONS})
256 # oniguruma
257 find_package(ONIGURUMA REQUIRED)
258 include_directories(${ONIGURUMA_INCLUDE_DIRS})
260 # LDAP
261 find_package(Ldap REQUIRED)
262 include_directories(${LDAP_INCLUDE_DIR})
264 # libpthreads
265 find_package(PThread REQUIRED)
266 include_directories(${LIBPTHREAD_INCLUDE_DIRS})
268 # Either Readline or Editline (for hphpd)
269 find_package(Readline)
270 find_package(Editline)
271 if (EDITLINE_INCLUDE_DIRS)
272   add_definitions("-DUSE_EDITLINE")
273   include_directories(${EDITLINE_INCLUDE_DIRS})
274 elseif (READLINE_INCLUDE_DIR)
275   include_directories(${READLINE_INCLUDE_DIR})
276 else()
277   message(FATAL_ERROR "Could not find Readline or Editline")
278 endif()
280 find_package(LibDwarf REQUIRED)
281 include_directories(${LIBDWARF_INCLUDE_DIRS})
282 if (LIBDWARF_HAVE_ENCODE_LEB128)
283   add_definitions("-DHAVE_LIBDWARF_20130729")
284 endif()
286 find_package(LibElf REQUIRED)
287 include_directories(${LIBELF_INCLUDE_DIRS})
288 if (ELF_GETSHDRSTRNDX)
289   add_definitions("-DHAVE_ELF_GETSHDRSTRNDX")
290 endif()
292 find_package(Libpam)
293 if (PAM_INCLUDE_PATH)
294   include_directories(${PAM_INCLUDE_PATH})
295 endif()
297 FIND_LIBRARY(CRYPT_LIB NAMES xcrypt crypt crypto)
298 if (LINUX OR FREEBSD)
299   FIND_LIBRARY (RT_LIB rt)
300 endif()
302 if (LINUX)
303   FIND_LIBRARY (CAP_LIB cap)
305   if (NOT CAP_LIB)
306     message(FATAL_ERROR "You need to install libcap")
307   endif()
308 endif()
310 if (LINUX OR APPLE)
311   FIND_LIBRARY (DL_LIB dl)
312   FIND_LIBRARY (RESOLV_LIB resolv)
313 endif()
315 FIND_LIBRARY (BFD_LIB bfd)
316 FIND_LIBRARY (LIBIBERTY_LIB iberty)
318 if (NOT BFD_LIB)
319   message(FATAL_ERROR "You need to install binutils")
320 endif()
322 if (NOT LIBIBERTY_LIB)
323   message(FATAL_ERROR "You need to install libiberty (usually bundled with binutils)")
324 endif()
326 if (FREEBSD)
327   FIND_LIBRARY (EXECINFO_LIB execinfo)
328   if (NOT EXECINFO_LIB)
329     message(FATAL_ERROR "You need to install libexecinfo")
330   endif()
331 endif()
333 if (APPLE)
334   find_library(LIBINTL_LIBRARIES NAMES intl libintl)
335   if (LIBINTL_INCLUDE_DIR)
336     include_directories(${LIBINTL_INCLUDE_DIR})
337   endif()
338   find_library(KERBEROS_LIB NAMES gssapi_krb5)
339 endif()
341 #find_package(BISON REQUIRED)
342 #find_package(FLEX REQUIRED)
344 #if (${FLEX_VERSION} VERSION_LESS 2.5.33)
345 #  message(FATAL_ERROR "Flex is too old, found ${FLEX_VERSION} and we need 2.5.33")
346 #endif()
348 include_directories(${HPHP_HOME}/hphp)
350 macro(hphp_link target)
351   if (LIBDL_LIBRARIES)
352     target_link_libraries(${target} ${LIBDL_LIBRARIES})
353   endif ()
355   if (GOOGLE_HEAP_PROFILER_ENABLED OR GOOGLE_CPU_PROFILER_ENABLED)
356     target_link_libraries(${target} ${GOOGLE_PROFILER_LIB})
357   endif()
359   if (JEMALLOC_ENABLED)
360     target_link_libraries(${target} ${JEMALLOC_LIB})
361   endif()
363   if (GOOGLE_HEAP_PROFILER_ENABLED)
364     target_link_libraries(${target} ${GOOGLE_TCMALLOC_FULL_LIB})
365   elseif (GOOGLE_TCMALLOC_ENABLED)
366     target_link_libraries(${target} ${GOOGLE_TCMALLOC_MIN_LIB})
367   endif()
369   target_link_libraries(${target} ${Boost_LIBRARIES})
370   target_link_libraries(${target} ${MYSQL_CLIENT_LIBS})
371   target_link_libraries(${target} ${PCRE_LIBRARY})
372   target_link_libraries(${target} ${ICU_DATA_LIBRARIES} ${ICU_I18N_LIBRARIES} ${ICU_LIBRARIES})
373   target_link_libraries(${target} ${LIBEVENT_LIB})
374   target_link_libraries(${target} ${CURL_LIBRARIES})
375   target_link_libraries(${target} ${LIBGLOG_LIBRARY})
377   if (LibXed_LIBRARY)
378     target_link_libraries(${target} ${LibXed_LIBRARY})
379   endif()
381   if (LIBINOTIFY_LIBRARY)
382     target_link_libraries(${target} ${LIBINOTIFY_LIBRARY})
383   endif()
385   if (LIBICONV_LIBRARY)
386     target_link_libraries(${target} ${LIBICONV_LIBRARY})
387   endif()
390   if (LINUX)
391     target_link_libraries(${target} ${CAP_LIB})
392   endif()
394   if (LINUX OR APPLE)
395     target_link_libraries(${target} ${RESOLV_LIB})
396     target_link_libraries(${target} ${DL_LIB})
397   endif()
399   if (FREEBSD)
400     target_link_libraries(${target} ${EXECINFO_LIB})
401   endif()
403   if (APPLE)
404     target_link_libraries(${target} ${LIBINTL_LIBRARIES})
405     target_link_libraries(${target} ${KERBEROS_LIB})
406   endif()
408   target_link_libraries(${target} ${BFD_LIB})
409   target_link_libraries(${target} ${LIBIBERTY_LIB})
411   if (${LIBPTHREAD_LIBRARIES})
412     target_link_libraries(${target} ${LIBPTHREAD_LIBRARIES})
413   endif()
415   target_link_libraries(${target} ${TBB_LIBRARIES})
416   target_link_libraries(${target} ${OPENSSL_LIBRARIES})
417   target_link_libraries(${target} ${ZLIB_LIBRARIES})
418   target_link_libraries(${target} ${BZIP2_LIBRARIES})
420   target_link_libraries(${target} ${LIBXML2_LIBRARIES})
421   target_link_libraries(${target} ${LIBXSLT_LIBRARIES})
422   target_link_libraries(${target} ${LIBXSLT_EXSLT_LIBRARIES})
423   target_link_libraries(${target} ${EXPAT_LIBRARY})
424   target_link_libraries(${target} ${ONIGURUMA_LIBRARIES})
425   target_link_libraries(${target} ${Mcrypt_LIB})
427   if (LIBUODBC_LIBRARIES)
428     target_link_libraries(${target} ${LIBUODBC_LIBRARIES})
429   endif()
431   target_link_libraries(${target} ${LDAP_LIBRARIES})
432   target_link_libraries(${target} ${LBER_LIBRARIES})
434   target_link_libraries(${target} ${LIBMEMCACHED_LIBRARY})
436   target_link_libraries(${target} ${CRYPT_LIB})
438   if (LINUX OR FREEBSD)
439     target_link_libraries(${target} ${RT_LIB})
440   endif()
442   target_link_libraries(${target} timelib)
443   target_link_libraries(${target} sqlite3)
444   target_link_libraries(${target} lz4)
445   target_link_libraries(${target} double-conversion)
446   target_link_libraries(${target} folly)
447   target_link_libraries(${target} zip_static)
449   target_link_libraries(${target} afdt)
450   target_link_libraries(${target} mbfl)
452   if (EDITLINE_LIBRARIES)
453     target_link_libraries(${target} ${EDITLINE_LIBRARIES})
454   elseif (READLINE_LIBRARY)
455     target_link_libraries(${target} ${READLINE_LIBRARY})
456   endif()
458   if (PAM_LIBRARY)
459     target_link_libraries(${target} ${PAM_LIBRARY})
460   endif()
462   target_link_libraries(${target} ${LIBDWARF_LIBRARIES})
463   target_link_libraries(${target} ${LIBELF_LIBRARIES})
464 endmacro()