TestExtOutput -> php
[hiphop-php.git] / CMake / HPHPFindLibs.cmake
blob8b55038678763207e8cc8e1d6541bb42693c0949
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 # boost checks
21 find_package(Boost 1.48.0 COMPONENTS system program_options filesystem regex REQUIRED)
22 include_directories(${Boost_INCLUDE_DIRS})
23 link_directories(${Boost_LIBRARY_DIRS})
25 # features.h
26 FIND_PATH(FEATURES_HEADER features.h)
27 if (FEATURES_HEADER)
28         add_definitions("-DHAVE_FEATURES_H=1")
29 endif()
31 # google-glog
32 find_package(Glog REQUIRED)
33 include_directories(${LIBGLOG_INCLUDE_DIR})
35 # inotify checks
36 find_package(Libinotify)
37 if (LIBINOTIFY_INCLUDE_DIR)
38         include_directories(${LIBINOTIFY_INCLUDE_DIR})
39 endif()
41 # unwind checks
42 find_package(Libunwind REQUIRED)
43 include_directories(${LIBUNWIND_INCLUDE_DIR})
45 # iconv checks
46 find_package(Libiconv REQUIRED)
47 include_directories(${LIBICONV_INCLUDE_DIR})
48 if (LIBICONV_CONST)
49   message(STATUS "Using const for input to iconv() call")
50   add_definitions("-DICONV_CONST=const")
51 endif()
53 # mysql checks
54 find_package(MySQL REQUIRED)
55 include_directories(${MYSQL_INCLUDE_DIR})
56 link_directories(${MYSQL_LIB_DIR})
57 MYSQL_SOCKET_SEARCH()
58 if (MYSQL_UNIX_SOCK_ADDR)
59   add_definitions(-DPHP_MYSQL_UNIX_SOCK_ADDR="${MYSQL_UNIX_SOCK_ADDR}")
60 endif()
62 # libmemcached checks
63 find_package(Libmemcached REQUIRED)
64 if (LIBMEMCACHED_VERSION VERSION_LESS "0.39")
65   unset(LIBMEMCACHED_INCLUDE_DIR CACHE)
66   unset(LIBMEMCACHED_LIBRARY CACHE)
67   unset(LIBMEMCACHED_VERSION CACHE)
68   message(FATAL_ERROR "libmemcache is too old, found ${LIBMEMCACHED_VERSION} and we need 0.39")
69 endif ()
70 include_directories(${LIBMEMCACHED_INCLUDE_DIR})
72 # pcre checks
73 find_package(PCRE REQUIRED)
74 include_directories(${PCRE_INCLUDE_DIRS})
76 # libevent checks
77 find_package(LibEvent REQUIRED)
78 include_directories(${LIBEVENT_INCLUDE_DIR})
80 set(CMAKE_REQUIRED_LIBRARIES "${LIBEVENT_LIB}")
81 CHECK_FUNCTION_EXISTS("evhttp_bind_socket_with_fd" HAVE_CUSTOM_LIBEVENT)
82 if (NOT HAVE_CUSTOM_LIBEVENT)
83         unset(HAVE_CUSTOM_LIBEVENT CACHE)
84         unset(LIBEVENT_INCLUDE_DIR CACHE)
85         unset(LIBEVENT_LIB CACHE)
86         unset(LibEvent_FOUND CACHE)
87         message(FATAL_ERROR "Custom libevent is required with HipHop patches")
88 endif ()
89 set(CMAKE_REQUIRED_LIBRARIES)
91 # GD checks
92 find_package(GD REQUIRED)
94 if (WANT_FB_LIBMCC)
95         add_definitions(-DHPHP_WITH_LIBMCC)
96         message(FATAL_ERROR Need to add libmcc and libch for linking)
97 else ()
98         # nothing for now
99 endif()
101 find_package(LibXed)
102 if (LibXed_INCLUDE_DIR AND LibXed_LIBRARY)
103         include_directories(${LibXed_INCLUDE_DIR})
104         add_definitions(-DHAVE_LIBXED)
105 endif()
107 # CURL checks
108 find_package(CURL REQUIRED)
109 include_directories(${CURL_INCLUDE_DIR})
111 set(CMAKE_REQUIRED_LIBRARIES "${CURL_LIBRARIES}")
112 CHECK_FUNCTION_EXISTS("curl_multi_select" HAVE_CURL_MULTI_SELECT)
113 CHECK_FUNCTION_EXISTS("curl_multi_wait" HAVE_CURL_MULTI_WAIT)
114 if (HAVE_CURL_MULTI_SELECT)
115         add_definitions("-DHAVE_CURL_MULTI_SELECT")
116 endif()
117 if (HAVE_CURL_MULTI_WAIT)
118         add_definitions("-DHAVE_CURL_MULTI_WAIT")
119 endif()
120 set(CMAKE_REQUIRED_LIBRARIES)
122 # LibXML2 checks
123 find_package(LibXml2 REQUIRED)
124 include_directories(${LIBXML2_INCLUDE_DIR})
125 add_definitions(${LIBXML2_DEFINITIONS})
127 find_package(EXPAT REQUIRED)
128 include_directories(${EXPAT_INCLUDE_DIRS})
130 # SQLite3 + timelib are bundled in HPHP sources
131 include_directories("${HPHP_HOME}/hphp/third_party/libsqlite3")
132 include_directories("${HPHP_HOME}/hphp/third_party/timelib")
133 include_directories("${HPHP_HOME}/hphp/third_party/libafdt/src")
134 include_directories("${HPHP_HOME}/hphp/third_party/libmbfl")
135 include_directories("${HPHP_HOME}/hphp/third_party/libmbfl/mbfl")
136 include_directories("${HPHP_HOME}/hphp/third_party/libmbfl/filter")
137 include_directories("${HPHP_HOME}/hphp/third_party/lz4")
138 include_directories("${HPHP_HOME}/hphp/third_party/double-conversion/src")
139 include_directories("${HPHP_HOME}/hphp/third_party/folly")
141 # ICU
142 find_package(ICU REQUIRED)
143 if (ICU_FOUND)
144         if (ICU_VERSION VERSION_LESS "4.2")
145                 unset(ICU_FOUND CACHE)
146                 unset(ICU_INCLUDE_DIRS CACHE)
147                 unset(ICU_LIBRARIES CACHE)
148                 message(FATAL_ERROR "ICU is too old, found ${ICU_VERSION} and we need 4.2")
149         endif ()
150         include_directories(${ICU_INCLUDE_DIRS})
151 endif (ICU_FOUND)
153 # (google heap OR cpu profiler) AND libunwind 
154 FIND_LIBRARY(UNWIND_LIB unwind)
156 # jemalloc/tmalloc and profiler
157 if (USE_GOOGLE_HEAP_PROFILER OR USE_GOOGLE_CPU_PROFILER)
158         FIND_LIBRARY(GOOGLE_PROFILER_LIB profiler)
159         if (GOOGLE_PROFILER_LIB)
160                 message(STATUS "Found Google profiler: ${GOOGLE_PROFILER_LIB}")
161                 if (USE_GOOGLE_CPU_PROFILER)
162                         set(GOOGLE_CPU_PROFILER_ENABLED 1)
163                 endif()
164         else()
165                 message(STATUS "Can't find Google profiler")
166         endif()
167 endif()
169 if (USE_GOOGLE_HEAP_PROFILER AND GOOGLE_PROFILER_LIB)
170         FIND_LIBRARY(GOOGLE_TCMALLOC_FULL_LIB tcmalloc)
171         if (GOOGLE_TCMALLOC_FULL_LIB)
172                 message(STATUS "Found full tcmalloc: ${GOOGLE_TCMALLOC_FULL_LIB}")
173                 set(GOOGLE_HEAP_PROFILER_ENABLED 1)
174                 set(GOOGLE_TCMALLOC_ENABLED 1)
175         else()
176                 message(STATUS "Can't find full tcmalloc - heap profiling is disabled")
177         endif()
178 endif()
180 if (USE_JEMALLOC AND NOT GOOGLE_TCMALLOC_ENABLED
181                 AND NOT CMAKE_BUILD_TYPE STREQUAL Debug)
182         FIND_LIBRARY(JEMALLOC_LIB jemalloc)
183         if (JEMALLOC_LIB)
184                 message(STATUS "Found jemalloc: ${JEMALLOC_LIB}")
185                 set(JEMALLOC_ENABLED 1)
186         endif()
187 endif()
189 if (USE_TCMALLOC AND NOT JEMALLOC_ENABLED AND NOT GOOGLE_TCMALLOC_ENABLED
190                 AND NOT CMAKE_BUILD_TYPE STREQUAL Debug)
191         FIND_LIBRARY(GOOGLE_TCMALLOC_MIN_LIB tcmalloc_minimal)
192         if (GOOGLE_TCMALLOC_MIN_LIB)
193                 message(STATUS "Found minimal tcmalloc: ${GOOGLE_TCMALLOC_MIN_LIB}")
194                 set(GOOGLE_TCMALLOC_ENABLED 1)
195         else()
196                 message(STATUS "Can't find minimal tcmalloc")
197         endif()
198 endif()
200 if (JEMALLOC_ENABLED)
201         add_definitions(-DUSE_JEMALLOC=1)
202 else()
203         add_definitions(-DNO_JEMALLOC=1)
204 endif()
205 if (GOOGLE_TCMALLOC_ENABLED)
206         add_definitions(-DGOOGLE_TCMALLOC=1)
207 else()
208         add_definitions(-DNO_TCMALLOC=1)
209 endif()
210 if (GOOGLE_HEAP_PROFILER_ENABLED)
211         add_definitions(-DGOOGLE_HEAP_PROFILER=1)
212 endif()
213 if (GOOGLE_CPU_PROFILER_ENABLED)
214         add_definitions(-DGOOGLE_CPU_PROFILER=1)
215 endif()
217 # tbb libs
218 find_package(TBB REQUIRED)
219 if (${TBB_INTERFACE_VERSION} LESS 5005)
220         unset(TBB_FOUND CACHE)
221         unset(TBB_INCLUDE_DIRS CACHE)
222         unset(TBB_LIBRARIES CACHE)
223         message(FATAL_ERROR "TBB is too old, please install at least 3.0(5005), preferably 4.0(6000) or higher")
224 endif()
225 include_directories(${TBB_INCLUDE_DIRS})
226 link_directories(${TBB_LIBRARY_DIRS})
228 # mcrypt libs
229 find_package(Mcrypt REQUIRED)
230 include_directories(${Mcrypt_INCLUDE_DIR})
232 # OpenSSL libs
233 find_package(OpenSSL REQUIRED)
234 include_directories(${OPENSSL_INCLUDE_DIR})
236 # ZLIB
237 find_package(ZLIB REQUIRED)
238 include_directories(${ZLIB_INCLUDE_DIR})
240 find_package(BZip2 REQUIRED)
241 include_directories(${BZIP2_INCLUDE_DIR})
242 add_definitions(${BZIP2_DEFINITIONS})
244 # oniguruma
245 find_package(ONIGURUMA REQUIRED)
246 include_directories(${ONIGURUMA_INCLUDE_DIRS})
248 # LDAP
249 find_package(Ldap REQUIRED)
250 include_directories(${LDAP_INCLUDE_DIR})
252 # ncurses, readline and history
253 #set(CURSES_NEED_NCURSES true)
254 find_package(Ncurses REQUIRED)
255 include_directories(${NCURSES_INCLUDE_PATH})
257 # libpthreads
258 find_package(PThread REQUIRED)
259 include_directories(${LIBPTHREAD_INCLUDE_DIRS})
261 find_package(Readline REQUIRED)
262 include_directories(${READLINE_INCLUDE_DIR})
264 find_package(CClient REQUIRED)
265 include_directories(${CCLIENT_INCLUDE_PATH})
267 find_package(LibDwarf REQUIRED)
268 include_directories(${LIBDWARF_INCLUDE_DIRS})
270 find_package(LibElf REQUIRED)
271 include_directories(${LIBELF_INCLUDE_DIRS})
272 if (ELF_GETSHDRSTRNDX)
273         add_definitions("-DHAVE_ELF_GETSHDRSTRNDX")
274 endif()
276 CONTAINS_STRING("${CCLIENT_INCLUDE_PATH}/utf8.h" U8T_DECOMPOSE RECENT_CCLIENT)
277 if (NOT RECENT_CCLIENT)
278         unset(RECENT_CCLIENT CACHE)
279         message(FATAL_ERROR "Your version of c-client is too old, you need 2007")
280 endif()
282 CONTAINS_STRING("${CCLIENT_INCLUDE_PATH}/linkage.h" auth_gss CCLIENT_NEEDS_PAM)
284 if (EXISTS "${CCLIENT_INCLUDE_PATH}/linkage.c")
285         CONTAINS_STRING("${CCLIENT_INCLUDE_PATH}/linkage.c" ssl_onceonlyinit CCLIENT_HAS_SSL)
286 endif()
288 if (CCLIENT_NEEDS_PAM)
289         find_package(Libpam REQUIRED)
290         include_directories(${PAM_INCLUDE_PATH})
291 else()
292         add_definitions(-DSKIP_IMAP_GSS=1)
293 endif()
295 if (NOT CCLIENT_HAS_SSL)
296         add_definitions(-DSKIP_IMAP_SSL=1)
297 endif()
299 FIND_LIBRARY(CRYPT_LIB NAMES xcrypt crypt crypto)
300 if (LINUX OR FREEBSD)
301         FIND_LIBRARY (RT_LIB rt)
302 endif()
304 if (LINUX)
305         FIND_LIBRARY (CAP_LIB cap)
307         if (NOT CAP_LIB)
308                 message(FATAL_ERROR "You need to install libcap")
309         endif()
310 endif()
312 if (LINUX OR APPLE)
313         FIND_LIBRARY (DL_LIB dl)
314         FIND_LIBRARY (RESOLV_LIB resolv)
315 endif()
317 FIND_LIBRARY (BFD_LIB bfd)
318 FIND_LIBRARY (BINUTIL_LIB iberty)
320 if (NOT BFD_LIB)
321         message(FATAL_ERROR "You need to install binutils")
322 endif()
324 if (NOT BINUTIL_LIB)
325         message(FATAL_ERROR "You need to install binutils")
326 endif()
328 if (FREEBSD)
329         FIND_LIBRARY (EXECINFO_LIB execinfo)
330         if (NOT EXECINFO_LIB)
331                 message(FATAL_ERROR "You need to install libexecinfo")
332         endif()
333 endif()
335 #find_package(BISON REQUIRED)
336 #find_package(FLEX REQUIRED)
338 #if (${FLEX_VERSION} VERSION_LESS 2.5.33)
339 #       message(FATAL_ERROR "Flex is too old, found ${FLEX_VERSION} and we need 2.5.33")
340 #endif()
342 include_directories(${HPHP_HOME}/hphp)
343 include_directories(${HPHP_HOME}/hphp/system/gen)
345 macro(hphp_link target)
346         if (GOOGLE_HEAP_PROFILER_ENABLED OR GOOGLE_CPU_PROFILER_ENABLED)
347                 target_link_libraries(${target} ${GOOGLE_PROFILER_LIB})
348         endif()
350         if (JEMALLOC_ENABLED)
351                 target_link_libraries(${target} ${JEMALLOC_LIB})
352         endif()
354         if (GOOGLE_HEAP_PROFILER_ENABLED)
355                 target_link_libraries(${target} ${GOOGLE_TCMALLOC_FULL_LIB})
356         elseif (GOOGLE_TCMALLOC_ENABLED)
357                 target_link_libraries(${target} ${GOOGLE_TCMALLOC_MIN_LIB})
358         endif()
360         target_link_libraries(${target} ${Boost_LIBRARIES})
361         target_link_libraries(${target} ${LIBUNWIND_LIBRARY})
362         target_link_libraries(${target} ${MYSQL_CLIENT_LIBS})
363         target_link_libraries(${target} ${PCRE_LIBRARY})
364         target_link_libraries(${target} ${ICU_LIBRARIES} ${ICU_I18N_LIBRARIES})
365         target_link_libraries(${target} ${LIBEVENT_LIB})
366         target_link_libraries(${target} ${CURL_LIBRARIES})
367         target_link_libraries(${target} ${LIBGLOG_LIBRARY})
369 if (LibXed_LIBRARY)
370         target_link_libraries(${target} ${LibXed_LIBRARY})
371 endif()
373 if (LIBINOTIFY_LIBRARY)
374         target_link_libraries(${target} ${LIBINOTIFY_LIBRARY})
375 endif()
377 if (LIBICONV_LIBRARY)
378         target_link_libraries(${target} ${LIBICONV_LIBRARY})
379 endif()
382 if (LINUX)
383         target_link_libraries(${target} ${CAP_LIB})
384 endif()
386 if (LINUX OR APPLE)
387         target_link_libraries(${target} ${RESOLV_LIB})
388         target_link_libraries(${target} ${DL_LIB})
389 endif()
391 if (FREEBSD)
392         target_link_libraries(${target} ${EXECINFO_LIB})
393 endif()
395         target_link_libraries(${target} ${BFD_LIB})
396         target_link_libraries(${target} ${BINUTIL_LIB})
397 if (${LIBPTHREAD_LIBRARIES})
398         target_link_libraries(${target} ${LIBPTHREAD_LIBRARIES})
399 endif()
400         target_link_libraries(${target} ${TBB_LIBRARIES})
401         target_link_libraries(${target} ${OPENSSL_LIBRARIES})
402         target_link_libraries(${target} ${ZLIB_LIBRARIES})
403         target_link_libraries(${target} ${BZIP2_LIBRARIES})
405         target_link_libraries(${target} ${LIBXML2_LIBRARIES})
406         target_link_libraries(${target} ${EXPAT_LIBRARY})
407         target_link_libraries(${target} ${ONIGURUMA_LIBRARIES})
408         target_link_libraries(${target} ${Mcrypt_LIB})
409         target_link_libraries(${target} ${GD_LIBRARY})
411         target_link_libraries(${target} ${LDAP_LIBRARIES})
412         target_link_libraries(${target} ${LBER_LIBRARIES})
414         target_link_libraries(${target} ${LIBMEMCACHED_LIBRARY})
416         target_link_libraries(${target} ${CRYPT_LIB})
417         if (LINUX OR FREEBSD)
418                 target_link_libraries(${target} ${RT_LIB})
419         endif()
421         target_link_libraries(${target} timelib)
422         target_link_libraries(${target} sqlite3)
423         target_link_libraries(${target} lz4)
424         target_link_libraries(${target} double-conversion)
425         target_link_libraries(${target} folly)
427         target_link_libraries(${target} afdt)
428         target_link_libraries(${target} mbfl)
430         target_link_libraries(${target} ${READLINE_LIBRARY})
431         target_link_libraries(${target} ${NCURSES_LIBRARY})
432         target_link_libraries(${target} ${CCLIENT_LIBRARY})
434         if (CCLIENT_NEEDS_PAM)
435                 target_link_libraries(${target} ${PAM_LIBRARY})
436         endif()
438         target_link_libraries(${target} ${LIBDWARF_LIBRARIES})
439         target_link_libraries(${target} ${LIBELF_LIBRARIES})
441 endmacro()