Generate fresh type parameters away from others in same method body
[hiphop-php.git] / CMake / HPHPFindLibs.cmake
blobd5cd86063765dca3d898a356ed2d59b9ed378c86
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 # libzip
142 find_package(LibZip)
143 if (LIBZIP_INCLUDE_DIR_ZIP AND LIBZIP_INCLUDE_DIR_ZIPCONF)
144   if (LIBZIP_VERSION VERSION_LESS "0.11")
145     unset(LIBZIP_FOUND CACHE)
146     unset(LIBZIP_LIBRARY CACHE)
147     unset(LIBZIP_INCLUDE_DIR_ZIP CACHE)
148     unset(LIBZIP_INCLUDE_DIR_ZIPCONF CACHE)
149     message(STATUS "libzip is too old, found ${LIBZIP_VERSION} and we need 0.11+, using third-party bundled libzip")
150   else ()
151     include_directories(${LIBZIP_INCLUDE_DIR_ZIP} ${LIBZIP_INCLUDE_DIR_ZIPCONF})
152     message(STATUS "Found libzip: ${LIBZIP_LIBRARY} ${LIBZIP_VERSION}")
153   endif ()
154 else ()
155   message(STATUS "Using third-party bundled libzip")
156 endif()
158 # ICU
159 find_package(ICU REQUIRED)
160 if (ICU_FOUND)
161   if (ICU_VERSION VERSION_LESS "4.2")
162     unset(ICU_FOUND CACHE)
163     unset(ICU_INCLUDE_DIRS CACHE)
164     unset(ICU_LIBRARIES CACHE)
165     message(FATAL_ERROR "ICU is too old, found ${ICU_VERSION} and we need 4.2")
166   endif ()
167   include_directories(${ICU_INCLUDE_DIRS})
168   if (ICU_STATIC)
169     add_definitions("-DU_EXPORT=")
170     add_definitions("-DU_IMPORT=")
171   endif()
172   # Everything is either in the `icu61` namespace or `icu` namespace, depending
173   # on another definition. There's an implicit `using namespace WHATEVER;` in
174   # ICU4c < 61.1, but now that's opt-in rather than opt-out.
175   add_definitions("-DU_USING_ICU_NAMESPACE=1")
176 endif (ICU_FOUND)
178 # jemalloc/tmalloc and profiler
179 if (USE_GOOGLE_HEAP_PROFILER OR USE_GOOGLE_CPU_PROFILER)
180   FIND_LIBRARY(GOOGLE_PROFILER_LIB profiler)
181   FIND_PATH(GOOGLE_PROFILER_INCLUDE_DIR NAMES google/profiler.h)
182   if (GOOGLE_PROFILER_INCLUDE_DIR)
183     include_directories(${GOOGLE_PROFILER_INCLUDE_DIR})
184   endif()
185   if (GOOGLE_PROFILER_LIB)
186     message(STATUS "Found Google profiler: ${GOOGLE_PROFILER_LIB}")
187     if (USE_GOOGLE_CPU_PROFILER)
188       set(GOOGLE_CPU_PROFILER_ENABLED 1)
189     endif()
190   else()
191     message(STATUS "Can't find Google profiler")
192   endif()
193 endif()
195 if (USE_GOOGLE_HEAP_PROFILER AND GOOGLE_PROFILER_LIB)
196   FIND_LIBRARY(GOOGLE_TCMALLOC_FULL_LIB tcmalloc)
197   if (GOOGLE_TCMALLOC_FULL_LIB)
198     message(STATUS "Found full tcmalloc: ${GOOGLE_TCMALLOC_FULL_LIB}")
199     set(GOOGLE_HEAP_PROFILER_ENABLED 1)
200     set(GOOGLE_TCMALLOC_ENABLED 1)
201   else()
202     message(STATUS "Can't find full tcmalloc - heap profiling is disabled")
203   endif()
204 endif()
206 if (USE_JEMALLOC AND NOT GOOGLE_TCMALLOC_ENABLED)
207   FIND_LIBRARY(JEMALLOC_LIB NAMES jemalloc)
208   FIND_PATH(JEMALLOC_INCLUDE_DIR NAMES jemalloc/jemalloc.h)
210   if (JEMALLOC_INCLUDE_DIR AND JEMALLOC_LIB)
211     include_directories(${JEMALLOC_INCLUDE_DIR})
213     set (CMAKE_REQUIRED_INCLUDES ${JEMALLOC_INCLUDE_DIR})
214     INCLUDE(CheckCXXSourceCompiles)
215     CHECK_CXX_SOURCE_COMPILES("
216 #include <jemalloc/jemalloc.h>
218 #define JEMALLOC_VERSION_NUMERIC ((JEMALLOC_VERSION_MAJOR << 24) | (JEMALLOC_VERSION_MINOR << 16) | (JEMALLOC_VERSION_BUGFIX << 8) | JEMALLOC_VERSION_NDEV)
220 #if JEMALLOC_VERSION_NUMERIC < 0x03050100
221 # error jemalloc version >= 3.5.1 required
222 #endif
224 int main(void) { return 0; }" JEMALLOC_VERSION_MINIMUM)
225     set (CMAKE_REQUIRED_INCLUDES)
227     if (JEMALLOC_VERSION_MINIMUM)
228       message(STATUS "Found jemalloc: ${JEMALLOC_LIB}")
229       set(JEMALLOC_ENABLED 1)
230     else()
231       message(STATUS "Found jemalloc, but it was too old")
232     endif()
233   endif()
234 endif()
236 if (USE_TCMALLOC AND NOT JEMALLOC_ENABLED AND NOT GOOGLE_TCMALLOC_ENABLED)
237   FIND_LIBRARY(GOOGLE_TCMALLOC_MIN_LIB tcmalloc_minimal)
238   if (GOOGLE_TCMALLOC_MIN_LIB)
239     message(STATUS "Found minimal tcmalloc: ${GOOGLE_TCMALLOC_MIN_LIB}")
240     set(GOOGLE_TCMALLOC_ENABLED 1)
241   else()
242     message(STATUS "Can't find minimal tcmalloc")
243   endif()
244 endif()
246 if (JEMALLOC_ENABLED)
247   add_definitions(-DUSE_JEMALLOC=1)
248 else()
249   add_definitions(-DNO_JEMALLOC=1)
250 endif()
251 if (GOOGLE_TCMALLOC_ENABLED)
252   add_definitions(-DGOOGLE_TCMALLOC=1)
253 else()
254   add_definitions(-DNO_TCMALLOC=1)
255 endif()
256 if (GOOGLE_HEAP_PROFILER_ENABLED)
257   add_definitions(-DGOOGLE_HEAP_PROFILER=1)
258 endif()
259 if (GOOGLE_CPU_PROFILER_ENABLED)
260   add_definitions(-DGOOGLE_CPU_PROFILER=1)
261 endif()
263 # HHProf
264 if (JEMALLOC_ENABLED AND ENABLE_HHPROF)
265   add_definitions(-DENABLE_HHPROF=1)
266 endif()
268 # tbb libs
269 find_package(TBB REQUIRED)
270 if (${TBB_INTERFACE_VERSION} LESS 5005)
271   unset(TBB_FOUND CACHE)
272   unset(TBB_INCLUDE_DIRS CACHE)
273   unset(TBB_LIBRARIES CACHE)
274   message(FATAL_ERROR "TBB is too old, please install at least 3.0(5005), preferably 4.0(6000) or higher")
275 endif()
276 include_directories(${TBB_INCLUDE_DIRS})
277 link_directories(${TBB_LIBRARY_DIRS})
279 # OpenSSL libs
280 find_package(OpenSSL REQUIRED)
281 include_directories(${OPENSSL_INCLUDE_DIR})
283 # LibreSSL explicitly refuses to support RAND_egd()
284 SET(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
285 SET(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_LIBRARIES})
286 INCLUDE(CheckCXXSourceCompiles)
287 CHECK_CXX_SOURCE_COMPILES("#include <openssl/rand.h>
288 int main() {
289   return RAND_egd(\"/dev/null\");
290 }" OPENSSL_HAVE_RAND_EGD)
291 if (NOT OPENSSL_HAVE_RAND_EGD)
292   add_definitions("-DOPENSSL_NO_RAND_EGD")
293 endif()
294 SET(CMAKE_REQUIRED_INCLUDES)
295 SET(CMAKE_REQUIRED_LIBRARIES)
298 # ZLIB
299 find_package(ZLIB REQUIRED)
300 include_directories(${ZLIB_INCLUDE_DIR})
302 # oniguruma
303 find_package(ONIGURUMA REQUIRED)
304 include_directories(${ONIGURUMA_INCLUDE_DIRS})
305 if (ONIGURUMA_STATIC)
306   add_definitions("-DONIG_EXTERN=extern")
307 endif()
309 # libpthreads
310 find_package(PThread REQUIRED)
311 include_directories(${LIBPTHREAD_INCLUDE_DIRS})
312 if (LIBPTHREAD_STATIC)
313   add_definitions("-DPTW32_STATIC_LIB")
314 endif()
316 # Either Readline or Editline (for hphpd)
317 find_package(Readline)
318 find_package(Editline)
319 if (EDITLINE_INCLUDE_DIRS)
320   add_definitions("-DUSE_EDITLINE")
321   include_directories(${EDITLINE_INCLUDE_DIRS})
322 elseif (READLINE_INCLUDE_DIR)
323   if (READLINE_STATIC)
324     add_definitions("-DREADLINE_STATIC")
325   endif()
326   include_directories(${READLINE_INCLUDE_DIR})
327 else()
328   message(FATAL_ERROR "Could not find Readline or Editline")
329 endif()
331 if (NOT WINDOWS)
332   find_package(LibDwarf REQUIRED)
333   include_directories(${LIBDWARF_INCLUDE_DIRS})
334   if (LIBDWARF_CONST_NAME)
335     add_definitions("-DLIBDWARF_CONST_NAME")
336   endif()
337   if (LIBDWARF_USE_INIT_C)
338     add_definitions("-DLIBDWARF_USE_INIT_C")
339   endif()
341   find_package(LibElf REQUIRED)
342   include_directories(${LIBELF_INCLUDE_DIRS})
343   if (ELF_GETSHDRSTRNDX)
344     add_definitions("-DHAVE_ELF_GETSHDRSTRNDX")
345   endif()
346 endif()
348 FIND_LIBRARY(CRYPT_LIB NAMES xcrypt crypt crypto)
349 if (LINUX OR FREEBSD)
350   FIND_LIBRARY (RT_LIB rt)
351 endif()
353 if (LINUX)
354   FIND_LIBRARY (CAP_LIB cap)
356   if (NOT CAP_LIB)
357     message(FATAL_ERROR "You need to install libcap")
358   endif()
359 endif()
361 if (LINUX OR APPLE)
362   FIND_LIBRARY (DL_LIB dl)
363   FIND_LIBRARY (RESOLV_LIB resolv)
364 endif()
366 if (FREEBSD)
367   FIND_LIBRARY (EXECINFO_LIB execinfo)
368   if (NOT EXECINFO_LIB)
369     message(FATAL_ERROR "You need to install libexecinfo")
370   endif()
371 endif()
373 if (APPLE)
374   find_library(KERBEROS_LIB NAMES gssapi_krb5)
376   # This is required by Homebrew's libc. See
377   # https://github.com/facebook/hhvm/pull/5728#issuecomment-124290712
378   # for more info.
379   find_package(Libpam)
380   if (PAM_INCLUDE_PATH)
381     include_directories(${PAM_INCLUDE_PATH})
382   endif()
383 endif()
385 #find_package(BISON REQUIRED)
386 #find_package(FLEX REQUIRED)
388 #if (${FLEX_VERSION} VERSION_LESS 2.5.33)
389 #  message(FATAL_ERROR "Flex is too old, found ${FLEX_VERSION} and we need 2.5.33")
390 #endif()
392 include_directories(${HPHP_HOME}/hphp)
394 macro(hphp_link target)
395   # oniguruma must remain first for OS X to work -- see below for a somewhat
396   # dogscience explanation. If you deeply understand this, feel free to fix
397   # properly; in particular, two-level namespaces on OS X should allow us to
398   # say *which* copy of the disputed functions we want, but I don' t know
399   # how to get that to work.
400   #
401   # oniguruma has some of its own implementations of POSIX regex functions,
402   # like regcomp() an regexec(). We use onig everywhere, for both its own
403   # sepcial functions and for the POSIX replacements. This means that the
404   # linker needs to pick the implementions of the POSIX regex functions from
405   # onig, not libc.
406   #
407   # On Linux, that works out fine, since the linker sees onig on the link
408   # line before (implicitly) libc. However, on OS X, despide the manpage for
409   # ld claiming otherwise about indirect dylib dependencies, as soon as we
410   # include one of the libs here that pull in libSystem.B, the linker will
411   # pick the implementations of those functions from libc, not from onig.
412   # And since we've included the onig headers, which have very slightly
413   # different definintions for some of the key data structures, things go
414   # quite awry -- this manifests as infinite loops or crashes when calling
415   # the PHP split() function.
416   #
417   # So make sure to link onig first, so its implementations are picked.
418   target_link_libraries(${target} ${ONIGURUMA_LIBRARIES})
420   if (LIBDL_LIBRARIES)
421     target_link_libraries(${target} ${LIBDL_LIBRARIES})
422   endif ()
424   if (GOOGLE_HEAP_PROFILER_ENABLED OR GOOGLE_CPU_PROFILER_ENABLED)
425     target_link_libraries(${target} ${GOOGLE_PROFILER_LIB})
426   endif()
428   if (JEMALLOC_ENABLED)
429     target_link_libraries(${target} ${JEMALLOC_LIB})
430   endif()
432   if (GOOGLE_HEAP_PROFILER_ENABLED)
433     target_link_libraries(${target} ${GOOGLE_TCMALLOC_FULL_LIB})
434   elseif (GOOGLE_TCMALLOC_ENABLED)
435     target_link_libraries(${target} ${GOOGLE_TCMALLOC_MIN_LIB})
436   endif()
438   add_dependencies(${target} boostMaybeBuild)
439   target_link_libraries(${target} boost)
440   target_link_libraries(${target} ${MYSQL_CLIENT_LIBS})
441   if (ENABLE_ASYNC_MYSQL)
442     target_link_libraries(${target} squangle)
443   endif()
444   target_link_libraries(${target} ${PCRE_LIBRARY})
445   target_link_libraries(${target} ${ICU_DATA_LIBRARIES} ${ICU_I18N_LIBRARIES} ${ICU_LIBRARIES})
446   target_link_libraries(${target} ${LIBEVENT_LIB})
447   target_link_libraries(${target} ${CURL_LIBRARIES})
448   target_link_libraries(${target} ${LIBGLOG_LIBRARY})
449   if (LIBJSONC_LIBRARY)
450     target_link_libraries(${target} ${LIBJSONC_LIBRARY})
451   endif()
453   if (LIBINOTIFY_LIBRARY)
454     target_link_libraries(${target} ${LIBINOTIFY_LIBRARY})
455   endif()
457   if (LINUX)
458     target_link_libraries(${target} ${CAP_LIB})
459   endif()
461   if (LINUX OR APPLE)
462     target_link_libraries(${target} ${RESOLV_LIB})
463     target_link_libraries(${target} ${DL_LIB})
464   endif()
466   if (FREEBSD)
467     target_link_libraries(${target} ${EXECINFO_LIB})
468   endif()
470   if (APPLE)
471     target_link_libraries(${target} ${LIBINTL_LIBRARIES})
472     target_link_libraries(${target} ${KERBEROS_LIB})
474     if (PAM_LIBRARY)
475       target_link_libraries(${target} ${PAM_LIBRARY})
476     endif()
477   endif()
479   if (LIBPTHREAD_LIBRARIES)
480     target_link_libraries(${target} ${LIBPTHREAD_LIBRARIES})
481   endif()
483   target_link_libraries(${target} ${TBB_LIBRARIES})
484   target_link_libraries(${target} ${OPENSSL_LIBRARIES})
485   target_link_libraries(${target} ${ZLIB_LIBRARIES})
487   target_link_libraries(${target} ${LIBXML2_LIBRARIES})
489   target_link_libraries(${target} ${LBER_LIBRARIES})
491   if (CRYPT_LIB)
492     target_link_libraries(${target} ${CRYPT_LIB})
493   endif()
495   if (LINUX OR FREEBSD)
496     target_link_libraries(${target} ${RT_LIB})
497   endif()
499   if (LIBSQLITE3_FOUND AND LIBSQLITE3_LIBRARY)
500     target_link_libraries(${target} ${LIBSQLITE3_LIBRARY})
501   else()
502     target_link_libraries(${target} sqlite3)
503   endif()
505   if (DOUBLE_CONVERSION_FOUND)
506     target_link_libraries(${target} ${DOUBLE_CONVERSION_LIBRARY})
507   else()
508     target_link_libraries(${target} double-conversion)
509   endif()
511   if (LZ4_FOUND)
512     target_link_libraries(${target} ${LZ4_LIBRARY})
513   else()
514     target_link_libraries(${target} lz4)
515   endif()
516   # The syntax used for these warnings is unparsable by Apple's Clang
517   add_definitions("-DLZ4_DISABLE_DEPRECATE_WARNINGS=1")
519   if (LIBZIP_LIBRARY)
520     target_link_libraries(${target} ${LIBZIP_LIBRARY})
521   else()
522     target_link_libraries(${target} zip_static)
523   endif()
525   if (PCRE_LIBRARY)
526     target_link_libraries(${target} ${PCRE_LIBRARY})
527   else()
528     target_link_libraries(${target} pcre)
529   endif()
531   if (LIBFASTLZ_LIBRARY)
532     target_link_libraries(${target} ${LIBFASTLZ_LIBRARY})
533   else()
534     target_link_libraries(${target} fastlz)
535   endif()
537   target_link_libraries(${target} timelib)
538   target_link_libraries(${target} folly)
539   target_link_libraries(${target} wangle)
540   target_link_libraries(${target} brotli_enc)
541   target_link_libraries(${target} brotli_dec)
543   if (ENABLE_MCROUTER)
544     target_link_libraries(${target} mcrouter)
545   endif()
547   if (NOT MSVC)
548     target_link_libraries(${target} afdt)
549   endif()
550   target_link_libraries(${target} mbfl)
552   if (EDITLINE_LIBRARIES)
553     target_link_libraries(${target} ${EDITLINE_LIBRARIES})
554   elseif (READLINE_LIBRARY)
555     target_link_libraries(${target} ${READLINE_LIBRARY})
556   endif()
558   if (NOT WINDOWS)
559     target_link_libraries(${target} ${LIBDWARF_LIBRARIES})
560     target_link_libraries(${target} ${LIBELF_LIBRARIES})
561   endif()
563   if (LINUX)
564     target_link_libraries(${target})
565   endif()
567   if (MSVC)
568     target_link_libraries(${target} dbghelp.lib dnsapi.lib)
569   endif()
571 # Check whether atomic operations require -latomic or not
572 # See https://github.com/facebook/hhvm/issues/5217
573   include(CheckCXXSourceCompiles)
574   set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
575   set(CMAKE_REQUIRED_FLAGS "-std=c++1y")
576   CHECK_CXX_SOURCE_COMPILES("
577 #include <atomic>
578 #include <iostream>
579 #include <stdint.h>
580 int main() {
581     struct Test { int64_t val1; int64_t val2; };
582     std::atomic<Test> s;
583     // Do this to stop modern compilers from optimizing away the libatomic
584     // calls in release builds, making this test always pass in release builds,
585     // and incorrectly think that HHVM doesn't need linking against libatomic.
586     bool (std::atomic<Test>::* volatile x)(void) const =
587       &std::atomic<Test>::is_lock_free;
588     std::cout << (s.*x)() << std::endl;
590   " NOT_REQUIRE_ATOMIC_LINKER_FLAG)
592   if(NOT "${NOT_REQUIRE_ATOMIC_LINKER_FLAG}")
593       message(STATUS "-latomic is required to link hhvm")
594       find_library(ATOMIC_LIBRARY NAMES atomic libatomic.so.1)
595       target_link_libraries(${target} ${ATOMIC_LIBRARY})
596   endif()
597   set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
599   if (ENABLE_XED)
600     if (LibXed_FOUND)
601         target_link_libraries(${target} ${LibXed_LIBRARY})
602     else()
603         target_link_libraries(${target} xed)
604     endif()
605   endif()
606 endmacro()