2 # +----------------------------------------------------------------------+
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")
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")
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")
40 FIND_PATH(FEATURES_HEADER features.h)
42 add_definitions("-DHAVE_FEATURES_H=1")
46 find_package(Glog REQUIRED)
47 include_directories(${LIBGLOG_INCLUDE_DIR})
50 find_package(Libinotify)
51 if (LIBINOTIFY_INCLUDE_DIR)
52 include_directories(${LIBINOTIFY_INCLUDE_DIR})
56 find_package(Libiconv REQUIRED)
57 include_directories(${LIBICONV_INCLUDE_DIR})
59 message(STATUS "Using const for input to iconv() call")
60 add_definitions("-DICONV_CONST=const")
64 find_package(MySQL REQUIRED)
65 include_directories(${MYSQL_INCLUDE_DIR})
66 link_directories(${MYSQL_LIB_DIR})
68 if (MYSQL_UNIX_SOCK_ADDR)
69 add_definitions(-DPHP_MYSQL_UNIX_SOCK_ADDR="${MYSQL_UNIX_SOCK_ADDR}")
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")
80 include_directories(${LIBMEMCACHED_INCLUDE_DIR})
83 find_package(PCRE REQUIRED)
84 include_directories(${PCRE_INCLUDE_DIRS})
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")
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")
106 if (LibXed_INCLUDE_DIR AND LibXed_LIBRARY)
107 include_directories(${LibXed_INCLUDE_DIR})
108 add_definitions("-DHAVE_LIBXED")
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")
121 if (HAVE_CURL_MULTI_WAIT)
122 add_definitions("-DHAVE_CURL_MULTI_WAIT")
124 set(CMAKE_REQUIRED_LIBRARIES)
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})
139 find_package(ICU REQUIRED)
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")
147 include_directories(${ICU_INCLUDE_DIRS})
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)
159 message(STATUS "Can't find Google profiler")
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)
170 message(STATUS "Can't find full tcmalloc - heap profiling is disabled")
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>
186 #if !defined(JEMALLOC_VERSION_MAJOR) || (JEMALLOC_VERSION_MAJOR < 3)
187 # error \"jemalloc version >= 3.0.0 required\"
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)
197 message(STATUS "Found jemalloc, but it was too old")
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)
208 message(STATUS "Can't find minimal tcmalloc")
212 if (JEMALLOC_ENABLED)
213 add_definitions(-DUSE_JEMALLOC=1)
215 add_definitions(-DNO_JEMALLOC=1)
217 if (GOOGLE_TCMALLOC_ENABLED)
218 add_definitions(-DGOOGLE_TCMALLOC=1)
220 add_definitions(-DNO_TCMALLOC=1)
222 if (GOOGLE_HEAP_PROFILER_ENABLED)
223 add_definitions(-DGOOGLE_HEAP_PROFILER=1)
225 if (GOOGLE_CPU_PROFILER_ENABLED)
226 add_definitions(-DGOOGLE_CPU_PROFILER=1)
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")
237 include_directories(${TBB_INCLUDE_DIRS})
238 link_directories(${TBB_LIBRARY_DIRS})
241 find_package(Mcrypt REQUIRED)
242 include_directories(${Mcrypt_INCLUDE_DIR})
245 find_package(OpenSSL REQUIRED)
246 include_directories(${OPENSSL_INCLUDE_DIR})
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})
257 find_package(ONIGURUMA REQUIRED)
258 include_directories(${ONIGURUMA_INCLUDE_DIRS})
261 find_package(Ldap REQUIRED)
262 include_directories(${LDAP_INCLUDE_DIR})
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 (READLINE_INCLUDE_DIR)
272 include_directories(${READLINE_INCLUDE_DIR})
273 elseif (EDITLINE_INCLUDE_DIRS)
274 add_definitions("-DUSE_EDITLINE")
275 include_directories(${EDITLINE_INCLUDE_DIRS})
277 message(FATAL_ERROR "Could not find Readline or Editline")
280 find_package(CClient REQUIRED)
281 include_directories(${CCLIENT_INCLUDE_PATH})
283 find_package(LibDwarf REQUIRED)
284 include_directories(${LIBDWARF_INCLUDE_DIRS})
285 if (LIBDWARF_HAVE_ENCODE_LEB128)
286 add_definitions("-DHAVE_LIBDWARF_20130729")
289 find_package(LibElf REQUIRED)
290 include_directories(${LIBELF_INCLUDE_DIRS})
291 if (ELF_GETSHDRSTRNDX)
292 add_definitions("-DHAVE_ELF_GETSHDRSTRNDX")
295 CONTAINS_STRING("${CCLIENT_INCLUDE_PATH}/utf8.h" U8T_DECOMPOSE RECENT_CCLIENT)
296 if (NOT RECENT_CCLIENT)
297 unset(RECENT_CCLIENT CACHE)
298 message(FATAL_ERROR "Your version of c-client is too old, you need 2007")
302 if (EXISTS "${CCLIENT_INCLUDE_PATH}/linkage.c")
303 CONTAINS_STRING("${CCLIENT_INCLUDE_PATH}/linkage.c" auth_gss CCLIENT_HAS_GSS)
304 elseif (EXISTS "${CCLIENT_INCLUDE_PATH}/linkage.h")
305 CONTAINS_STRING("${CCLIENT_INCLUDE_PATH}/linkage.h" auth_gss CCLIENT_HAS_GSS)
309 if (PAM_INCLUDE_PATH)
310 include_directories(${PAM_INCLUDE_PATH})
313 if (NOT CCLIENT_HAS_GSS)
314 add_definitions(-DSKIP_IMAP_GSS=1)
317 if (EXISTS "${CCLIENT_INCLUDE_PATH}/linkage.c")
318 CONTAINS_STRING("${CCLIENT_INCLUDE_PATH}/linkage.c" ssl_onceonlyinit CCLIENT_HAS_SSL)
319 elseif (EXISTS "${CCLIENT_INCLUDE_PATH}/linkage.h")
320 CONTAINS_STRING("${CCLIENT_INCLUDE_PATH}/linkage.h" ssl_onceonlyinit CCLIENT_HAS_SSL)
323 if (NOT CCLIENT_HAS_SSL)
324 add_definitions(-DSKIP_IMAP_SSL=1)
327 FIND_LIBRARY(CRYPT_LIB NAMES xcrypt crypt crypto)
328 if (LINUX OR FREEBSD)
329 FIND_LIBRARY (RT_LIB rt)
333 FIND_LIBRARY (CAP_LIB cap)
336 message(FATAL_ERROR "You need to install libcap")
341 FIND_LIBRARY (DL_LIB dl)
342 FIND_LIBRARY (RESOLV_LIB resolv)
345 FIND_LIBRARY (BFD_LIB bfd)
346 FIND_LIBRARY (LIBIBERTY_LIB iberty)
349 message(FATAL_ERROR "You need to install binutils")
352 if (NOT LIBIBERTY_LIB)
353 message(FATAL_ERROR "You need to install libiberty (usually bundled with binutils)")
357 FIND_LIBRARY (EXECINFO_LIB execinfo)
358 if (NOT EXECINFO_LIB)
359 message(FATAL_ERROR "You need to install libexecinfo")
364 find_library(LIBINTL_LIBRARIES NAMES intl libintl)
365 if (LIBINTL_INCLUDE_DIR)
366 include_directories(${LIBINTL_INCLUDE_DIR})
368 find_library(KERBEROS_LIB NAMES gssapi_krb5)
371 #find_package(BISON REQUIRED)
372 #find_package(FLEX REQUIRED)
374 #if (${FLEX_VERSION} VERSION_LESS 2.5.33)
375 # message(FATAL_ERROR "Flex is too old, found ${FLEX_VERSION} and we need 2.5.33")
378 include_directories(${HPHP_HOME}/hphp)
380 macro(hphp_link target)
382 target_link_libraries(${target} ${LIBDL_LIBRARIES})
385 if (GOOGLE_HEAP_PROFILER_ENABLED OR GOOGLE_CPU_PROFILER_ENABLED)
386 target_link_libraries(${target} ${GOOGLE_PROFILER_LIB})
389 if (JEMALLOC_ENABLED)
390 target_link_libraries(${target} ${JEMALLOC_LIB})
393 if (GOOGLE_HEAP_PROFILER_ENABLED)
394 target_link_libraries(${target} ${GOOGLE_TCMALLOC_FULL_LIB})
395 elseif (GOOGLE_TCMALLOC_ENABLED)
396 target_link_libraries(${target} ${GOOGLE_TCMALLOC_MIN_LIB})
399 target_link_libraries(${target} ${Boost_LIBRARIES})
400 target_link_libraries(${target} ${MYSQL_CLIENT_LIBS})
401 target_link_libraries(${target} ${PCRE_LIBRARY})
402 target_link_libraries(${target} ${ICU_DATA_LIBRARIES} ${ICU_I18N_LIBRARIES} ${ICU_LIBRARIES})
403 target_link_libraries(${target} ${LIBEVENT_LIB})
404 target_link_libraries(${target} ${CURL_LIBRARIES})
405 target_link_libraries(${target} ${LIBGLOG_LIBRARY})
408 target_link_libraries(${target} ${LibXed_LIBRARY})
411 if (LIBINOTIFY_LIBRARY)
412 target_link_libraries(${target} ${LIBINOTIFY_LIBRARY})
415 if (LIBICONV_LIBRARY)
416 target_link_libraries(${target} ${LIBICONV_LIBRARY})
421 target_link_libraries(${target} ${CAP_LIB})
425 target_link_libraries(${target} ${RESOLV_LIB})
426 target_link_libraries(${target} ${DL_LIB})
430 target_link_libraries(${target} ${EXECINFO_LIB})
434 target_link_libraries(${target} ${LIBINTL_LIBRARIES})
435 target_link_libraries(${target} ${KERBEROS_LIB})
438 target_link_libraries(${target} ${BFD_LIB})
439 target_link_libraries(${target} ${LIBIBERTY_LIB})
440 if (${LIBPTHREAD_LIBRARIES})
441 target_link_libraries(${target} ${LIBPTHREAD_LIBRARIES})
443 target_link_libraries(${target} ${TBB_LIBRARIES})
444 target_link_libraries(${target} ${OPENSSL_LIBRARIES})
445 target_link_libraries(${target} ${ZLIB_LIBRARIES})
446 target_link_libraries(${target} ${BZIP2_LIBRARIES})
448 target_link_libraries(${target} ${LIBXML2_LIBRARIES})
449 target_link_libraries(${target} ${LIBXSLT_LIBRARIES})
450 target_link_libraries(${target} ${LIBXSLT_EXSLT_LIBRARIES})
451 target_link_libraries(${target} ${EXPAT_LIBRARY})
452 target_link_libraries(${target} ${ONIGURUMA_LIBRARIES})
453 target_link_libraries(${target} ${Mcrypt_LIB})
454 if (LIBUODBC_LIBRARIES)
455 target_link_libraries(${target} ${LIBUODBC_LIBRARIES})
457 target_link_libraries(${target} ${LDAP_LIBRARIES})
458 target_link_libraries(${target} ${LBER_LIBRARIES})
460 target_link_libraries(${target} ${LIBMEMCACHED_LIBRARY})
462 target_link_libraries(${target} ${CRYPT_LIB})
463 if (LINUX OR FREEBSD)
464 target_link_libraries(${target} ${RT_LIB})
467 target_link_libraries(${target} timelib)
468 target_link_libraries(${target} sqlite3)
469 target_link_libraries(${target} lz4)
470 target_link_libraries(${target} double-conversion)
471 target_link_libraries(${target} folly)
472 target_link_libraries(${target} zip_static)
474 target_link_libraries(${target} afdt)
475 target_link_libraries(${target} mbfl)
477 if (READLINE_LIBRARY)
478 target_link_libraries(${target} ${READLINE_LIBRARY})
479 elseif (EDITLINE_LIBRARIES)
480 target_link_libraries(${target} ${EDITLINE_LIBRARIES})
483 target_link_libraries(${target} ${CCLIENT_LIBRARY})
486 target_link_libraries(${target} ${PAM_LIBRARY})
489 target_link_libraries(${target} ${LIBDWARF_LIBRARIES})
490 target_link_libraries(${target} ${LIBELF_LIBRARIES})