1 include(ExternalProject)
4 get_target_property(BOOST_INCLUDE_DIR boost INTERFACE_INCLUDE_DIRECTORIES)
5 get_target_property(BOOST_LIBRARIES boost INTERFACE_LINK_LIBRARIES)
6 list(GET BOOST_LIBRARIES 0 FIRST_LIB)
7 if("${FIRST_LIB}" MATCHES ".+/${CMAKE_STATIC_LIBRARY_PREFIX}boost_.+${CMAKE_STATIC_LIBRARY_SUFFIX}$")
8 set(Boost_USE_STATIC_LIBS ON)
10 set(Boost_USE_STATIC_LIBS OFF)
12 get_filename_component(BOOST_LIBRARY_DIR "${FIRST_LIB}" DIRECTORY)
13 get_target_property(ZSTD_INCLUDE_DIR zstd INTERFACE_INCLUDE_DIRECTORIES)
14 get_target_property(ZSTD_LIBRARY zstd INTERFACE_LINK_LIBRARIES)
15 get_target_property(JEMALLOC_INCLUDE_DIR jemalloc INTERFACE_INCLUDE_DIRECTORIES)
17 find_package(FLEX REQUIRED)
18 # Thrift uses `%code`, which isn't in 2.x
19 find_package(BISON 3.0 REQUIRED)
24 SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/
27 "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}"
28 -DCMAKE_MODULE_PATH=${CMAKE_SOURCE_DIR}/CMake
29 -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
30 -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
32 -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
33 -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
34 -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT}
35 -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}
37 -DFLEX_EXECUTABLE=${FLEX_EXECUTABLE}
38 -DBISON_EXECUTABLE=${BISON_EXECUTABLE}
40 -DOPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR}
41 -DOPENSSL_CRYPTO_LIBRARY=${OPENSSL_CRYPTO_LIBRARY}
42 -DBoost_NO_SYSTEM_PATHS=ON
43 -DBoost_NO_BOOST_CMAKE=ON
44 -DBoost_USE_STATIC_LIBS=${Boost_USE_STATIC_LIBS}
45 -DBoost_INCLUDE_DIR=${BOOST_INCLUDE_DIR}
46 "-DBOOST_LIBRARYDIR=${BOOST_LIBRARY_DIR}"
47 "-DLIBGLOG_INCLUDE_DIR=${GLOG_INCLUDE_DIR}"
48 "-DLIBGLOG_LIBRARY=${GLOG_LIBRARY}"
49 "-DZSTD_INCLUDE_DIRS=${ZSTD_INCLUDE_DIR}"
50 "-DZSTD_LIBRARIES=${ZSTD_LIBRARY}"
52 "-Dfizz_DIR=${FIZZ_INSTALL_DIR}/lib/cmake/fizz"
53 "-Dfmt_DIR=${fmt_DIR}"
54 "-Dfolly_DIR=${FOLLY_INSTALL_DIR}/lib/cmake/folly"
55 "-Dwangle_DIR=${WANGLE_INSTALL_DIR}/lib/cmake/wangle"
57 "-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}"
58 "-DCMAKE_CXX_FLAGS=-I${JEMALLOC_INCLUDE_DIR} ${CMAKE_CXX_FLAGS}"
60 ExternalProject_Get_property(bundled_thrift INSTALL_DIR)
71 add_dependencies(bundled_thrift ${THRIFT_DEPS})
72 add_library(thrift INTERFACE)
73 add_dependencies(thrift bundled_thrift)
74 target_include_directories(thrift INTERFACE "${INSTALL_DIR}/include")
75 target_link_libraries(thrift INTERFACE ${THRIFT_DEPS} ${OPENSSL_LIBRARIES})
76 set(THRIFT_INSTALL_DIR "${INSTALL_DIR}" PARENT_SCOPE)
78 # ----- Export a single 'thrift' library target -----
80 # Usage: thrift_lib NAME [DEP1 [DEP2...]]
81 macro(thrift_lib NAME)
84 list(APPEND DEPENDENCIES "thrift_lib_${DEP}")
86 add_library("thrift_lib_${NAME}" STATIC IMPORTED)
87 set_target_properties(
91 "${INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}"
95 # On newer versions of CMake, we can use `target_link_libraries()`, but this isn't supported
96 # on `IMPORTED` targets in the oldest versions we currently support.
97 set_target_properties(
100 INTERFACE_LINK_LIBRARIES
105 target_link_libraries(thrift INTERFACE "thrift_lib_${NAME}")
108 thrift_lib(concurrency)
109 thrift_lib(rpcmetadata)
110 thrift_lib(thrift-core)
111 thrift_lib(thriftmetadata)
112 thrift_lib(thriftannotation)
113 thrift_lib(thrifttype)
114 thrift_lib(thrifttyperep thriftannotation)
115 thrift_lib(thriftanyrep thriftannotation thrifttype)
117 thrift_lib(transport concurrency thrift-core rpcmetadata)
118 thrift_lib(async concurrency transport)
119 thrift_lib(thriftprotocol thrift-core)
120 thrift_lib(thriftfrozen2 thriftmetadata thriftprotocol)
121 thrift_lib(thriftcpp2 rpcmetadata thriftmetadata thriftannotation thriftanyrep thrifttyperep thriftfrozen2 thriftprotocol transport async)
123 # ----- Export the thrift compiler as a target -----
125 add_executable(thrift1 IMPORTED GLOBAL)
126 add_dependencies(thrift1 INTERFACE bundled_thrift)
127 set_target_properties(
130 IMPORTED_LOCATION "${INSTALL_DIR}/bin/thrift1${CMAKE_EXECUTABLE_SUFFIX}"