### This file is copyed from pulsar, and deleted add custom target "format". cmake_minimum_required(VERSION 3.4) project (pulsar-cpp) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake_modules") find_program(CCACHE_PROGRAM ccache) if(CCACHE_PROGRAM) set(CMAKE_CXX_COMPILER_LAUNCHER "ccache") MESSAGE(STATUS "Using CCache") endif(CCACHE_PROGRAM) MESSAGE(STATUS "ARCHITECTURE: ${CMAKE_SYSTEM_PROCESSOR}") option(BUILD_TESTS "Build tests" ON) MESSAGE(STATUS "BUILD_TESTS: " ${BUILD_TESTS}) option(BUILD_PYTHON_WRAPPER "Build Pulsar Python wrapper" ON) MESSAGE(STATUS "BUILD_PYTHON_WRAPPER: " ${BUILD_PYTHON_WRAPPER}) option(LINK_STATIC "Link against static libraries" OFF) MESSAGE(STATUS "LINK_STATIC: " ${LINK_STATIC}) option(USE_LOG4CXX "Build with Log4cxx support" OFF) MESSAGE(STATUS "USE_LOG4CXX: " ${USE_LOG4CXX}) IF (CMAKE_BUILD_TYPE STREQUAL "") set(CMAKE_BUILD_TYPE RelWithDebInfo) ENDIF () MESSAGE(STATUS "CMAKE_BUILD_TYPE: " ${CMAKE_BUILD_TYPE}) set(Boost_NO_BOOST_CMAKE ON) set(CMAKE_CXX_STANDARD 11) set(CMAKE_C_STANDARD 11) if (MSVC) # Visual Studio compiler flags add_definitions(-DWIN32_LEAN_AND_MEAN -DNOGDI -D_WIN32_WINNT=0x0501 -D_CRT_SECURE_NO_WARNINGS) add_compile_options(/wd4244 /wd4267 /wd4018 /wd4715 /wd4251 /wd4275) else() add_compile_options(-Werror=switch -Wno-deprecated-declarations) if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") add_compile_options(-msse4.2 -mpclmul) endif() endif(MSVC) set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(Protobuf_LITE_LIBRARIES $ENV{PROTOBUF_LIBRARIES}) set(LOG_CATEGORY_NAME $ENV{LOG_CATEGORY_NAME}) if (NOT LOG_CATEGORY_NAME) set(LOG_CATEGORY_NAME "\"pulsar.\"") endif(NOT LOG_CATEGORY_NAME) add_definitions(-DLOG_CATEGORY_NAME=${LOG_CATEGORY_NAME} -DBUILDING_PULSAR -DBOOST_ALL_NO_LIB -DBOOST_ALLOW_DEPRECATED_HEADERS) ### This part is to find and keep SSL dynamic libs in RECORD_OPENSSL_SSL_LIBRARY and RECORD_OPENSSL_CRYPTO_LIBRARY ### After find the libs, will unset related cache, and will not affact another same call to find_package. if (APPLE) set(OPENSSL_INCLUDE_DIR /usr/local/opt/openssl/include/) set(OPENSSL_ROOT_DIR /usr/local/opt/openssl/) endif () set(OPENSSL_ROOT_DIR /usr/lib64/) set(OPENSSL_USE_STATIC_LIBS FALSE) find_package(OpenSSL REQUIRED) set(RECORD_OPENSSL_SSL_LIBRARY ${OPENSSL_SSL_LIBRARY}) set(RECORD_OPENSSL_CRYPTO_LIBRARY ${OPENSSL_CRYPTO_LIBRARY}) unset(OPENSSL_FOUND CACHE) unset(OPENSSL_INCLUDE_DIR CACHE) unset(OPENSSL_CRYPTO_LIBRARY CACHE) unset(OPENSSL_CRYPTO_LIBRARIES CACHE) unset(OPENSSL_SSL_LIBRARY CACHE) unset(OPENSSL_SSL_LIBRARIES CACHE) unset(OPENSSL_LIBRARIES CACHE) unset(OPENSSL_VERSION CACHE) if (LINK_STATIC) find_library(ZLIB_LIBRARIES REQUIRED NAMES libz.a z zlib) find_library(Protobuf_LITE_LIBRARIES NAMES libprotobuf-lite.a libprotobuf-lite) find_library(CURL_LIBRARIES NAMES libcurl.a curl curl_a libcurl_a) find_library(LIB_ZSTD NAMES libzstd.a) find_library(LIB_SNAPPY NAMES libsnappy.a) if (USE_LOG4CXX) if (LOG4CXX_USE_DYNAMIC_LIBS) find_library(LOG4CXX_LIBRARY_PATH log4cxx) else () find_library(LOG4CXX_LIBRARY_PATH NAMES liblog4cxx.a) # Libraries needed by log4cxx to link statically with find_library(APR_LIBRARY_PATH NAMES libapr-1 PATHS /usr/lib /usr/local/apr/lib /usr/local/opt/apr/libexec/lib/) find_library(APR_UTIL_LIBRARY_PATH NAMES libaprutil-1 PATHS /usr/lib /usr/local/apr/lib /usr/local/opt/apr-util/libexec/lib/) find_library(EXPAT_LIBRARY_PATH NAMES libexpat expat) if (APPLE) find_library(ICONV_LIBRARY_PATH NAMES libiconv iconv) else () set(ICONV_LIBRARY_PATH ) endif (APPLE) endif (LOG4CXX_USE_DYNAMIC_LIBS) endif (USE_LOG4CXX) if (MSVC) add_definitions(-DCURL_STATICLIB) endif() if (UNIX AND NOT APPLE) set(CMAKE_FIND_LIBRARY_SUFFIXES .a) endif() SET(Boost_USE_STATIC_LIBS ON) SET(OPENSSL_USE_STATIC_LIBS TRUE) else() # Link to shared libraries find_package(ZLIB REQUIRED) set(ZLIB_LIBRARIES ${ZLIB_LIBRARIES}) if (NOT PROTOBUF_LIBRARIES) find_package(ProtoBuf QUIET) if (NOT Protobuf_FOUND OR NOT Protobuf_LITE_LIBRARIES) find_library(Protobuf_LITE_LIBRARIES protobuf-lite libprotobuf-lite) find_path(Protobuf_INCLUDE_DIRS google/protobuf/stubs/common.h) endif() endif (NOT PROTOBUF_LIBRARIES) find_library(LIB_ZSTD zstd) find_library(LIB_SNAPPY NAMES snappy libsnappy) find_library(CURL_LIBRARIES NAMES curl libcurl) if (USE_LOG4CXX) find_library(LOG4CXX_LIBRARY_PATH log4cxx) find_path(LOG4CXX_INCLUDE_PATH log4cxx/logger.h) endif (USE_LOG4CXX) endif (LINK_STATIC) if (MSVC) find_package(Boost REQUIRED COMPONENTS program_options regex system date_time) else() find_package(Boost REQUIRED COMPONENTS program_options regex system) endif() if (BUILD_PYTHON_WRAPPER) find_package(PythonLibs REQUIRED) MESSAGE(STATUS "PYTHON: " ${PYTHONLIBS_VERSION_STRING}) if (PYTHONLIBS_VERSION_STRING MATCHES "^3.+$") MESSAGE(STATUS "DETECTED Python 3") string(REPLACE "." ";" PYTHONLIBS_VERSION_NO_LIST ${PYTHONLIBS_VERSION_STRING}) list(GET PYTHONLIBS_VERSION_NO_LIST 0 PYTHONLIBS_VERSION_MAJOR) list(GET PYTHONLIBS_VERSION_NO_LIST 1 PYTHONLIBS_VERSION_MINOR) set(BOOST_PYTHON_NAME_POSTFIX ${PYTHONLIBS_VERSION_MAJOR}${PYTHONLIBS_VERSION_MINOR}) # For python3 the lib name is boost_python3 set(BOOST_PYTHON_NAME_LIST python36;python37;python38;python3;python3-mt;python-py${BOOST_PYTHON_NAME_POSTFIX};python${BOOST_PYTHON_NAME_POSTFIX}-mt;python${BOOST_PYTHON_NAME_POSTFIX}) else () # Regular boost_python set(BOOST_PYTHON_NAME_LIST python;python-mt;python-py27;python27-mt;python27) endif () foreach (BOOST_PYTHON_NAME IN LISTS BOOST_PYTHON_NAME_LIST) find_package(Boost QUIET COMPONENTS ${BOOST_PYTHON_NAME}) if (${Boost_FOUND}) set(BOOST_PYTHON_NAME_FOUND ${BOOST_PYTHON_NAME}) break() endif() endforeach() if (NOT ${Boost_FOUND}) MESSAGE(FATAL_ERROR "Could not find Boost Python library") endif () find_package(Boost REQUIRED COMPONENTS ${BOOST_PYTHON_NAME_FOUND}) endif (BUILD_PYTHON_WRAPPER) if (APPLE) set(OPENSSL_INCLUDE_DIR /usr/local/opt/openssl/include/) set(OPENSSL_ROOT_DIR /usr/local/opt/openssl/) endif () find_package(OpenSSL REQUIRED) if (BUILD_TESTS) find_path(GTEST_INCLUDE_PATH gtest/gtest.h) find_path(GMOCK_INCLUDE_PATH gmock/gmock.h) endif () if (USE_LOG4CXX) set(CMAKE_CXX_FLAGS " -DUSE_LOG4CXX ${CMAKE_CXX_FLAGS}") find_path(LOG4CXX_INCLUDE_PATH log4cxx/logger.h) endif (USE_LOG4CXX) if (NOT APPLE AND NOT MSVC) # we don't set options below to build _pulsar.so set(CMAKE_CXX_FLAGS_PYTHON "${CMAKE_CXX_FLAGS}") # Hide all non-exported symbols to avoid conflicts add_compile_options(-fvisibility=hidden -Wl,--exclude-libs,ALL) endif () if (LIB_ZSTD) set(HAS_ZSTD 1) else () set(HAS_ZSTD 0) endif () MESSAGE(STATUS "HAS_ZSTD: ${HAS_ZSTD}") if (LIB_SNAPPY) set(HAS_SNAPPY 1) else () set(HAS_SNAPPY 0) endif () MESSAGE(STATUS "HAS_SNAPPY: ${HAS_SNAPPY}") set(ADDITIONAL_LIBRARIES $ENV{PULSAR_ADDITIONAL_LIBRARIES}) link_directories( $ENV{PULSAR_ADDITIONAL_LIBRARY_PATH} ) set(AUTOGEN_DIR ${CMAKE_BINARY_DIR}/generated) file(MAKE_DIRECTORY ${AUTOGEN_DIR}) include_directories( ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/include ${AUTOGEN_DIR} ${Boost_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS} ${Protobuf_INCLUDE_DIRS} ${LOG4CXX_INCLUDE_PATH} ${GTEST_INCLUDE_PATH} ${GMOCK_INCLUDE_PATH} ) set(COMMON_LIBS ${COMMON_LIBS} ${Boost_REGEX_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES} ${ZLIB_LIBRARIES} ${Protobuf_LITE_LIBRARIES} ${ADDITIONAL_LIBRARIES} ) if (MSVC) set(COMMON_LIBS ${COMMON_LIBS} ${Boost_DATE_TIME_LIBRARY} ) endif() if (NOT MSVC) set(COMMON_LIBS ${COMMON_LIBS} -lpthread -lm dl pthread ) else() set(COMMON_LIBS ${COMMON_LIBS} wldap32.lib Normaliz.lib) endif() if (USE_LOG4CXX) set(COMMON_LIBS ${COMMON_LIBS} ${LOG4CXX_LIBRARY_PATH} ${APR_LIBRARY_PATH} ${APR_UTIL_LIBRARY_PATH} ${EXPAT_LIBRARY_PATH} ${ICONV_LIBRARY_PATH} ) endif () if (HAS_ZSTD) set(COMMON_LIBS ${COMMON_LIBS} ${LIB_ZSTD} ) endif () add_definitions(-DHAS_ZSTD=${HAS_ZSTD}) if (HAS_SNAPPY) set(COMMON_LIBS ${COMMON_LIBS} ${LIB_SNAPPY} ) endif () add_definitions(-DHAS_SNAPPY=${HAS_SNAPPY}) if(NOT APPLE AND NOT MSVC) set(COMMON_LIBS ${COMMON_LIBS} rt) endif () link_directories(${CMAKE_BINARY_DIR}/lib) set(LIB_NAME $ENV{PULSAR_LIBRARY_NAME}) if (NOT LIB_NAME) set(LIB_NAME pulsar) endif(NOT LIB_NAME) set(CLIENT_LIBS ${COMMON_LIBS} ${LIB_NAME} ) add_subdirectory(lib) add_subdirectory(perf) add_subdirectory(examples) if (BUILD_TESTS) add_subdirectory(tests) endif() if (BUILD_PYTHON_WRAPPER) add_subdirectory(python) endif ()