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)
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")
31 find_package(Glog REQUIRED)
33 add_definitions("-DGOOGLE_GLOG_DLL_DECL=")
35 include_directories(${LIBGLOG_INCLUDE_DIR})
38 find_package(Libinotify)
39 if (LIBINOTIFY_INCLUDE_DIR)
40 include_directories(${LIBINOTIFY_INCLUDE_DIR})
43 # mysql checks - if we're using async mysql, we use fbmysqlclient from
44 # third-party/ instead
45 if (ENABLE_ASYNC_MYSQL)
48 ${TP_DIR}/squangle/src/
49 ${TP_DIR}/fb-mysql/src/include/
51 set(MYSQL_CLIENT_LIB_DIR ${TP_DIR}/fb-mysql/src/)
53 ${MYSQL_CLIENT_LIB_DIR}/libmysql/libfbmysqlclient_r.a
56 find_package(MySQL REQUIRED)
57 link_directories(${MYSQL_LIB_DIR})
58 include_directories(${MYSQL_INCLUDE_DIR})
61 if (MYSQL_UNIX_SOCK_ADDR)
62 add_definitions(-DPHP_MYSQL_UNIX_SOCK_ADDR="${MYSQL_UNIX_SOCK_ADDR}")
64 message(FATAL_ERROR "Could not find MySQL socket path - if you install a MySQL server, this should be automatically detected. Alternatively, specify -DMYSQL_UNIX_SOCK_ADDR=/path/to/mysql.socket ; if you don't care about unix socket support for MySQL, specify -DMYSQL_UNIX_SOCK_ADDR=/dev/null")
69 include_directories(${PCRE_INCLUDE_DIR})
72 find_package(LibEvent REQUIRED)
73 include_directories(${LIBEVENT_INCLUDE_DIR})
75 set(CMAKE_REQUIRED_LIBRARIES "${LIBEVENT_LIB}")
76 CHECK_FUNCTION_EXISTS("evhttp_bind_socket_with_fd" HAVE_CUSTOM_LIBEVENT)
77 if(HAVE_CUSTOM_LIBEVENT)
78 message("Using custom LIBEVENT")
79 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_CUSTOM_LIBEVENT")
81 set(CMAKE_REQUIRED_LIBRARIES)
87 include_directories(${LibXed_INCLUDE_DIR})
89 add_definitions("-DHAVE_LIBXED")
91 message(STATUS "XED is disabled")
95 find_package(CURL REQUIRED)
96 include_directories(${CURL_INCLUDE_DIR})
98 add_definitions("-DCURL_STATICLIB")
101 set(CMAKE_REQUIRED_LIBRARIES "${CURL_LIBRARIES}")
102 CHECK_FUNCTION_EXISTS("curl_multi_select" HAVE_CURL_MULTI_SELECT)
103 CHECK_FUNCTION_EXISTS("curl_multi_wait" HAVE_CURL_MULTI_WAIT)
104 if (HAVE_CURL_MULTI_SELECT)
105 add_definitions("-DHAVE_CURL_MULTI_SELECT")
107 if (HAVE_CURL_MULTI_WAIT)
108 add_definitions("-DHAVE_CURL_MULTI_WAIT")
110 set(CMAKE_REQUIRED_LIBRARIES)
113 find_package(LibXml2 REQUIRED)
114 include_directories(${LIBXML2_INCLUDE_DIR})
115 add_definitions(${LIBXML2_DEFINITIONS})
118 find_package(LibSQLite)
119 if (LIBSQLITE3_INCLUDE_DIR)
120 include_directories(${LIBSQLITE3_INCLUDE_DIR})
123 # libdouble-conversion
124 find_package(DoubleConversion)
125 if (DOUBLE_CONVERSION_INCLUDE_DIR)
126 include_directories(${DOUBLE_CONVERSION_INCLUDE_DIR})
132 include_directories(${LZ4_INCLUDE_DIR})
137 if (FASTLZ_INCLUDE_DIR)
138 include_directories(${FASTLZ_INCLUDE_DIR})
142 find_package(ICU REQUIRED)
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")
150 include_directories(${ICU_INCLUDE_DIRS})
152 add_definitions("-DU_EXPORT=")
153 add_definitions("-DU_IMPORT=")
155 # Everything is either in the `icu61` namespace or `icu` namespace, depending
156 # on another definition. There's an implicit `using namespace WHATEVER;` in
157 # ICU4c < 61.1, but now that's opt-in rather than opt-out.
158 add_definitions("-DU_USING_ICU_NAMESPACE=1")
161 # jemalloc/tmalloc and profiler
162 if (USE_GOOGLE_HEAP_PROFILER OR USE_GOOGLE_CPU_PROFILER)
163 FIND_LIBRARY(GOOGLE_PROFILER_LIB profiler)
164 FIND_PATH(GOOGLE_PROFILER_INCLUDE_DIR NAMES google/profiler.h)
165 if (GOOGLE_PROFILER_INCLUDE_DIR)
166 include_directories(${GOOGLE_PROFILER_INCLUDE_DIR})
168 if (GOOGLE_PROFILER_LIB)
169 message(STATUS "Found Google profiler: ${GOOGLE_PROFILER_LIB}")
170 if (USE_GOOGLE_CPU_PROFILER)
171 set(GOOGLE_CPU_PROFILER_ENABLED 1)
174 message(STATUS "Can't find Google profiler")
178 if (USE_GOOGLE_HEAP_PROFILER AND GOOGLE_PROFILER_LIB)
179 FIND_LIBRARY(GOOGLE_TCMALLOC_FULL_LIB tcmalloc)
180 if (GOOGLE_TCMALLOC_FULL_LIB)
181 message(STATUS "Found full tcmalloc: ${GOOGLE_TCMALLOC_FULL_LIB}")
182 set(GOOGLE_HEAP_PROFILER_ENABLED 1)
183 set(GOOGLE_TCMALLOC_ENABLED 1)
185 message(STATUS "Can't find full tcmalloc - heap profiling is disabled")
189 if(USE_JEMALLOC AND NOT GOOGLE_TCMALLOC_ENABLED)
190 add_definitions(-DUSE_JEMALLOC=1)
191 set(JEMALLOC_ENABLED 1)
193 add_definitions(-DNO_JEMALLOC=1)
196 if (USE_TCMALLOC AND NOT JEMALLOC_ENABLED AND NOT GOOGLE_TCMALLOC_ENABLED)
197 FIND_LIBRARY(GOOGLE_TCMALLOC_MIN_LIB tcmalloc_minimal)
198 if (GOOGLE_TCMALLOC_MIN_LIB)
199 message(STATUS "Found minimal tcmalloc: ${GOOGLE_TCMALLOC_MIN_LIB}")
200 set(GOOGLE_TCMALLOC_ENABLED 1)
202 message(STATUS "Can't find minimal tcmalloc")
206 if (GOOGLE_TCMALLOC_ENABLED)
207 add_definitions(-DGOOGLE_TCMALLOC=1)
209 add_definitions(-DNO_TCMALLOC=1)
211 if (GOOGLE_HEAP_PROFILER_ENABLED)
212 add_definitions(-DGOOGLE_HEAP_PROFILER=1)
214 if (GOOGLE_CPU_PROFILER_ENABLED)
215 add_definitions(-DGOOGLE_CPU_PROFILER=1)
219 if (JEMALLOC_ENABLED AND ENABLE_HHPROF)
220 add_definitions(-DENABLE_HHPROF=1)
224 find_package(TBB REQUIRED)
225 if (${TBB_INTERFACE_VERSION} LESS 5005)
226 unset(TBB_FOUND CACHE)
227 unset(TBB_INCLUDE_DIRS CACHE)
228 unset(TBB_LIBRARIES CACHE)
229 message(FATAL_ERROR "TBB is too old, please install at least 3.0(5005), preferably 4.0(6000) or higher")
231 include_directories(${TBB_INCLUDE_DIRS})
232 link_directories(${TBB_LIBRARY_DIRS})
235 find_package(OpenSSL REQUIRED)
236 include_directories(${OPENSSL_INCLUDE_DIR})
238 # LibreSSL explicitly refuses to support RAND_egd()
239 SET(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
240 SET(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_LIBRARIES})
241 INCLUDE(CheckCXXSourceCompiles)
242 CHECK_CXX_SOURCE_COMPILES("#include <openssl/rand.h>
244 return RAND_egd(\"/dev/null\");
245 }" OPENSSL_HAVE_RAND_EGD)
246 if (NOT OPENSSL_HAVE_RAND_EGD)
247 add_definitions("-DOPENSSL_NO_RAND_EGD")
249 CHECK_CXX_SOURCE_COMPILES("#include <openssl/ssl.h>
251 return SSL_set_alpn_protos(nullptr, nullptr, 0);
252 }" OPENSSL_HAVE_ALPN)
253 SET(CMAKE_REQUIRED_INCLUDES)
254 SET(CMAKE_REQUIRED_LIBRARIES)
258 find_package(ZLIB REQUIRED)
259 include_directories(${ZLIB_INCLUDE_DIR})
262 find_package(PThread REQUIRED)
263 include_directories(${LIBPTHREAD_INCLUDE_DIRS})
264 if (LIBPTHREAD_STATIC)
265 add_definitions("-DPTW32_STATIC_LIB")
269 NON_DISTRIBUTABLE_BUILD
270 "Use libraries which may result in a binary that can not be legally distributed"
274 # Either Readline or Editline (for hphpd)
275 if(NON_DISTRIBUTABLE_BUILD)
276 find_package(Readline)
278 if (NOT READLINE_INCLUDE_DIR)
279 find_package(Editline)
282 if (NON_DISTRIBUTABLE_BUILD AND READLINE_INCLUDE_DIR)
284 add_definitions("-DREADLINE_STATIC")
286 include_directories(${READLINE_INCLUDE_DIR})
287 elseif (EDITLINE_INCLUDE_DIRS)
288 add_definitions("-DUSE_EDITLINE")
289 include_directories(${EDITLINE_INCLUDE_DIRS})
291 message(FATAL_ERROR "Could not find Readline or Editline")
295 find_package(LibDwarf REQUIRED)
296 include_directories(${LIBDWARF_INCLUDE_DIRS})
297 if (LIBDWARF_CONST_NAME)
298 add_definitions("-DLIBDWARF_CONST_NAME")
300 if (LIBDWARF_USE_INIT_C)
301 add_definitions("-DLIBDWARF_USE_INIT_C")
304 find_package(LibElf REQUIRED)
305 include_directories(${LIBELF_INCLUDE_DIRS})
306 if (ELF_GETSHDRSTRNDX)
307 add_definitions("-DHAVE_ELF_GETSHDRSTRNDX")
311 FIND_LIBRARY(CRYPT_LIB NAMES xcrypt crypt crypto)
312 if (LINUX OR FREEBSD)
313 FIND_LIBRARY (RT_LIB rt)
317 FIND_LIBRARY (CAP_LIB cap)
320 message(FATAL_ERROR "You need to install libcap")
325 FIND_LIBRARY (DL_LIB dl)
326 FIND_LIBRARY (RESOLV_LIB resolv)
330 FIND_LIBRARY (EXECINFO_LIB execinfo)
331 if (NOT EXECINFO_LIB)
332 message(FATAL_ERROR "You need to install libexecinfo")
337 find_library(KERBEROS_LIB NAMES gssapi_krb5)
339 # This is required by Homebrew's libc. See
340 # https://github.com/facebook/hhvm/pull/5728#issuecomment-124290712
343 if (PAM_INCLUDE_PATH)
344 include_directories(${PAM_INCLUDE_PATH})
348 #find_package(BISON REQUIRED)
349 #find_package(FLEX REQUIRED)
351 #if (${FLEX_VERSION} VERSION_LESS 2.5.33)
352 # message(FATAL_ERROR "Flex is too old, found ${FLEX_VERSION} and we need 2.5.33")
355 include_directories(${HPHP_HOME}/hphp)
357 macro(hphp_link target)
358 # oniguruma must be linked first for MacOS's linker to do the right thing -
359 # that's handled in HPHPSetup.cmake
361 # That only handles linking - we still need to make sure that:
362 # - oniguruma is built first, if needed (so we have the header files)
363 # - we build with the header files in the include path
365 add_dependencies(${target} onig)
366 target_include_directories(${target} PRIVATE $<TARGET_PROPERTY:onig,INTERFACE_INCLUDE_DIRECTORIES>)
368 # Otherwise, the linker does the right thing, which sometimes means putting it after things that use it
369 target_link_libraries(${target} onig)
373 target_link_libraries(${target} ${LIBDL_LIBRARIES})
376 if (JEMALLOC_ENABLED)
377 target_link_libraries(${target} jemalloc)
378 add_dependencies(${target} jemalloc)
381 if (GOOGLE_HEAP_PROFILER_ENABLED OR GOOGLE_CPU_PROFILER_ENABLED)
382 target_link_libraries(${target} ${GOOGLE_PROFILER_LIB})
385 if (GOOGLE_HEAP_PROFILER_ENABLED)
386 target_link_libraries(${target} ${GOOGLE_TCMALLOC_FULL_LIB})
387 elseif (GOOGLE_TCMALLOC_ENABLED)
388 target_link_libraries(${target} ${GOOGLE_TCMALLOC_MIN_LIB})
391 add_dependencies(${target} boostMaybeBuild)
392 target_link_libraries(${target} boost)
393 add_dependencies(${target} libsodiumMaybeBuild)
394 target_link_libraries(${target} libsodium)
396 target_link_libraries(${target} ${MYSQL_CLIENT_LIBS})
397 if (ENABLE_ASYNC_MYSQL)
398 target_link_libraries(${target} squangle)
400 target_link_libraries(${target} ${PCRE_LIBRARY})
401 target_link_libraries(${target} ${ICU_DATA_LIBRARIES} ${ICU_I18N_LIBRARIES} ${ICU_LIBRARIES})
402 target_link_libraries(${target} ${LIBEVENT_LIB})
403 target_link_libraries(${target} ${CURL_LIBRARIES})
404 target_link_libraries(${target} ${LIBGLOG_LIBRARY})
405 if (LIBJSONC_LIBRARY)
406 target_link_libraries(${target} ${LIBJSONC_LIBRARY})
409 if (LIBINOTIFY_LIBRARY)
410 target_link_libraries(${target} ${LIBINOTIFY_LIBRARY})
414 target_link_libraries(${target} ${CAP_LIB})
418 target_link_libraries(${target} ${RESOLV_LIB})
419 target_link_libraries(${target} ${DL_LIB})
423 target_link_libraries(${target} ${EXECINFO_LIB})
427 target_link_libraries(${target} ${LIBINTL_LIBRARIES})
428 target_link_libraries(${target} ${KERBEROS_LIB})
431 target_link_libraries(${target} ${PAM_LIBRARY})
435 if (LIBPTHREAD_LIBRARIES)
436 target_link_libraries(${target} ${LIBPTHREAD_LIBRARIES})
439 target_link_libraries(${target} ${TBB_LIBRARIES})
440 target_link_libraries(${target} ${OPENSSL_LIBRARIES})
441 target_link_libraries(${target} ${ZLIB_LIBRARIES})
443 target_link_libraries(${target} ${LIBXML2_LIBRARIES})
445 target_link_libraries(${target} ${LBER_LIBRARIES})
448 target_link_libraries(${target} ${CRYPT_LIB})
451 if (LINUX OR FREEBSD)
452 target_link_libraries(${target} ${RT_LIB})
455 if (LIBSQLITE3_FOUND AND LIBSQLITE3_LIBRARY)
456 target_link_libraries(${target} ${LIBSQLITE3_LIBRARY})
458 target_link_libraries(${target} sqlite3)
461 if (DOUBLE_CONVERSION_FOUND)
462 target_link_libraries(${target} ${DOUBLE_CONVERSION_LIBRARY})
464 target_link_libraries(${target} double-conversion)
468 target_link_libraries(${target} ${LZ4_LIBRARY})
470 target_link_libraries(${target} lz4)
472 # The syntax used for these warnings is unparsable by Apple's Clang
473 add_definitions("-DLZ4_DISABLE_DEPRECATE_WARNINGS=1")
475 target_link_libraries(${target} libzip)
478 target_link_libraries(${target} ${PCRE_LIBRARY})
480 target_link_libraries(${target} pcre)
483 if (LIBFASTLZ_LIBRARY)
484 target_link_libraries(${target} ${LIBFASTLZ_LIBRARY})
486 target_link_libraries(${target} fastlz)
489 target_link_libraries(${target} timelib)
490 target_link_libraries(${target} folly)
491 target_link_libraries(${target} wangle)
492 target_link_libraries(${target} brotlienc)
493 target_link_libraries(${target} brotlidec)
494 target_link_libraries(${target} brotlicommon)
497 target_link_libraries(${target} mcrouter)
501 target_link_libraries(${target} afdt)
503 target_link_libraries(${target} mbfl)
505 if (EDITLINE_LIBRARIES)
506 target_link_libraries(${target} ${EDITLINE_LIBRARIES})
507 elseif (READLINE_LIBRARY)
508 target_link_libraries(${target} ${READLINE_LIBRARY})
512 target_link_libraries(${target} ${LIBDWARF_LIBRARIES})
513 target_link_libraries(${target} ${LIBELF_LIBRARIES})
517 target_link_libraries(${target})
521 target_link_libraries(${target} dbghelp.lib dnsapi.lib)
524 # Check whether atomic operations require -latomic or not
525 # See https://github.com/facebook/hhvm/issues/5217
526 include(CheckCXXSourceCompiles)
527 set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
528 set(CMAKE_REQUIRED_FLAGS "-std=c++1y")
529 CHECK_CXX_SOURCE_COMPILES("
534 struct Test { int64_t val1; int64_t val2; };
536 // Do this to stop modern compilers from optimizing away the libatomic
537 // calls in release builds, making this test always pass in release builds,
538 // and incorrectly think that HHVM doesn't need linking against libatomic.
539 bool (std::atomic<Test>::* volatile x)(void) const =
540 &std::atomic<Test>::is_lock_free;
541 std::cout << (s.*x)() << std::endl;
543 " NOT_REQUIRE_ATOMIC_LINKER_FLAG)
545 if(NOT "${NOT_REQUIRE_ATOMIC_LINKER_FLAG}")
546 message(STATUS "-latomic is required to link hhvm")
547 find_library(ATOMIC_LIBRARY NAMES atomic libatomic.so.1)
548 target_link_libraries(${target} ${ATOMIC_LIBRARY})
550 set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
554 target_link_libraries(${target} ${LibXed_LIBRARY})
556 target_link_libraries(${target} xed)