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})
45 include_directories(${PCRE_INCLUDE_DIR})
48 find_package(LibEvent REQUIRED)
49 include_directories(${LIBEVENT_INCLUDE_DIR})
51 set(CMAKE_REQUIRED_LIBRARIES "${LIBEVENT_LIB}")
52 CHECK_FUNCTION_EXISTS("evhttp_bind_socket_with_fd" HAVE_CUSTOM_LIBEVENT)
53 if(HAVE_CUSTOM_LIBEVENT)
54 message("Using custom LIBEVENT")
55 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_CUSTOM_LIBEVENT")
57 set(CMAKE_REQUIRED_LIBRARIES)
63 include_directories(${LibXed_INCLUDE_DIR})
65 add_definitions("-DHAVE_LIBXED")
67 message(STATUS "XED is disabled")
71 find_package(CURL REQUIRED)
72 include_directories(${CURL_INCLUDE_DIR})
74 add_definitions("-DCURL_STATICLIB")
77 set(CMAKE_REQUIRED_LIBRARIES "${CURL_LIBRARIES}")
78 CHECK_FUNCTION_EXISTS("curl_multi_select" HAVE_CURL_MULTI_SELECT)
79 CHECK_FUNCTION_EXISTS("curl_multi_wait" HAVE_CURL_MULTI_WAIT)
80 if (HAVE_CURL_MULTI_SELECT)
81 add_definitions("-DHAVE_CURL_MULTI_SELECT")
83 if (HAVE_CURL_MULTI_WAIT)
84 add_definitions("-DHAVE_CURL_MULTI_WAIT")
86 set(CMAKE_REQUIRED_LIBRARIES)
89 find_package(LibXml2 REQUIRED)
90 include_directories(${LIBXML2_INCLUDE_DIR})
91 add_definitions(${LIBXML2_DEFINITIONS})
94 find_package(LibSQLite REQUIRED)
95 if (LIBSQLITE3_INCLUDE_DIR)
96 include_directories(${LIBSQLITE3_INCLUDE_DIR})
101 if (FASTLZ_INCLUDE_DIR)
102 include_directories(${FASTLZ_INCLUDE_DIR})
106 find_package(ICU REQUIRED)
108 if (ICU_VERSION VERSION_LESS "4.2")
109 unset(ICU_FOUND CACHE)
110 unset(ICU_INCLUDE_DIRS CACHE)
111 unset(ICU_LIBRARIES CACHE)
112 message(FATAL_ERROR "ICU is too old, found ${ICU_VERSION} and we need 4.2")
114 include_directories(${ICU_INCLUDE_DIRS})
116 add_definitions("-DU_EXPORT=")
117 add_definitions("-DU_IMPORT=")
119 # Everything is either in the `icu61` namespace or `icu` namespace, depending
120 # on another definition. There's an implicit `using namespace WHATEVER;` in
121 # ICU4c < 61.1, but now that's opt-in rather than opt-out.
122 add_definitions("-DU_USING_ICU_NAMESPACE=1")
125 # jemalloc/tmalloc and profiler
126 if (USE_GOOGLE_HEAP_PROFILER OR USE_GOOGLE_CPU_PROFILER)
127 FIND_LIBRARY(GOOGLE_PROFILER_LIB profiler)
128 FIND_PATH(GOOGLE_PROFILER_INCLUDE_DIR NAMES google/profiler.h)
129 if (GOOGLE_PROFILER_INCLUDE_DIR)
130 include_directories(${GOOGLE_PROFILER_INCLUDE_DIR})
132 if (GOOGLE_PROFILER_LIB)
133 message(STATUS "Found Google profiler: ${GOOGLE_PROFILER_LIB}")
134 if (USE_GOOGLE_CPU_PROFILER)
135 set(GOOGLE_CPU_PROFILER_ENABLED 1)
138 message(STATUS "Can't find Google profiler")
142 if (USE_GOOGLE_HEAP_PROFILER AND GOOGLE_PROFILER_LIB)
143 FIND_LIBRARY(GOOGLE_TCMALLOC_FULL_LIB tcmalloc)
144 if (GOOGLE_TCMALLOC_FULL_LIB)
145 message(STATUS "Found full tcmalloc: ${GOOGLE_TCMALLOC_FULL_LIB}")
146 set(GOOGLE_HEAP_PROFILER_ENABLED 1)
147 set(GOOGLE_TCMALLOC_ENABLED 1)
149 message(STATUS "Can't find full tcmalloc - heap profiling is disabled")
153 if(USE_JEMALLOC AND NOT GOOGLE_TCMALLOC_ENABLED)
154 add_definitions(-DUSE_JEMALLOC=1)
155 set(JEMALLOC_ENABLED 1)
157 add_definitions(-DNO_JEMALLOC=1)
160 if (USE_TCMALLOC AND NOT JEMALLOC_ENABLED AND NOT GOOGLE_TCMALLOC_ENABLED)
161 FIND_LIBRARY(GOOGLE_TCMALLOC_MIN_LIB tcmalloc_minimal)
162 if (GOOGLE_TCMALLOC_MIN_LIB)
163 message(STATUS "Found minimal tcmalloc: ${GOOGLE_TCMALLOC_MIN_LIB}")
164 set(GOOGLE_TCMALLOC_ENABLED 1)
166 message(STATUS "Can't find minimal tcmalloc")
170 if (GOOGLE_TCMALLOC_ENABLED)
171 add_definitions(-DGOOGLE_TCMALLOC=1)
173 add_definitions(-DNO_TCMALLOC=1)
175 if (GOOGLE_HEAP_PROFILER_ENABLED)
176 add_definitions(-DGOOGLE_HEAP_PROFILER=1)
178 if (GOOGLE_CPU_PROFILER_ENABLED)
179 add_definitions(-DGOOGLE_CPU_PROFILER=1)
183 if (JEMALLOC_ENABLED AND ENABLE_HHPROF)
184 add_definitions(-DENABLE_HHPROF=1)
188 find_package(TBB REQUIRED)
189 if (${TBB_INTERFACE_VERSION} LESS 5005)
190 unset(TBB_FOUND CACHE)
191 unset(TBB_INCLUDE_DIRS CACHE)
192 unset(TBB_LIBRARIES CACHE)
193 message(FATAL_ERROR "TBB is too old, please install at least 3.0(5005), preferably 4.0(6000) or higher")
195 include_directories(${TBB_INCLUDE_DIRS})
196 link_directories(${TBB_LIBRARY_DIRS})
199 find_package(OpenSSL REQUIRED)
200 include_directories(${OPENSSL_INCLUDE_DIR})
202 # LibreSSL explicitly refuses to support RAND_egd()
203 SET(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
204 SET(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_LIBRARIES})
205 INCLUDE(CheckCXXSourceCompiles)
206 CHECK_CXX_SOURCE_COMPILES("#include <openssl/rand.h>
208 return RAND_egd(\"/dev/null\");
209 }" OPENSSL_HAVE_RAND_EGD)
210 if (NOT OPENSSL_HAVE_RAND_EGD)
211 add_definitions("-DOPENSSL_NO_RAND_EGD")
213 CHECK_CXX_SOURCE_COMPILES("#include <openssl/ssl.h>
215 return SSL_set_alpn_protos(nullptr, nullptr, 0);
216 }" OPENSSL_HAVE_ALPN)
217 SET(CMAKE_REQUIRED_INCLUDES)
218 SET(CMAKE_REQUIRED_LIBRARIES)
222 find_package(ZLIB REQUIRED)
223 include_directories(${ZLIB_INCLUDE_DIR})
226 find_package(PThread REQUIRED)
227 include_directories(${LIBPTHREAD_INCLUDE_DIRS})
228 if (LIBPTHREAD_STATIC)
229 add_definitions("-DPTW32_STATIC_LIB")
233 NON_DISTRIBUTABLE_BUILD
234 "Use libraries which may result in a binary that can not be legally distributed"
238 # Either Readline or Editline (for hphpd)
239 if(NON_DISTRIBUTABLE_BUILD)
240 find_package(Readline)
242 if (NOT READLINE_INCLUDE_DIR)
243 find_package(Editline)
246 if (NON_DISTRIBUTABLE_BUILD AND READLINE_INCLUDE_DIR)
248 add_definitions("-DREADLINE_STATIC")
250 include_directories(${READLINE_INCLUDE_DIR})
251 elseif (EDITLINE_INCLUDE_DIRS)
252 add_definitions("-DUSE_EDITLINE")
253 include_directories(${EDITLINE_INCLUDE_DIRS})
255 message(FATAL_ERROR "Could not find Readline or Editline")
259 find_package(LibDwarf REQUIRED)
260 include_directories(${LIBDWARF_INCLUDE_DIRS})
261 if (LIBDWARF_CONST_NAME)
262 add_definitions("-DLIBDWARF_CONST_NAME")
264 if (LIBDWARF_USE_INIT_C)
265 add_definitions("-DLIBDWARF_USE_INIT_C")
268 find_package(LibElf REQUIRED)
269 include_directories(${LIBELF_INCLUDE_DIRS})
270 if (ELF_GETSHDRSTRNDX)
271 add_definitions("-DHAVE_ELF_GETSHDRSTRNDX")
275 FIND_LIBRARY(PAM_LIB pam)
276 FIND_LIBRARY(CRYPT_LIB NAMES xcrypt crypt crypto)
277 if (LINUX OR FREEBSD)
278 FIND_LIBRARY (RT_LIB rt)
282 FIND_LIBRARY (CAP_LIB cap)
285 message(FATAL_ERROR "You need to install libcap")
290 FIND_LIBRARY (DL_LIB dl)
291 FIND_LIBRARY (RESOLV_LIB resolv)
295 FIND_LIBRARY (EXECINFO_LIB execinfo)
296 if (NOT EXECINFO_LIB)
297 message(FATAL_ERROR "You need to install libexecinfo")
302 find_library(KERBEROS_LIB NAMES gssapi_krb5)
304 # This is required by Homebrew's libc. See
305 # https://github.com/facebook/hhvm/pull/5728#issuecomment-124290712
308 if (PAM_INCLUDE_PATH)
309 include_directories(${PAM_INCLUDE_PATH})
313 include_directories(${HPHP_HOME}/hphp)
315 macro(hphp_link target)
316 if (${ARGC} GREATER 1)
317 set(VISIBILITY "${ARGV1}")
319 # We actually want PUBLIC, but specifying PUBLIC is an error if there is
320 # another target_link_libraries(${target} ) without PUBLIC/PRIVATE/INTERFACE
321 # anywhere else, so keep this for now for backwards compatibility
324 # oniguruma must be linked first for MacOS's linker to do the right thing -
325 # that's handled in HPHPSetup.cmake
327 # That only handles linking - we still need to make sure that:
328 # - oniguruma is built first, if needed (so we have the header files)
329 # - we build with the header files in the include path
331 if (NOT "${VISIBILITY}" STREQUAL "INTERFACE")
332 add_dependencies(${target} ${VISIBILITY} onig)
333 target_include_directories(${target} PRIVATE $<TARGET_PROPERTY:onig,INTERFACE_INCLUDE_DIRECTORIES>)
336 # Otherwise, the linker does the right thing, which sometimes means putting it after things that use it
337 target_link_libraries(${target} ${VISIBILITY} onig)
341 target_link_libraries(${target} ${VISIBILITY} ${LIBDL_LIBRARIES})
344 if (JEMALLOC_ENABLED)
345 target_link_libraries(${target} ${VISIBILITY} jemalloc)
348 if (GOOGLE_HEAP_PROFILER_ENABLED OR GOOGLE_CPU_PROFILER_ENABLED)
349 target_link_libraries(${target} ${VISIBILITY} ${GOOGLE_PROFILER_LIB})
352 if (GOOGLE_HEAP_PROFILER_ENABLED)
353 target_link_libraries(${target} ${VISIBILITY} ${GOOGLE_TCMALLOC_FULL_LIB})
354 elseif (GOOGLE_TCMALLOC_ENABLED)
355 target_link_libraries(${target} ${VISIBILITY} ${GOOGLE_TCMALLOC_MIN_LIB})
358 target_link_libraries(${target} ${VISIBILITY} libsodium)
360 target_link_libraries(${target} ${VISIBILITY} ${PCRE_LIBRARY})
361 target_link_libraries(${target} ${VISIBILITY} ${ICU_DATA_LIBRARIES} ${ICU_I18N_LIBRARIES} ${ICU_LIBRARIES})
362 target_link_libraries(${target} ${VISIBILITY} ${LIBEVENT_LIB})
363 target_link_libraries(${target} ${VISIBILITY} ${CURL_LIBRARIES})
364 target_link_libraries(${target} ${VISIBILITY} ${LIBGLOG_LIBRARY})
365 if (LIBJSONC_LIBRARY)
366 target_link_libraries(${target} ${VISIBILITY} ${LIBJSONC_LIBRARY})
369 if (LIBINOTIFY_LIBRARY)
370 target_link_libraries(${target} ${VISIBILITY} ${LIBINOTIFY_LIBRARY})
374 target_link_libraries(${target} ${VISIBILITY} ${CAP_LIB})
378 target_link_libraries(${target} ${VISIBILITY} ${RESOLV_LIB})
379 target_link_libraries(${target} ${VISIBILITY} ${DL_LIB})
383 target_link_libraries(${target} ${VISIBILITY} ${EXECINFO_LIB})
387 target_link_libraries(${target} ${VISIBILITY} ${LIBINTL_LIBRARIES})
388 target_link_libraries(${target} ${VISIBILITY} ${KERBEROS_LIB})
391 target_link_libraries(${target} ${VISIBILITY} ${PAM_LIBRARY})
395 if (LIBPTHREAD_LIBRARIES)
396 target_link_libraries(${target} ${VISIBILITY} ${LIBPTHREAD_LIBRARIES})
399 target_link_libraries(${target} ${VISIBILITY} ${TBB_LIBRARIES})
400 target_link_libraries(${target} ${VISIBILITY} ${OPENSSL_LIBRARIES})
401 target_link_libraries(${target} ${VISIBILITY} ${ZLIB_LIBRARIES})
403 target_link_libraries(${target} ${VISIBILITY} ${LIBXML2_LIBRARIES})
405 target_link_libraries(${target} ${VISIBILITY} ${LBER_LIBRARIES})
408 target_link_libraries(${target} ${VISIBILITY} ${PAM_LIB})
412 target_link_libraries(${target} ${VISIBILITY} ${CRYPT_LIB})
415 if (LINUX OR FREEBSD)
416 target_link_libraries(${target} ${VISIBILITY} ${RT_LIB})
419 if (LIBSQLITE3_FOUND AND LIBSQLITE3_LIBRARY)
420 target_link_libraries(${target} ${VISIBILITY} ${LIBSQLITE3_LIBRARY})
422 target_link_libraries(${target} ${VISIBILITY} sqlite3)
425 target_link_libraries(${target} ${VISIBILITY} lz4)
426 target_link_libraries(${target} ${VISIBILITY} libzip)
429 target_link_libraries(${target} ${VISIBILITY} ${PCRE_LIBRARY})
431 target_link_libraries(${target} ${VISIBILITY} pcre)
434 if (LIBFASTLZ_LIBRARY)
435 target_link_libraries(${target} ${VISIBILITY} ${LIBFASTLZ_LIBRARY})
437 target_link_libraries(${target} ${VISIBILITY} fastlz)
440 target_link_libraries(${target} ${VISIBILITY} timelib)
441 target_link_libraries(${target} ${VISIBILITY} folly)
442 target_link_libraries(${target} ${VISIBILITY} jemalloc)
443 target_link_libraries(${target} ${VISIBILITY} wangle)
444 target_link_libraries(${target} ${VISIBILITY} brotli)
445 target_link_libraries(${target} ${VISIBILITY} hhbc_ast_header)
446 target_link_libraries(${target} ${VISIBILITY} compiler_ffi)
447 target_link_libraries(${target} ${VISIBILITY} parser_ffi)
448 target_link_libraries(${target} ${VISIBILITY} hhvm_types_ffi)
449 target_link_libraries(${target} ${VISIBILITY} hhvm_hhbc_defs_ffi)
452 target_link_libraries(${target} ${VISIBILITY} afdt)
454 target_link_libraries(${target} ${VISIBILITY} mbfl)
456 if (EDITLINE_LIBRARIES)
457 target_link_libraries(${target} ${VISIBILITY} ${EDITLINE_LIBRARIES})
458 elseif (READLINE_LIBRARY)
459 target_link_libraries(${target} ${VISIBILITY} ${READLINE_LIBRARY})
463 target_link_libraries(${target} ${VISIBILITY} dbghelp.lib dnsapi.lib)
466 # Check whether atomic operations require -latomic or not
467 # See https://github.com/facebook/hhvm/issues/5217
468 include(CheckCXXSourceCompiles)
469 set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
470 set(CMAKE_REQUIRED_FLAGS "-std=c++1y")
471 CHECK_CXX_SOURCE_COMPILES("
476 struct Test { int64_t val1; int64_t val2; };
478 // Do this to stop modern compilers from optimizing away the libatomic
479 // calls in release builds, making this test always pass in release builds,
480 // and incorrectly think that HHVM doesn't need linking against libatomic.
481 bool (std::atomic<Test>::* volatile x)(void) const =
482 &std::atomic<Test>::is_lock_free;
483 std::cout << (s.*x)() << std::endl;
485 " NOT_REQUIRE_ATOMIC_LINKER_FLAG)
487 if(NOT "${NOT_REQUIRE_ATOMIC_LINKER_FLAG}")
488 message(STATUS "-latomic is required to link hhvm")
489 find_library(ATOMIC_LIBRARY NAMES atomic libatomic.so.1)
490 target_link_libraries(${target} ${VISIBILITY} ${ATOMIC_LIBRARY})
492 set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
496 target_link_libraries(${target} ${VISIBILITY} ${LibXed_LIBRARY})
498 target_link_libraries(${target} ${VISIBILITY} xed)
502 if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "AppleClang") # using Clang
503 if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0)
504 target_link_libraries(${target} ${VISIBILITY} c++fs)
506 elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
507 if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.1)
508 target_link_libraries(${target} ${VISIBILITY} stdc++fs)