Filter out non-Hack files
[hiphop-php.git] / CMake / HPHPFindLibs.cmake
blob13f77b627e42279a2cd1342f6e8ec2945262e573
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 # google-glog
31 find_package(Glog REQUIRED)
32 if (LIBGLOG_STATIC)
33   add_definitions("-DGOOGLE_GLOG_DLL_DECL=")
34 endif()
35 include_directories(${LIBGLOG_INCLUDE_DIR})
37 # inotify checks
38 find_package(Libinotify)
39 if (LIBINOTIFY_INCLUDE_DIR)
40   include_directories(${LIBINOTIFY_INCLUDE_DIR})
41 endif()
43 # mysql checks - if we're using async mysql, we use fbmysqlclient from
44 # third-party/ instead
45 if (ENABLE_ASYNC_MYSQL)
46   include_directories(
47     ${RE2_INCLUDE_DIR}
48     ${TP_DIR}/squangle/src/
49     ${TP_DIR}/fb-mysql/src/include/
50   )
51   set(MYSQL_CLIENT_LIB_DIR ${TP_DIR}/fb-mysql/src/)
52   set(MYSQL_CLIENT_LIBS
53     ${MYSQL_CLIENT_LIB_DIR}/libmysql/libfbmysqlclient_r.a
54   )
55 else()
56   find_package(MySQL REQUIRED)
57   link_directories(${MYSQL_LIB_DIR})
58   include_directories(${MYSQL_INCLUDE_DIR})
59 endif()
60 MYSQL_SOCKET_SEARCH()
61 if (MYSQL_UNIX_SOCK_ADDR)
62   add_definitions(-DPHP_MYSQL_UNIX_SOCK_ADDR="${MYSQL_UNIX_SOCK_ADDR}")
63 else ()
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")
65 endif ()
67 # pcre checks
68 find_package(PCRE)
69 include_directories(${PCRE_INCLUDE_DIR})
71 # libevent checks
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")
80 endif()
81 set(CMAKE_REQUIRED_LIBRARIES)
83 # libXed
84 if (ENABLE_XED)
85   find_package(LibXed)
86   if (LibXed_FOUND)
87     include_directories(${LibXed_INCLUDE_DIR})
88   endif()
89   add_definitions("-DHAVE_LIBXED")
90 else()
91   message(STATUS "XED is disabled")
92 endif()
94 # CURL checks
95 find_package(CURL REQUIRED)
96 include_directories(${CURL_INCLUDE_DIR})
97 if (CURL_STATIC)
98   add_definitions("-DCURL_STATICLIB")
99 endif()
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")
106 endif()
107 if (HAVE_CURL_MULTI_WAIT)
108   add_definitions("-DHAVE_CURL_MULTI_WAIT")
109 endif()
110 set(CMAKE_REQUIRED_LIBRARIES)
112 # LibXML2 checks
113 find_package(LibXml2 REQUIRED)
114 include_directories(${LIBXML2_INCLUDE_DIR})
115 add_definitions(${LIBXML2_DEFINITIONS})
117 # libsqlite3
118 find_package(LibSQLite)
119 if (LIBSQLITE3_INCLUDE_DIR)
120   include_directories(${LIBSQLITE3_INCLUDE_DIR})
121 endif ()
123 # libdouble-conversion
124 find_package(DoubleConversion)
125 if (DOUBLE_CONVERSION_INCLUDE_DIR)
126   include_directories(${DOUBLE_CONVERSION_INCLUDE_DIR})
127 endif ()
129 # liblz4
130 find_package(LZ4)
131 if (LZ4_FOUND)
132   include_directories(${LZ4_INCLUDE_DIR})
133 endif()
135 # fastlz
136 find_package(FastLZ)
137 if (FASTLZ_INCLUDE_DIR)
138   include_directories(${FASTLZ_INCLUDE_DIR})
139 endif()
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   if (ICU_STATIC)
152     add_definitions("-DU_EXPORT=")
153     add_definitions("-DU_IMPORT=")
154   endif()
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")
159 endif (ICU_FOUND)
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})
167   endif()
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)
172     endif()
173   else()
174     message(STATUS "Can't find Google profiler")
175   endif()
176 endif()
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)
184   else()
185     message(STATUS "Can't find full tcmalloc - heap profiling is disabled")
186   endif()
187 endif()
189 if(USE_JEMALLOC AND NOT GOOGLE_TCMALLOC_ENABLED)
190   add_definitions(-DUSE_JEMALLOC=1)
191   set(JEMALLOC_ENABLED 1)
192 else()
193   add_definitions(-DNO_JEMALLOC=1)
194 endif()
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)
201   else()
202     message(STATUS "Can't find minimal tcmalloc")
203   endif()
204 endif()
206 if (GOOGLE_TCMALLOC_ENABLED)
207   add_definitions(-DGOOGLE_TCMALLOC=1)
208 else()
209   add_definitions(-DNO_TCMALLOC=1)
210 endif()
211 if (GOOGLE_HEAP_PROFILER_ENABLED)
212   add_definitions(-DGOOGLE_HEAP_PROFILER=1)
213 endif()
214 if (GOOGLE_CPU_PROFILER_ENABLED)
215   add_definitions(-DGOOGLE_CPU_PROFILER=1)
216 endif()
218 # HHProf
219 if (JEMALLOC_ENABLED AND ENABLE_HHPROF)
220   add_definitions(-DENABLE_HHPROF=1)
221 endif()
223 # tbb libs
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")
230 endif()
231 include_directories(${TBB_INCLUDE_DIRS})
232 link_directories(${TBB_LIBRARY_DIRS})
234 # OpenSSL libs
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>
243 int main() {
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")
248 endif()
249 CHECK_CXX_SOURCE_COMPILES("#include <openssl/ssl.h>
250 int main() {
251   return SSL_set_alpn_protos(nullptr, nullptr, 0);
252 }" OPENSSL_HAVE_ALPN)
253 SET(CMAKE_REQUIRED_INCLUDES)
254 SET(CMAKE_REQUIRED_LIBRARIES)
257 # ZLIB
258 find_package(ZLIB REQUIRED)
259 include_directories(${ZLIB_INCLUDE_DIR})
261 # libpthreads
262 find_package(PThread REQUIRED)
263 include_directories(${LIBPTHREAD_INCLUDE_DIRS})
264 if (LIBPTHREAD_STATIC)
265   add_definitions("-DPTW32_STATIC_LIB")
266 endif()
268 OPTION(
269   NON_DISTRIBUTABLE_BUILD
270   "Use libraries which may result in a binary that can not be legally distributed"
271   OFF
274 # Either Readline or Editline (for hphpd)
275 if(NON_DISTRIBUTABLE_BUILD)
276   find_package(Readline)
277 endif()
278 if (NOT READLINE_INCLUDE_DIR)
279   find_package(Editline)
280 endif()
282 if (NON_DISTRIBUTABLE_BUILD AND READLINE_INCLUDE_DIR)
283   if (READLINE_STATIC)
284     add_definitions("-DREADLINE_STATIC")
285   endif()
286   include_directories(${READLINE_INCLUDE_DIR})
287 elseif (EDITLINE_INCLUDE_DIRS)
288   add_definitions("-DUSE_EDITLINE")
289   include_directories(${EDITLINE_INCLUDE_DIRS})
290 else()
291   message(FATAL_ERROR "Could not find Readline or Editline")
292 endif()
294 if (NOT WINDOWS)
295   find_package(LibDwarf REQUIRED)
296   include_directories(${LIBDWARF_INCLUDE_DIRS})
297   if (LIBDWARF_CONST_NAME)
298     add_definitions("-DLIBDWARF_CONST_NAME")
299   endif()
300   if (LIBDWARF_USE_INIT_C)
301     add_definitions("-DLIBDWARF_USE_INIT_C")
302   endif()
304   find_package(LibElf REQUIRED)
305   include_directories(${LIBELF_INCLUDE_DIRS})
306   if (ELF_GETSHDRSTRNDX)
307     add_definitions("-DHAVE_ELF_GETSHDRSTRNDX")
308   endif()
309 endif()
311 FIND_LIBRARY(CRYPT_LIB NAMES xcrypt crypt crypto)
312 if (LINUX OR FREEBSD)
313   FIND_LIBRARY (RT_LIB rt)
314 endif()
316 if (LINUX)
317   FIND_LIBRARY (CAP_LIB cap)
319   if (NOT CAP_LIB)
320     message(FATAL_ERROR "You need to install libcap")
321   endif()
322 endif()
324 if (LINUX OR APPLE)
325   FIND_LIBRARY (DL_LIB dl)
326   FIND_LIBRARY (RESOLV_LIB resolv)
327 endif()
329 if (FREEBSD)
330   FIND_LIBRARY (EXECINFO_LIB execinfo)
331   if (NOT EXECINFO_LIB)
332     message(FATAL_ERROR "You need to install libexecinfo")
333   endif()
334 endif()
336 if (APPLE)
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
341   # for more info.
342   find_package(Libpam)
343   if (PAM_INCLUDE_PATH)
344     include_directories(${PAM_INCLUDE_PATH})
345   endif()
346 endif()
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")
353 #endif()
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
360   #
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
364   if(APPLE)
365     add_dependencies(${target} onig)
366     target_include_directories(${target} PRIVATE $<TARGET_PROPERTY:onig,INTERFACE_INCLUDE_DIRECTORIES>)
367   else()
368     # Otherwise, the linker does the right thing, which sometimes means putting it after things that use it
369     target_link_libraries(${target} onig)
370   endif()
372   if (LIBDL_LIBRARIES)
373     target_link_libraries(${target} ${LIBDL_LIBRARIES})
374   endif ()
376   if (JEMALLOC_ENABLED)
377     target_link_libraries(${target} jemalloc)
378     add_dependencies(${target} jemalloc)
379   endif ()
381   if (GOOGLE_HEAP_PROFILER_ENABLED OR GOOGLE_CPU_PROFILER_ENABLED)
382     target_link_libraries(${target} ${GOOGLE_PROFILER_LIB})
383   endif()
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})
389   endif()
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)
399   endif()
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})
407   endif()
409   if (LIBINOTIFY_LIBRARY)
410     target_link_libraries(${target} ${LIBINOTIFY_LIBRARY})
411   endif()
413   if (LINUX)
414     target_link_libraries(${target} ${CAP_LIB})
415   endif()
417   if (LINUX OR APPLE)
418     target_link_libraries(${target} ${RESOLV_LIB})
419     target_link_libraries(${target} ${DL_LIB})
420   endif()
422   if (FREEBSD)
423     target_link_libraries(${target} ${EXECINFO_LIB})
424   endif()
426   if (APPLE)
427     target_link_libraries(${target} ${LIBINTL_LIBRARIES})
428     target_link_libraries(${target} ${KERBEROS_LIB})
430     if (PAM_LIBRARY)
431       target_link_libraries(${target} ${PAM_LIBRARY})
432     endif()
433   endif()
435   if (LIBPTHREAD_LIBRARIES)
436     target_link_libraries(${target} ${LIBPTHREAD_LIBRARIES})
437   endif()
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})
447   if (CRYPT_LIB)
448     target_link_libraries(${target} ${CRYPT_LIB})
449   endif()
451   if (LINUX OR FREEBSD)
452     target_link_libraries(${target} ${RT_LIB})
453   endif()
455   if (LIBSQLITE3_FOUND AND LIBSQLITE3_LIBRARY)
456     target_link_libraries(${target} ${LIBSQLITE3_LIBRARY})
457   else()
458     target_link_libraries(${target} sqlite3)
459   endif()
461   if (DOUBLE_CONVERSION_FOUND)
462     target_link_libraries(${target} ${DOUBLE_CONVERSION_LIBRARY})
463   else()
464     target_link_libraries(${target} double-conversion)
465   endif()
467   if (LZ4_FOUND)
468     target_link_libraries(${target} ${LZ4_LIBRARY})
469   else()
470     target_link_libraries(${target} lz4)
471   endif()
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)
477   if (PCRE_LIBRARY)
478     target_link_libraries(${target} ${PCRE_LIBRARY})
479   else()
480     target_link_libraries(${target} pcre)
481   endif()
483   if (LIBFASTLZ_LIBRARY)
484     target_link_libraries(${target} ${LIBFASTLZ_LIBRARY})
485   else()
486     target_link_libraries(${target} fastlz)
487   endif()
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)
496   if (ENABLE_MCROUTER)
497     target_link_libraries(${target} mcrouter)
498   endif()
500   if (NOT MSVC)
501     target_link_libraries(${target} afdt)
502   endif()
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})
509   endif()
511   if (NOT WINDOWS)
512     target_link_libraries(${target} ${LIBDWARF_LIBRARIES})
513     target_link_libraries(${target} ${LIBELF_LIBRARIES})
514   endif()
516   if (LINUX)
517     target_link_libraries(${target})
518   endif()
520   if (MSVC)
521     target_link_libraries(${target} dbghelp.lib dnsapi.lib)
522   endif()
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("
530 #include <atomic>
531 #include <iostream>
532 #include <stdint.h>
533 int main() {
534     struct Test { int64_t val1; int64_t val2; };
535     std::atomic<Test> s;
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})
549   endif()
550   set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
552   if (ENABLE_XED)
553     if (LibXed_FOUND)
554         target_link_libraries(${target} ${LibXed_LIBRARY})
555     else()
556         target_link_libraries(${target} xed)
557     endif()
558   endif()
559 endmacro()