Demallocify md5
[hiphop-php.git] / CMake / HPHPFindLibs.cmake
blob94448266f6aa645810e9f97a69b9796b62091496
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.48.0 COMPONENTS system program_options filesystem regex REQUIRED)
32 include_directories(${Boost_INCLUDE_DIRS})
33 link_directories(${Boost_LIBRARY_DIRS})
35 # features.h
36 FIND_PATH(FEATURES_HEADER features.h)
37 if (FEATURES_HEADER)
38         add_definitions("-DHAVE_FEATURES_H=1")
39 endif()
41 # google-glog
42 find_package(Glog REQUIRED)
43 include_directories(${LIBGLOG_INCLUDE_DIR})
45 # inotify checks
46 find_package(Libinotify)
47 if (LIBINOTIFY_INCLUDE_DIR)
48         include_directories(${LIBINOTIFY_INCLUDE_DIR})
49 endif()
51 # iconv checks
52 find_package(Libiconv REQUIRED)
53 include_directories(${LIBICONV_INCLUDE_DIR})
54 if (LIBICONV_CONST)
55   message(STATUS "Using const for input to iconv() call")
56   add_definitions("-DICONV_CONST=const")
57 endif()
59 # mysql checks
60 find_package(MySQL REQUIRED)
61 include_directories(${MYSQL_INCLUDE_DIR})
62 link_directories(${MYSQL_LIB_DIR})
63 MYSQL_SOCKET_SEARCH()
64 if (MYSQL_UNIX_SOCK_ADDR)
65   add_definitions(-DPHP_MYSQL_UNIX_SOCK_ADDR="${MYSQL_UNIX_SOCK_ADDR}")
66 endif()
68 # libmemcached checks
69 find_package(Libmemcached REQUIRED)
70 if (LIBMEMCACHED_VERSION VERSION_LESS "0.39")
71   unset(LIBMEMCACHED_INCLUDE_DIR CACHE)
72   unset(LIBMEMCACHED_LIBRARY CACHE)
73   unset(LIBMEMCACHED_VERSION CACHE)
74   message(FATAL_ERROR "libmemcache is too old, found ${LIBMEMCACHED_VERSION} and we need 0.39")
75 endif ()
76 include_directories(${LIBMEMCACHED_INCLUDE_DIR})
78 # pcre checks
79 find_package(PCRE REQUIRED)
80 include_directories(${PCRE_INCLUDE_DIRS})
82 # libevent checks
83 find_package(LibEvent REQUIRED)
84 include_directories(${LIBEVENT_INCLUDE_DIR})
86 set(CMAKE_REQUIRED_LIBRARIES "${LIBEVENT_LIB}")
87 CHECK_FUNCTION_EXISTS("evhttp_bind_socket_with_fd" HAVE_CUSTOM_LIBEVENT)
88 if(HAVE_CUSTOM_LIBEVENT)
89         message("Using custom LIBEVENT")
90         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_CUSTOM_LIBEVENT")
91 endif()
92 set(CMAKE_REQUIRED_LIBRARIES)
94 # GD checks
95 find_package(GD REQUIRED)
97 find_package(LibXed)
98 if (LibXed_INCLUDE_DIR AND LibXed_LIBRARY)
99         include_directories(${LibXed_INCLUDE_DIR})
100         add_definitions(-DHAVE_LIBXED)
101 endif()
103 # CURL checks
104 find_package(CURL REQUIRED)
105 include_directories(${CURL_INCLUDE_DIR})
107 set(CMAKE_REQUIRED_LIBRARIES "${CURL_LIBRARIES}")
108 CHECK_FUNCTION_EXISTS("curl_multi_select" HAVE_CURL_MULTI_SELECT)
109 CHECK_FUNCTION_EXISTS("curl_multi_wait" HAVE_CURL_MULTI_WAIT)
110 if (HAVE_CURL_MULTI_SELECT)
111         add_definitions("-DHAVE_CURL_MULTI_SELECT")
112 endif()
113 if (HAVE_CURL_MULTI_WAIT)
114         add_definitions("-DHAVE_CURL_MULTI_WAIT")
115 endif()
116 set(CMAKE_REQUIRED_LIBRARIES)
118 # LibXML2 checks
119 find_package(LibXml2 REQUIRED)
120 include_directories(${LIBXML2_INCLUDE_DIR})
121 add_definitions(${LIBXML2_DEFINITIONS})
123 find_package(EXPAT REQUIRED)
124 include_directories(${EXPAT_INCLUDE_DIRS})
126 # SQLite3 + timelib are bundled in HPHP sources
127 include_directories("${HPHP_HOME}/hphp/third_party/libsqlite3")
128 include_directories("${HPHP_HOME}/hphp/third_party/timelib")
129 include_directories("${HPHP_HOME}/hphp/third_party/libafdt/src")
130 include_directories("${HPHP_HOME}/hphp/third_party/libmbfl")
131 include_directories("${HPHP_HOME}/hphp/third_party/libmbfl/mbfl")
132 include_directories("${HPHP_HOME}/hphp/third_party/libmbfl/filter")
133 include_directories("${HPHP_HOME}/hphp/third_party/lz4")
134 include_directories("${HPHP_HOME}/hphp/third_party/double-conversion/src")
135 include_directories("${HPHP_HOME}/hphp/third_party/folly")
137 # ICU
138 find_package(ICU REQUIRED)
139 if (ICU_FOUND)
140         if (ICU_VERSION VERSION_LESS "4.2")
141                 unset(ICU_FOUND CACHE)
142                 unset(ICU_INCLUDE_DIRS CACHE)
143                 unset(ICU_LIBRARIES CACHE)
144                 message(FATAL_ERROR "ICU is too old, found ${ICU_VERSION} and we need 4.2")
145         endif ()
146         include_directories(${ICU_INCLUDE_DIRS})
147 endif (ICU_FOUND)
149 # jemalloc/tmalloc and profiler
150 if (USE_GOOGLE_HEAP_PROFILER OR USE_GOOGLE_CPU_PROFILER)
151         FIND_LIBRARY(GOOGLE_PROFILER_LIB profiler)
152         if (GOOGLE_PROFILER_LIB)
153                 message(STATUS "Found Google profiler: ${GOOGLE_PROFILER_LIB}")
154                 if (USE_GOOGLE_CPU_PROFILER)
155                         set(GOOGLE_CPU_PROFILER_ENABLED 1)
156                 endif()
157         else()
158                 message(STATUS "Can't find Google profiler")
159         endif()
160 endif()
162 if (USE_GOOGLE_HEAP_PROFILER AND GOOGLE_PROFILER_LIB)
163         FIND_LIBRARY(GOOGLE_TCMALLOC_FULL_LIB tcmalloc)
164         if (GOOGLE_TCMALLOC_FULL_LIB)
165                 message(STATUS "Found full tcmalloc: ${GOOGLE_TCMALLOC_FULL_LIB}")
166                 set(GOOGLE_HEAP_PROFILER_ENABLED 1)
167                 set(GOOGLE_TCMALLOC_ENABLED 1)
168         else()
169                 message(STATUS "Can't find full tcmalloc - heap profiling is disabled")
170         endif()
171 endif()
173 if (USE_JEMALLOC AND NOT GOOGLE_TCMALLOC_ENABLED)
174         FIND_LIBRARY(JEMALLOC_LIB NAMES jemalloc)
175         FIND_PATH(JEMALLOC_INCLUDE_DIR NAMES jemalloc/jemalloc.h)
177         if (JEMALLOC_INCLUDE_DIR AND JEMALLOC_LIB)
178                 include_directories(${JEMALLOC_INCLUDE_DIR})
180                 set (CMAKE_REQUIRED_INCLUDES ${JEMALLOC_INCLUDE_DIR})
181                 INCLUDE(CheckCXXSourceCompiles)
182                 CHECK_CXX_SOURCE_COMPILES("
183 #include <jemalloc/jemalloc.h>
184 int main(void) {
185 #if !defined(JEMALLOC_VERSION_MAJOR) || (JEMALLOC_VERSION_MAJOR < 3)
186 # error \"jemalloc version >= 3.0.0 required\"
187 #endif
188         return 0;
189 }" JEMALLOC_VERSION_3)
190                 set (CMAKE_REQUIRED_INCLUDES)
192                 if (JEMALLOC_VERSION_3)
193                         message(STATUS "Found jemalloc: ${JEMALLOC_LIB}")
194                         set(JEMALLOC_ENABLED 1)
195                 else()
196                         message(STATUS "Found jemalloc, but it was too old")
197                 endif()
198         endif()
199 endif()
201 if (USE_TCMALLOC AND NOT JEMALLOC_ENABLED AND NOT GOOGLE_TCMALLOC_ENABLED)
202         FIND_LIBRARY(GOOGLE_TCMALLOC_MIN_LIB tcmalloc_minimal)
203         if (GOOGLE_TCMALLOC_MIN_LIB)
204                 message(STATUS "Found minimal tcmalloc: ${GOOGLE_TCMALLOC_MIN_LIB}")
205                 set(GOOGLE_TCMALLOC_ENABLED 1)
206         else()
207                 message(STATUS "Can't find minimal tcmalloc")
208         endif()
209 endif()
211 if (JEMALLOC_ENABLED)
212         add_definitions(-DUSE_JEMALLOC=1)
213 else()
214         add_definitions(-DNO_JEMALLOC=1)
215 endif()
216 if (GOOGLE_TCMALLOC_ENABLED)
217         add_definitions(-DGOOGLE_TCMALLOC=1)
218 else()
219         add_definitions(-DNO_TCMALLOC=1)
220 endif()
221 if (GOOGLE_HEAP_PROFILER_ENABLED)
222         add_definitions(-DGOOGLE_HEAP_PROFILER=1)
223 endif()
224 if (GOOGLE_CPU_PROFILER_ENABLED)
225         add_definitions(-DGOOGLE_CPU_PROFILER=1)
226 endif()
228 # tbb libs
229 find_package(TBB REQUIRED)
230 if (${TBB_INTERFACE_VERSION} LESS 5005)
231         unset(TBB_FOUND CACHE)
232         unset(TBB_INCLUDE_DIRS CACHE)
233         unset(TBB_LIBRARIES CACHE)
234         message(FATAL_ERROR "TBB is too old, please install at least 3.0(5005), preferably 4.0(6000) or higher")
235 endif()
236 include_directories(${TBB_INCLUDE_DIRS})
237 link_directories(${TBB_LIBRARY_DIRS})
239 # mcrypt libs
240 find_package(Mcrypt REQUIRED)
241 include_directories(${Mcrypt_INCLUDE_DIR})
243 # OpenSSL libs
244 find_package(OpenSSL REQUIRED)
245 include_directories(${OPENSSL_INCLUDE_DIR})
247 # ZLIB
248 find_package(ZLIB REQUIRED)
249 include_directories(${ZLIB_INCLUDE_DIR})
251 find_package(BZip2 REQUIRED)
252 include_directories(${BZIP2_INCLUDE_DIR})
253 add_definitions(${BZIP2_DEFINITIONS})
255 # oniguruma
256 find_package(ONIGURUMA REQUIRED)
257 include_directories(${ONIGURUMA_INCLUDE_DIRS})
259 # LDAP
260 find_package(Ldap REQUIRED)
261 include_directories(${LDAP_INCLUDE_DIR})
263 # ncurses, readline and history
264 #set(CURSES_NEED_NCURSES true)
265 find_package(Ncurses REQUIRED)
266 include_directories(${NCURSES_INCLUDE_PATH})
268 # libpthreads
269 find_package(PThread REQUIRED)
270 include_directories(${LIBPTHREAD_INCLUDE_DIRS})
272 # Either Readline or Editline (for hphpd)
273 find_package(Readline)
274 find_package(Editline)
275 if (READLINE_INCLUDE_DIR)
276         include_directories(${READLINE_INCLUDE_DIR})
277 elseif (EDITLINE_INCLUDE_DIRS)
278         add_definitions("-DUSE_EDITLINE")
279         include_directories(${EDITLINE_INCLUDE_DIRS})
280 else()
281         message(FATAL_ERROR "Could not find Readline or Editline")
282 endif()
284 find_package(CClient REQUIRED)
285 include_directories(${CCLIENT_INCLUDE_PATH})
287 find_package(LibDwarf REQUIRED)
288 include_directories(${LIBDWARF_INCLUDE_DIRS})
290 find_package(LibElf REQUIRED)
291 include_directories(${LIBELF_INCLUDE_DIRS})
292 if (ELF_GETSHDRSTRNDX)
293         add_definitions("-DHAVE_ELF_GETSHDRSTRNDX")
294 endif()
296 CONTAINS_STRING("${CCLIENT_INCLUDE_PATH}/utf8.h" U8T_DECOMPOSE RECENT_CCLIENT)
297 if (NOT RECENT_CCLIENT)
298         unset(RECENT_CCLIENT CACHE)
299         message(FATAL_ERROR "Your version of c-client is too old, you need 2007")
300 endif()
302 find_package(Libpam)
303 if (PAM_INCLUDE_PATH)
304         include_directories(${PAM_INCLUDE_PATH})
305 else()
306         add_definitions(-DSKIP_IMAP_GSS=1)
307 endif()
309 if (EXISTS "${CCLIENT_INCLUDE_PATH}/linkage.c")
310         CONTAINS_STRING("${CCLIENT_INCLUDE_PATH}/linkage.c" ssl_onceonlyinit CCLIENT_HAS_SSL)
311 endif()
313 if (NOT CCLIENT_HAS_SSL)
314         add_definitions(-DSKIP_IMAP_SSL=1)
315 endif()
317 FIND_LIBRARY(CRYPT_LIB NAMES xcrypt crypt crypto)
318 if (LINUX OR FREEBSD)
319         FIND_LIBRARY (RT_LIB rt)
320 endif()
322 if (LINUX)
323         FIND_LIBRARY (CAP_LIB cap)
325         if (NOT CAP_LIB)
326                 message(FATAL_ERROR "You need to install libcap")
327         endif()
328 endif()
330 if (LINUX OR APPLE)
331         FIND_LIBRARY (DL_LIB dl)
332         FIND_LIBRARY (RESOLV_LIB resolv)
333 endif()
335 FIND_LIBRARY (BFD_LIB bfd)
336 FIND_LIBRARY (BINUTIL_LIB iberty)
338 if (NOT BFD_LIB)
339         message(FATAL_ERROR "You need to install binutils")
340 endif()
342 if (NOT BINUTIL_LIB)
343         message(FATAL_ERROR "You need to install binutils")
344 endif()
346 if (FREEBSD)
347         FIND_LIBRARY (EXECINFO_LIB execinfo)
348         if (NOT EXECINFO_LIB)
349                 message(FATAL_ERROR "You need to install libexecinfo")
350         endif()
351 endif()
353 if (APPLE)
354         find_library(LIBINTL_LIBRARIES NAMES intl libintl)
355         if (LIBINTL_INCLUDE_DIR)
356                 include_directories(${LIBINTL_INCLUDE_DIR})
357         endif()
358         find_library(KERBEROS_LIB NAMES gssapi_krb5)
359 endif()
361 #find_package(BISON REQUIRED)
362 #find_package(FLEX REQUIRED)
364 #if (${FLEX_VERSION} VERSION_LESS 2.5.33)
365 #       message(FATAL_ERROR "Flex is too old, found ${FLEX_VERSION} and we need 2.5.33")
366 #endif()
368 include_directories(${HPHP_HOME}/hphp)
369 include_directories(${HPHP_HOME}/hphp/system/gen)
371 macro(hphp_link target)
372         if (LIBDL_LIBRARIES)
373                 target_link_libraries(${target} ${LIBDL_LIBRARIES})
374         endif ()
376         if (GOOGLE_HEAP_PROFILER_ENABLED OR GOOGLE_CPU_PROFILER_ENABLED)
377                 target_link_libraries(${target} ${GOOGLE_PROFILER_LIB})
378         endif()
380         if (JEMALLOC_ENABLED)
381                 target_link_libraries(${target} ${JEMALLOC_LIB})
382         endif()
384         if (GOOGLE_HEAP_PROFILER_ENABLED)
385                 target_link_libraries(${target} ${GOOGLE_TCMALLOC_FULL_LIB})
386         elseif (GOOGLE_TCMALLOC_ENABLED)
387                 target_link_libraries(${target} ${GOOGLE_TCMALLOC_MIN_LIB})
388         endif()
390         target_link_libraries(${target} ${Boost_LIBRARIES})
391         target_link_libraries(${target} ${MYSQL_CLIENT_LIBS})
392         target_link_libraries(${target} ${PCRE_LIBRARY})
393         target_link_libraries(${target} ${ICU_DATA_LIBRARIES} ${ICU_I18N_LIBRARIES} ${ICU_LIBRARIES})
394         target_link_libraries(${target} ${LIBEVENT_LIB})
395         target_link_libraries(${target} ${CURL_LIBRARIES})
396         target_link_libraries(${target} ${LIBGLOG_LIBRARY})
398 if (LibXed_LIBRARY)
399         target_link_libraries(${target} ${LibXed_LIBRARY})
400 endif()
402 if (LIBINOTIFY_LIBRARY)
403         target_link_libraries(${target} ${LIBINOTIFY_LIBRARY})
404 endif()
406 if (LIBICONV_LIBRARY)
407         target_link_libraries(${target} ${LIBICONV_LIBRARY})
408 endif()
411 if (LINUX)
412         target_link_libraries(${target} ${CAP_LIB})
413 endif()
415 if (LINUX OR APPLE)
416         target_link_libraries(${target} ${RESOLV_LIB})
417         target_link_libraries(${target} ${DL_LIB})
418 endif()
420 if (FREEBSD)
421         target_link_libraries(${target} ${EXECINFO_LIB})
422 endif()
424 if (APPLE)
425         target_link_libraries(${target} ${LIBINTL_LIBRARIES})
426         target_link_libraries(${target} ${KERBEROS_LIB})
427 endif()
429         target_link_libraries(${target} ${BFD_LIB})
430         target_link_libraries(${target} ${BINUTIL_LIB})
431 if (${LIBPTHREAD_LIBRARIES})
432         target_link_libraries(${target} ${LIBPTHREAD_LIBRARIES})
433 endif()
434         target_link_libraries(${target} ${TBB_LIBRARIES})
435         target_link_libraries(${target} ${OPENSSL_LIBRARIES})
436         target_link_libraries(${target} ${ZLIB_LIBRARIES})
437         target_link_libraries(${target} ${BZIP2_LIBRARIES})
439         target_link_libraries(${target} ${LIBXML2_LIBRARIES})
440         target_link_libraries(${target} ${EXPAT_LIBRARY})
441         target_link_libraries(${target} ${ONIGURUMA_LIBRARIES})
442         target_link_libraries(${target} ${Mcrypt_LIB})
443         target_link_libraries(${target} ${GD_LIBRARY})
445         target_link_libraries(${target} ${LDAP_LIBRARIES})
446         target_link_libraries(${target} ${LBER_LIBRARIES})
448         target_link_libraries(${target} ${LIBMEMCACHED_LIBRARY})
450         target_link_libraries(${target} ${CRYPT_LIB})
451         if (LINUX OR FREEBSD)
452                 target_link_libraries(${target} ${RT_LIB})
453         endif()
455         target_link_libraries(${target} timelib)
456         target_link_libraries(${target} sqlite3)
457         target_link_libraries(${target} lz4)
458         target_link_libraries(${target} double-conversion)
459         target_link_libraries(${target} folly)
461         target_link_libraries(${target} afdt)
462         target_link_libraries(${target} mbfl)
464         if (READLINE_LIBRARY)
465                 target_link_libraries(${target} ${READLINE_LIBRARY})
466         elseif (EDITLINE_LIBRARIES)
467                 target_link_libraries(${target} ${EDITLINE_LIBRARIES})
468         endif()
470         target_link_libraries(${target} ${NCURSES_LIBRARY})
471         target_link_libraries(${target} ${CCLIENT_LIBRARY})
473         if (PAM_LIBRARY)
474                 target_link_libraries(${target} ${PAM_LIBRARY})
475         endif()
477         target_link_libraries(${target} ${LIBDWARF_LIBRARIES})
478         target_link_libraries(${target} ${LIBELF_LIBRARIES})
480 endmacro()