123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- include(CheckCXXSourceCompiles)
- include(CheckIncludeFileCXX)
- include(CheckFunctionExists)
- find_package(Boost 1.51.0 MODULE
- COMPONENTS
- context
- chrono
- date_time
- filesystem
- program_options
- regex
- system
- thread
- REQUIRED
- )
- list(APPEND FOLLY_LINK_LIBRARIES ${Boost_LIBRARIES})
- list(APPEND FOLLY_INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIRS})
- find_package(DoubleConversion MODULE REQUIRED)
- list(APPEND FOLLY_LINK_LIBRARIES ${DOUBLE_CONVERSION_LIBRARY})
- list(APPEND FOLLY_INCLUDE_DIRECTORIES ${DOUBLE_CONVERSION_INCLUDE_DIR})
- set(FOLLY_HAVE_LIBGFLAGS OFF)
- find_package(GFlags CONFIG QUIET)
- if (gflags_FOUND)
- message(STATUS "Found gflags from package config")
- set(FOLLY_HAVE_LIBGFLAGS ON)
- if (TARGET gflags-shared)
- list(APPEND FOLLY_SHINY_DEPENDENCIES gflags-shared)
- elseif (TARGET gflags)
- list(APPEND FOLLY_SHINY_DEPENDENCIES gflags)
- else()
- message(FATAL_ERROR "Unable to determine the target name for the GFlags package.")
- endif()
- list(APPEND CMAKE_REQUIRED_LIBRARIES ${GFLAGS_LIBRARIES})
- list(APPEND CMAKE_REQUIRED_INCLUDES ${GFLAGS_INCLUDE_DIR})
- else()
- find_package(GFlags MODULE)
- set(FOLLY_HAVE_LIBGFLAGS ${LIBGFLAGS_FOUND})
- list(APPEND FOLLY_LINK_LIBRARIES ${LIBGFLAGS_LIBRARY})
- list(APPEND FOLLY_INCLUDE_DIRECTORIES ${LIBGFLAGS_INCLUDE_DIR})
- list(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBGFLAGS_LIBRARY})
- list(APPEND CMAKE_REQUIRED_INCLUDES ${LIBGFLAGS_INCLUDE_DIR})
- endif()
- set(FOLLY_HAVE_LIBGLOG OFF)
- find_package(glog CONFIG QUIET)
- if (glog_FOUND)
- message(STATUS "Found glog from package config")
- set(FOLLY_HAVE_LIBGLOG ON)
- list(APPEND FOLLY_SHINY_DEPENDENCIES glog::glog)
- else()
- find_package(GLog MODULE)
- set(FOLLY_HAVE_LIBGLOG ${LIBGLOG_FOUND})
- list(APPEND FOLLY_LINK_LIBRARIES ${LIBGLOG_LIBRARY})
- list(APPEND FOLLY_INCLUDE_DIRECTORIES ${LIBGLOG_INCLUDE_DIR})
- endif()
- find_package(Libevent CONFIG QUIET)
- if(TARGET event)
- message(STATUS "Found libevent from package config")
- list(APPEND FOLLY_SHINY_DEPENDENCIES event)
- else()
- find_package(LibEvent MODULE REQUIRED)
- list(APPEND FOLLY_LINK_LIBRARIES ${LIBEVENT_LIB})
- list(APPEND FOLLY_INCLUDE_DIRECTORIES ${LIBEVENT_INCLUDE_DIR})
- endif()
- find_package(OpenSSL MODULE REQUIRED)
- list(APPEND FOLLY_LINK_LIBRARIES ${OPENSSL_LIBRARIES})
- list(APPEND FOLLY_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR})
- list(APPEND CMAKE_REQUIRED_LIBRARIES ${OPENSSL_LIBRARIES})
- list(APPEND CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
- check_function_exists(ASN1_TIME_diff FOLLY_HAVE_OPENSSL_ASN1_TIME_DIFF)
- find_package(ZLIB MODULE)
- set(FOLLY_HAVE_LIBZ ${ZLIB_FOUND})
- if (ZLIB_FOUND)
- list(APPEND FOLLY_INCLUDE_DIRECTORIES ${ZLIB_INCLUDE_DIRS})
- list(APPEND FOLLY_LINK_LIBRARIES ${ZLIB_LIBRARIES})
- endif()
- find_package(BZip2 MODULE)
- set(FOLLY_HAVE_LIBBZ2 ${BZIP2_FOUND})
- if (BZIP2_FOUND)
- list(APPEND FOLLY_INCLUDE_DIRECTORIES ${BZIP2_INCLUDE_DIRS})
- list(APPEND FOLLY_LINK_LIBRARIES ${BZIP2_LIBRARIES})
- endif()
- find_package(LibLZMA MODULE)
- set(FOLLY_HAVE_LIBLZMA ${LIBLZMA_FOUND})
- if (LIBLZMA_FOUND)
- list(APPEND FOLLY_INCLUDE_DIRECTORIES ${LIBLZMA_INCLUDE_DIRS})
- list(APPEND FOLLY_LINK_LIBRARIES ${LIBLZMA_LIBRARIES})
- endif()
- find_package(LZ4 MODULE)
- set(FOLLY_HAVE_LIBLZ4 ${LZ4_FOUND})
- if (LZ4_FOUND)
- list(APPEND FOLLY_INCLUDE_DIRECTORIES ${LZ4_INCLUDE_DIR})
- list(APPEND FOLLY_LINK_LIBRARIES ${LZ4_LIBRARY})
- endif()
- find_package(Zstd MODULE)
- set(FOLLY_HAVE_LIBZSTD ${ZSTD_FOUND})
- if(ZSTD_FOUND)
- list(APPEND FOLLY_INCLUDE_DIRECTORIES ${ZSTD_INCLUDE_DIR})
- list(APPEND FOLLY_LINK_LIBRARIES ${ZSTD_LIBRARY})
- endif()
- find_package(Snappy MODULE)
- set(FOLLY_HAVE_LIBSNAPPY ${SNAPPY_FOUND})
- if (SNAPPY_FOUND)
- list(APPEND FOLLY_INCLUDE_DIRECTORIES ${SNAPPY_INCLUDE_DIR})
- list(APPEND FOLLY_LINK_LIBRARIES ${SNAPPY_LIBRARY})
- endif()
- find_package(LibDwarf)
- list(APPEND FOLLY_LINK_LIBRARIES ${LIBDWARF_LIBRARIES})
- list(APPEND FOLLY_INCLUDE_DIRECTORIES ${LIBDWARF_INCLUDE_DIRS})
- find_package(Libiberty)
- list(APPEND FOLLY_LINK_LIBRARIES ${LIBIBERTY_LIBRARIES})
- list(APPEND FOLLY_INCLUDE_DIRECTORIES ${LIBIBERTY_INCLUDE_DIRS})
- find_package(LibAIO)
- list(APPEND FOLLY_LINK_LIBRARIES ${LIBAIO_LIBRARIES})
- list(APPEND FOLLY_INCLUDE_DIRECTORIES ${LIBAIO_INCLUDE_DIRS})
- list(APPEND FOLLY_LINK_LIBRARIES ${CMAKE_DL_LIBS})
- list(APPEND CMAKE_REQUIRED_LIBRARIES ${CMAKE_DL_LIBS})
- set(FOLLY_USE_SYMBOLIZER OFF)
- CHECK_INCLUDE_FILE_CXX(elf.h FOLLY_HAVE_ELF_H)
- find_library(UNWIND_LIBRARIES NAMES unwind)
- if (UNWIND_LIBRARIES)
- list(APPEND FOLLY_LINK_LIBRARIES ${UNWIND_LIBRARIES})
- list(APPEND CMAKE_REQUIRED_LIBRARIES ${UNWIND_LIBRARIES})
- endif()
- check_function_exists(backtrace FOLLY_HAVE_BACKTRACE)
- if (FOLLY_HAVE_ELF_H AND FOLLY_HAVE_BACKTRACE AND LIBDWARF_FOUND)
- set(FOLLY_USE_SYMBOLIZER ON)
- endif()
- message(STATUS "Setting FOLLY_USE_SYMBOLIZER: ${FOLLY_USE_SYMBOLIZER}")
- # Using clang with libstdc++ requires explicitly linking against libatomic
- check_cxx_source_compiles("
- #include <atomic>
- int main(int argc, char** argv) {
- struct Test { int val; };
- std::atomic<Test> s;
- return static_cast<int>(s.is_lock_free());
- }"
- FOLLY_CPP_ATOMIC_BUILTIN
- )
- if(NOT FOLLY_CPP_ATOMIC_BUILTIN)
- list(APPEND CMAKE_REQUIRED_LIBRARIES atomic)
- list(APPEND FOLLY_LINK_LIBRARIES atomic)
- check_cxx_source_compiles("
- #include <atomic>
- int main(int argc, char** argv) {
- struct Test { int val; };
- std::atomic<Test> s2;
- return static_cast<int>(s2.is_lock_free());
- }"
- FOLLY_CPP_ATOMIC_WITH_LIBATOMIC
- )
- if (NOT FOLLY_CPP_ATOMIC_WITH_LIBATOMIC)
- message(
- FATAL_ERROR "unable to link C++ std::atomic code: you may need \
- to install GNU libatomic"
- )
- endif()
- endif()
- option(
- FOLLY_ASAN_ENABLED
- "Build folly with Address Sanitizer enabled."
- OFF
- )
- if (FOLLY_ASAN_ENABLED)
- if ("${CMAKE_CXX_COMPILER_ID}" MATCHES GNU)
- set(FOLLY_ASAN_ENABLED ON)
- set(FOLLY_ASAN_FLAGS -fsanitize=address,undefined)
- list(APPEND FOLLY_CXX_FLAGS ${FOLLY_ASAN_FLAGS})
- # All of the functions in folly/detail/Sse.cpp are intended to be compiled
- # with ASAN disabled. They are marked with attributes to disable the
- # sanitizer, but even so, gcc fails to compile them for some reason when
- # sanitization is enabled on the compile line.
- set_source_files_properties(
- "${CMAKE_SOURCE_DIR}/folly/detail/Sse.cpp"
- PROPERTIES COMPILE_FLAGS -fno-sanitize=address,undefined
- )
- elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES Clang)
- set(FOLLY_ASAN_ENABLED ON)
- set(
- FOLLY_ASAN_FLAGS
- -fno-common
- -fsanitize=address,undefined,integer,nullability
- -fno-sanitize=unsigned-integer-overflow
- )
- list(APPEND FOLLY_CXX_FLAGS ${FOLLY_ASAN_FLAGS})
- endif()
- endif()
- add_library(folly_deps INTERFACE)
- list(REMOVE_DUPLICATES FOLLY_INCLUDE_DIRECTORIES)
- target_include_directories(folly_deps INTERFACE ${FOLLY_INCLUDE_DIRECTORIES})
- target_link_libraries(folly_deps INTERFACE
- ${FOLLY_LINK_LIBRARIES}
- ${FOLLY_SHINY_DEPENDENCIES}
- ${FOLLY_ASAN_FLAGS}
- )
|