Mark LaravelValidatioNValidatorTest as flakey
[hiphop-php.git] / CMake / HPHPFindLibs.cmake
blob706bd86223b38d318bb43c683fd51207e5eb099e
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 # boost checks
31 find_package(Boost 1.51.0 COMPONENTS system program_options filesystem context REQUIRED)
32 include_directories(${Boost_INCLUDE_DIRS})
33 link_directories(${Boost_LIBRARY_DIRS})
34 add_definitions("-DHAVE_BOOST1_49")
37 # features.h
38 FIND_PATH(FEATURES_HEADER features.h)
39 if (FEATURES_HEADER)
40   add_definitions("-DHAVE_FEATURES_H=1")
41 endif()
43 # google-glog
44 find_package(Glog REQUIRED)
45 include_directories(${LIBGLOG_INCLUDE_DIR})
47 # inotify checks
48 find_package(Libinotify)
49 if (LIBINOTIFY_INCLUDE_DIR)
50   include_directories(${LIBINOTIFY_INCLUDE_DIR})
51 endif()
53 # iconv checks
54 find_package(Libiconv REQUIRED)
55 include_directories(${LIBICONV_INCLUDE_DIR})
56 if (LIBICONV_CONST)
57   message(STATUS "Using const for input to iconv() call")
58   add_definitions("-DICONV_CONST=const")
59 endif()
61 # mysql checks - if we're using async mysql, we use webscalesqlclient from
62 # third-party/ instead
63 if (ENABLE_ASYNC_MYSQL)
64   include_directories(
65     ${TP_DIR}/re2/src/
66     ${TP_DIR}/squangle/src/
67     ${TP_DIR}/webscalesqlclient/src/include/
68   )
69   set(MYSQL_CLIENT_LIB_DIR ${TP_DIR}/webscalesqlclient/src/)
70   # Unlike the .so, the static library intentionally does not link against
71   # yassl, despite building it :/
72   set(MYSQL_CLIENT_LIBS
73     ${MYSQL_CLIENT_LIB_DIR}/libmysql/libwebscalesqlclient_r.a
74     ${MYSQL_CLIENT_LIB_DIR}/extra/yassl/libyassl.a
75     ${MYSQL_CLIENT_LIB_DIR}/extra/yassl/taocrypt/libtaocrypt.a
76   )
77 else()
78   find_package(MySQL REQUIRED)
79   link_directories(${MYSQL_LIB_DIR})
80   include_directories(${MYSQL_INCLUDE_DIR})
81 endif()
82 MYSQL_SOCKET_SEARCH()
83 if (MYSQL_UNIX_SOCK_ADDR)
84   add_definitions(-DPHP_MYSQL_UNIX_SOCK_ADDR="${MYSQL_UNIX_SOCK_ADDR}")
85 else ()
86   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")
87 endif ()
89 # pcre checks
90 find_package(PCRE)
91 include_directories(${PCRE_INCLUDE_DIR})
93 # libevent checks
94 find_package(LibEvent REQUIRED)
95 include_directories(${LIBEVENT_INCLUDE_DIR})
97 set(CMAKE_REQUIRED_LIBRARIES "${LIBEVENT_LIB}")
98 CHECK_FUNCTION_EXISTS("evhttp_bind_socket_with_fd" HAVE_CUSTOM_LIBEVENT)
99 if(HAVE_CUSTOM_LIBEVENT)
100         message("Using custom LIBEVENT")
101         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_CUSTOM_LIBEVENT")
102 endif()
103 set(CMAKE_REQUIRED_LIBRARIES)
105 # libXed
106 find_package(LibXed)
107 if (LibXed_INCLUDE_DIR AND LibXed_LIBRARY)
108   include_directories(${LibXed_INCLUDE_DIR})
109   add_definitions("-DHAVE_LIBXED")
110 endif()
112 # CURL checks
113 find_package(CURL REQUIRED)
114 include_directories(${CURL_INCLUDE_DIR})
116 set(CMAKE_REQUIRED_LIBRARIES "${CURL_LIBRARIES}")
117 CHECK_FUNCTION_EXISTS("curl_multi_select" HAVE_CURL_MULTI_SELECT)
118 CHECK_FUNCTION_EXISTS("curl_multi_wait" HAVE_CURL_MULTI_WAIT)
119 if (HAVE_CURL_MULTI_SELECT)
120   add_definitions("-DHAVE_CURL_MULTI_SELECT")
121 endif()
122 if (HAVE_CURL_MULTI_WAIT)
123   add_definitions("-DHAVE_CURL_MULTI_WAIT")
124 endif()
125 set(CMAKE_REQUIRED_LIBRARIES)
127 # LibXML2 checks
128 find_package(LibXml2 REQUIRED)
129 include_directories(${LIBXML2_INCLUDE_DIR})
130 add_definitions(${LIBXML2_DEFINITIONS})
132 # libsqlite3
133 find_package(LibSQLite)
134 if (LIBSQLITE_INCLUDE_DIR)
135   include_directories(${LIBSQLITE_INCLUDE_DIR})
136 endif ()
138 # libdouble-conversion
139 find_package(DoubleConversion)
140 if (DOUBLE_CONVERSION_INCLUDE_DIR)
141   include_directories(${DOUBLE_CONVERSION_INCLUDE_DIR})
142 endif ()
144 # liblz4
145 find_package(LZ4)
146 if (LZ4_INCLUDE_DIR)
147   include_directories(${LZ4_INCLUDE_DIR})
148 endif()
150 # fastlz
151 find_package(FastLZ)
152 if (FASTLZ_INCLUDE_DIR)
153   include_directories(${FASTLZ_INCLUDE_DIR})
154 endif()
156 # libzip
157 find_package(LibZip)
158 if (LIBZIP_INCLUDE_DIR_ZIP AND LIBZIP_INCLUDE_DIR_ZIPCONF)
159   if (LIBZIP_VERSION VERSION_LESS "0.11")
160     unset(LIBZIP_FOUND CACHE)
161     unset(LIBZIP_LIBRARY CACHE)
162     unset(LIBZIP_INCLUDE_DIR_ZIP CACHE)
163     unset(LIBZIP_INCLUDE_DIR_ZIPCONF CACHE)
164     message(STATUS "libzip is too old, found ${LIBZIP_VERSION} and we need 0.11+, using third-party bundled libzip")
165   else ()
166     include_directories(${LIBZIP_INCLUDE_DIR_ZIP} ${LIBZIP_INCLUDE_DIR_ZIPCONF})
167     message(STATUS "Found libzip: ${LIBZIP_LIBRARY} ${LIBZIP_VERSION}")
168   endif ()
169 else ()
170   message(STATUS "Using third-party bundled libzip")
171 endif()
173 # ICU
174 find_package(ICU REQUIRED)
175 if (ICU_FOUND)
176   if (ICU_VERSION VERSION_LESS "4.2")
177     unset(ICU_FOUND CACHE)
178     unset(ICU_INCLUDE_DIRS CACHE)
179     unset(ICU_LIBRARIES CACHE)
180     message(FATAL_ERROR "ICU is too old, found ${ICU_VERSION} and we need 4.2")
181   endif ()
182   include_directories(${ICU_INCLUDE_DIRS})
183 endif (ICU_FOUND)
185 # jemalloc/tmalloc and profiler
186 if (USE_GOOGLE_HEAP_PROFILER OR USE_GOOGLE_CPU_PROFILER)
187   FIND_LIBRARY(GOOGLE_PROFILER_LIB profiler)
188   FIND_PATH(GOOGLE_PROFILER_INCLUDE_DIR NAMES google/profiler.h)
189   if (GOOGLE_PROFILER_INCLUDE_DIR)
190     include_directories(${GOOGLE_PROFILER_INCLUDE_DIR})
191   endif()
192   if (GOOGLE_PROFILER_LIB)
193     message(STATUS "Found Google profiler: ${GOOGLE_PROFILER_LIB}")
194     if (USE_GOOGLE_CPU_PROFILER)
195       set(GOOGLE_CPU_PROFILER_ENABLED 1)
196     endif()
197   else()
198     message(STATUS "Can't find Google profiler")
199   endif()
200 endif()
202 if (USE_GOOGLE_HEAP_PROFILER AND GOOGLE_PROFILER_LIB)
203   FIND_LIBRARY(GOOGLE_TCMALLOC_FULL_LIB tcmalloc)
204   if (GOOGLE_TCMALLOC_FULL_LIB)
205     message(STATUS "Found full tcmalloc: ${GOOGLE_TCMALLOC_FULL_LIB}")
206     set(GOOGLE_HEAP_PROFILER_ENABLED 1)
207     set(GOOGLE_TCMALLOC_ENABLED 1)
208   else()
209     message(STATUS "Can't find full tcmalloc - heap profiling is disabled")
210   endif()
211 endif()
213 if (USE_JEMALLOC AND NOT GOOGLE_TCMALLOC_ENABLED)
214   FIND_LIBRARY(JEMALLOC_LIB NAMES jemalloc)
215   FIND_PATH(JEMALLOC_INCLUDE_DIR NAMES jemalloc/jemalloc.h)
217   if (JEMALLOC_INCLUDE_DIR AND JEMALLOC_LIB)
218     include_directories(${JEMALLOC_INCLUDE_DIR})
220     set (CMAKE_REQUIRED_INCLUDES ${JEMALLOC_INCLUDE_DIR})
221     INCLUDE(CheckCXXSourceCompiles)
222     CHECK_CXX_SOURCE_COMPILES("
223 #include <jemalloc/jemalloc.h>
225 #define JEMALLOC_VERSION_NUMERIC ((JEMALLOC_VERSION_MAJOR << 24) | (JEMALLOC_VERSION_MINOR << 16) | (JEMALLOC_VERSION_BUGFIX << 8) | JEMALLOC_VERSION_NDEV)
227 #if JEMALLOC_VERSION_NUMERIC < 0x03050100
228 # error jemalloc version >= 3.5.1 required
229 #endif
231 int main(void) { return 0; }" JEMALLOC_VERSION_MINIMUM)
232     set (CMAKE_REQUIRED_INCLUDES)
234     if (JEMALLOC_VERSION_MINIMUM)
235       message(STATUS "Found jemalloc: ${JEMALLOC_LIB}")
236       set(JEMALLOC_ENABLED 1)
237     else()
238       message(STATUS "Found jemalloc, but it was too old")
239     endif()
240   endif()
241 endif()
243 if (USE_TCMALLOC AND NOT JEMALLOC_ENABLED AND NOT GOOGLE_TCMALLOC_ENABLED)
244   FIND_LIBRARY(GOOGLE_TCMALLOC_MIN_LIB tcmalloc_minimal)
245   if (GOOGLE_TCMALLOC_MIN_LIB)
246     message(STATUS "Found minimal tcmalloc: ${GOOGLE_TCMALLOC_MIN_LIB}")
247     set(GOOGLE_TCMALLOC_ENABLED 1)
248   else()
249     message(STATUS "Can't find minimal tcmalloc")
250   endif()
251 endif()
253 if (JEMALLOC_ENABLED)
254   add_definitions(-DUSE_JEMALLOC=1)
255 else()
256   add_definitions(-DNO_JEMALLOC=1)
257 endif()
258 if (GOOGLE_TCMALLOC_ENABLED)
259   add_definitions(-DGOOGLE_TCMALLOC=1)
260 else()
261   add_definitions(-DNO_TCMALLOC=1)
262 endif()
263 if (GOOGLE_HEAP_PROFILER_ENABLED)
264   add_definitions(-DGOOGLE_HEAP_PROFILER=1)
265 endif()
266 if (GOOGLE_CPU_PROFILER_ENABLED)
267   add_definitions(-DGOOGLE_CPU_PROFILER=1)
268 endif()
270 # tbb libs
271 find_package(TBB REQUIRED)
272 if (${TBB_INTERFACE_VERSION} LESS 5005)
273   unset(TBB_FOUND CACHE)
274   unset(TBB_INCLUDE_DIRS CACHE)
275   unset(TBB_LIBRARIES CACHE)
276   message(FATAL_ERROR "TBB is too old, please install at least 3.0(5005), preferably 4.0(6000) or higher")
277 endif()
278 include_directories(${TBB_INCLUDE_DIRS})
279 link_directories(${TBB_LIBRARY_DIRS})
281 # OpenSSL libs
282 find_package(OpenSSL REQUIRED)
283 include_directories(${OPENSSL_INCLUDE_DIR})
285 # LibreSSL explicitly refuses to support RAND_egd()
286 SET(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_LIBRARIES})
287 INCLUDE(CheckCXXSourceCompiles)
288 CHECK_CXX_SOURCE_COMPILES("#include <openssl/rand.h>
289 int main() {
290   return RAND_egd(\"/dev/null\");
291 }" OPENSSL_HAVE_RAND_EGD)
292 if (NOT OPENSSL_HAVE_RAND_EGD)
293   add_definitions("-DOPENSSL_NO_RAND_EGD")
294 endif()
297 # ZLIB
298 find_package(ZLIB REQUIRED)
299 include_directories(${ZLIB_INCLUDE_DIR})
301 # oniguruma
302 find_package(ONIGURUMA REQUIRED)
303 include_directories(${ONIGURUMA_INCLUDE_DIRS})
305 # libpthreads
306 find_package(PThread REQUIRED)
307 include_directories(${LIBPTHREAD_INCLUDE_DIRS})
309 # Either Readline or Editline (for hphpd)
310 find_package(Readline)
311 find_package(Editline)
312 if (EDITLINE_INCLUDE_DIRS)
313   add_definitions("-DUSE_EDITLINE")
314   include_directories(${EDITLINE_INCLUDE_DIRS})
315 elseif (READLINE_INCLUDE_DIR)
316   include_directories(${READLINE_INCLUDE_DIR})
317 else()
318   message(FATAL_ERROR "Could not find Readline or Editline")
319 endif()
321 find_package(LibDwarf REQUIRED)
322 include_directories(${LIBDWARF_INCLUDE_DIRS})
323 if (LIBDWARF_CONST_NAME)
324   add_definitions("-DLIBDWARF_CONST_NAME")
325 endif()
326 if (LIBDWARF_USE_INIT_C)
327   add_definitions("-DLIBDWARF_USE_INIT_C")
328 endif()
330 find_package(LibElf REQUIRED)
331 include_directories(${LIBELF_INCLUDE_DIRS})
332 if (ELF_GETSHDRSTRNDX)
333   add_definitions("-DHAVE_ELF_GETSHDRSTRNDX")
334 endif()
336 # LLVM. Disabled in OSS for now: t5056266
337 # find_package(LLVM)
338 # if (LIBLLVM_INCLUDE_DIR)
339 #   include_directories(LIBLLVM_INCLUDE_DIR)
340 #   add_definitions("-DUSE_LLVM")
341 # endif()
343 FIND_LIBRARY(CRYPT_LIB NAMES xcrypt crypt crypto)
344 if (LINUX OR FREEBSD)
345   FIND_LIBRARY (RT_LIB rt)
346 endif()
348 if (LINUX)
349   FIND_LIBRARY (CAP_LIB cap)
351   if (NOT CAP_LIB)
352     message(FATAL_ERROR "You need to install libcap")
353   endif()
354 endif()
356 if (LINUX OR APPLE)
357   FIND_LIBRARY (DL_LIB dl)
358   FIND_LIBRARY (RESOLV_LIB resolv)
359 endif()
361 if (FREEBSD)
362   FIND_LIBRARY (EXECINFO_LIB execinfo)
363   if (NOT EXECINFO_LIB)
364     message(FATAL_ERROR "You need to install libexecinfo")
365   endif()
366 endif()
368 if (APPLE)
369   find_library(LIBINTL_LIBRARIES NAMES intl libintl)
370   if (LIBINTL_INCLUDE_DIR)
371     include_directories(${LIBINTL_INCLUDE_DIR})
372   endif()
373   find_library(KERBEROS_LIB NAMES gssapi_krb5)
374 endif()
376 #find_package(BISON REQUIRED)
377 #find_package(FLEX REQUIRED)
379 #if (${FLEX_VERSION} VERSION_LESS 2.5.33)
380 #  message(FATAL_ERROR "Flex is too old, found ${FLEX_VERSION} and we need 2.5.33")
381 #endif()
383 include_directories(${HPHP_HOME}/hphp)
385 macro(hphp_link target)
386   # oniguruma must remain first for OS X to work -- see below for a somewhat
387   # dogscience explanation. If you deeply understand this, feel free to fix
388   # properly; in particular, two-level namespaces on OS X should allow us to
389   # say *which* copy of the disputed functions we want, but I don' t know
390   # how to get that to work.
391   #
392   # oniguruma has some of its own implementations of POSIX regex functions,
393   # like regcomp() an regexec(). We use onig everywhere, for both its own
394   # sepcial functions and for the POSIX replacements. This means that the
395   # linker needs to pick the implementions of the POSIX regex functions from
396   # onig, not libc.
397   #
398   # On Linux, that works out fine, since the linker sees onig on the link
399   # line before (implicitly) libc. However, on OS X, despide the manpage for
400   # ld claiming otherwise about indirect dylib dependencies, as soon as we
401   # include one of the libs here that pull in libSystem.B, the linker will
402   # pick the implementations of those functions from libc, not from onig.
403   # And since we've included the onig headers, which have very slightly
404   # different definintions for some of the key data structures, things go
405   # quite awry -- this manifests as infinite loops or crashes when calling
406   # the PHP split() function.
407   #
408   # So make sure to link onig first, so its implementations are picked.
409   target_link_libraries(${target} ${ONIGURUMA_LIBRARIES})
411   if (LIBDL_LIBRARIES)
412     target_link_libraries(${target} ${LIBDL_LIBRARIES})
413   endif ()
415   if (GOOGLE_HEAP_PROFILER_ENABLED OR GOOGLE_CPU_PROFILER_ENABLED)
416     target_link_libraries(${target} ${GOOGLE_PROFILER_LIB})
417   endif()
419   if (JEMALLOC_ENABLED)
420     target_link_libraries(${target} ${JEMALLOC_LIB})
421   endif()
423   if (GOOGLE_HEAP_PROFILER_ENABLED)
424     target_link_libraries(${target} ${GOOGLE_TCMALLOC_FULL_LIB})
425   elseif (GOOGLE_TCMALLOC_ENABLED)
426     target_link_libraries(${target} ${GOOGLE_TCMALLOC_MIN_LIB})
427   endif()
429   target_link_libraries(${target} ${Boost_LIBRARIES})
430   target_link_libraries(${target} ${MYSQL_CLIENT_LIBS})
431   if (ENABLE_ASYNC_MYSQL)
432     target_link_libraries(${target} squangle)
433   endif()
434   target_link_libraries(${target} ${PCRE_LIBRARY})
435   target_link_libraries(${target} ${ICU_DATA_LIBRARIES} ${ICU_I18N_LIBRARIES} ${ICU_LIBRARIES})
436   target_link_libraries(${target} ${LIBEVENT_LIB})
437   target_link_libraries(${target} ${CURL_LIBRARIES})
438   target_link_libraries(${target} ${LIBGLOG_LIBRARY})
439   if (LIBJSONC_LIBRARY)
440     target_link_libraries(${target} ${LIBJSONC_LIBRARY})
441   endif()
443   if (LibXed_LIBRARY)
444     target_link_libraries(${target} ${LibXed_LIBRARY})
445   endif()
447   if (LIBINOTIFY_LIBRARY)
448     target_link_libraries(${target} ${LIBINOTIFY_LIBRARY})
449   endif()
451   if (LIBICONV_LIBRARY)
452     target_link_libraries(${target} ${LIBICONV_LIBRARY})
453   endif()
455   if (LINUX)
456     target_link_libraries(${target} ${CAP_LIB})
457   endif()
459   if (LINUX OR APPLE)
460     target_link_libraries(${target} ${RESOLV_LIB})
461     target_link_libraries(${target} ${DL_LIB})
462   endif()
464   if (FREEBSD)
465     target_link_libraries(${target} ${EXECINFO_LIB})
466   endif()
468   if (APPLE)
469     target_link_libraries(${target} ${LIBINTL_LIBRARIES})
470     target_link_libraries(${target} ${KERBEROS_LIB})
471   endif()
473   if (${LIBPTHREAD_LIBRARIES})
474     target_link_libraries(${target} ${LIBPTHREAD_LIBRARIES})
475   endif()
477   target_link_libraries(${target} ${TBB_LIBRARIES})
478   target_link_libraries(${target} ${OPENSSL_LIBRARIES})
479   target_link_libraries(${target} ${ZLIB_LIBRARIES})
481   target_link_libraries(${target} ${LIBXML2_LIBRARIES})
483   target_link_libraries(${target} ${LBER_LIBRARIES})
485   target_link_libraries(${target} ${CRYPT_LIB})
487   if (LINUX OR FREEBSD)
488     target_link_libraries(${target} ${RT_LIB})
489   endif()
491   if (LIBSQLITE3_FOUND AND LIBSQLITE3_LIBRARY)
492     target_link_libraries(${target} ${LIBSQLITE3_LIBRARY})
493   else()
494     target_link_libraries(${target} sqlite3)
495   endif()
497   if (DOUBLE_CONVERSION_LIBRARY)
498     target_link_libraries(${target} ${DOUBLE_CONVERSION_LIBRARY})
499   else()
500     target_link_libraries(${target} double-conversion)
501   endif()
503   if (LZ4_LIBRARY)
504     target_link_libraries(${target} ${LZ4_LIBRARY})
505   else()
506     target_link_libraries(${target} lz4)
507   endif()
509   if (LIBZIP_LIBRARY)
510     target_link_libraries(${target} ${LIBZIP_LIBRARY})
511   else()
512     target_link_libraries(${target} zip_static)
513   endif()
515   if (PCRE_LIBRARY)
516     target_link_libraries(${target} ${PCRE_LIBRARY})
517   else()
518     target_link_libraries(${target} pcre)
519   endif()
521   if (LIBFASTLZ_LIBRARY)
522     target_link_libraries(${target} ${LIBFASTLZ_LIBRARY})
523   else()
524     target_link_libraries(${target} fastlz)
525   endif()
527   target_link_libraries(${target} timelib)
528   target_link_libraries(${target} folly)
529   target_link_libraries(${target} wangle)
531   if (ENABLE_MCROUTER)
532     target_link_libraries(${target} mcrouter)
533   endif()
535   target_link_libraries(${target} afdt)
536   target_link_libraries(${target} mbfl)
538   if (EDITLINE_LIBRARIES)
539     target_link_libraries(${target} ${EDITLINE_LIBRARIES})
540   elseif (READLINE_LIBRARY)
541     target_link_libraries(${target} ${READLINE_LIBRARY})
542   endif()
544   target_link_libraries(${target} ${LIBDWARF_LIBRARIES})
545   target_link_libraries(${target} ${LIBELF_LIBRARIES})
547   if (LIBLLVM_LIBRARY)
548     target_link_libraries(${target} ${LIBLLVM_LIBRARY})
549   endif()
551   if (LINUX)
552     target_link_libraries(${target} -Wl,--wrap=pthread_create -Wl,--wrap=pthread_exit -Wl,--wrap=pthread_join)
553   endif()
554 endmacro()