285 lines
11 KiB
CMake
285 lines
11 KiB
CMake
|
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||
|
|
# contributor license agreements. See the NOTICE file distributed with
|
||
|
|
# this work for additional information regarding copyright ownership.
|
||
|
|
# The ASF licenses this file to You under the Apache License, Version 2.0
|
||
|
|
# (the "License"); you may not use this file except in compliance with
|
||
|
|
# the License. You may obtain a copy of the License at
|
||
|
|
#
|
||
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
#
|
||
|
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
|
# See the License for the specific language governing permissions and
|
||
|
|
# limitations under the License.
|
||
|
|
|
||
|
|
cmake_minimum_required(VERSION 2.8)
|
||
|
|
|
||
|
|
if (APPLE)
|
||
|
|
set(CMAKE_MACOSX_RPATH 1)
|
||
|
|
endif (APPLE)
|
||
|
|
|
||
|
|
# CMake complains if we don't have this.
|
||
|
|
if (COMMAND cmake_policy)
|
||
|
|
cmake_policy(SET CMP0003 NEW)
|
||
|
|
endif ()
|
||
|
|
|
||
|
|
# We're escaping quotes in the Windows version number, because
|
||
|
|
# for some reason CMake won't do it at config version 2.4.7
|
||
|
|
# It seems that this restores the newer behaviour where define
|
||
|
|
# args are not auto-escaped.
|
||
|
|
if (COMMAND cmake_policy)
|
||
|
|
cmake_policy(SET CMP0005 NEW)
|
||
|
|
endif ()
|
||
|
|
|
||
|
|
# First, declare project (important for prerequisite checks).
|
||
|
|
project(rocketmq-client-cpp)
|
||
|
|
if (NOT CMAKE_BUILD_TYPE)
|
||
|
|
set(CMAKE_BUILD_TYPE "Release")
|
||
|
|
endif ()
|
||
|
|
set(CMAKE_CONFIGURATION_TYPES "Release")
|
||
|
|
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
|
||
|
|
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
|
||
|
|
set(CMAKE_VERBOSE_MAKEFILE 1)
|
||
|
|
option(BUILD_ROCKETMQ_STATIC "build rocketmq-client static library" ON)
|
||
|
|
option(BUILD_ROCKETMQ_SHARED "build rocketmq-client shared library" ON)
|
||
|
|
|
||
|
|
option(OPENSSL_USE_STATIC_LIBS "only find openssl static libs" ON) # only find static libs
|
||
|
|
if (WIN32)
|
||
|
|
find_package(OpenSSL 1.1.1 REQUIRED COMPONENTS)
|
||
|
|
if (OPENSSL_FOUND)
|
||
|
|
include_directories(${OPENSSL_INCLUDE_DIR})
|
||
|
|
message(STATUS "** OpenSSL Include dir: ${OPENSSL_INCLUDE_DIR}")
|
||
|
|
message(STATUS "** OpenSSL Libraries: ${OPENSSL_LIBRARIES}")
|
||
|
|
endif ()
|
||
|
|
else ()
|
||
|
|
#find_package(OpenSSL 1.1.1 REQUIRED COMPONENTS)
|
||
|
|
set(OPENSSL_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/bin/include)
|
||
|
|
set(OPENSSL_LIBRARIES_DIR ${PROJECT_SOURCE_DIR}/bin/lib)
|
||
|
|
set(OPENSSL_LIBRARIES ${OPENSSL_LIBRARIES_DIR}/libssl.a;${OPENSSL_LIBRARIES_DIR}/libcrypto.a)
|
||
|
|
include_directories(${OPENSSL_INCLUDE_DIR})
|
||
|
|
endif ()
|
||
|
|
message(STATUS "** OpenSSL_INCLUDE_DIR: ${OPENSSL_INCLUDE_DIR}")
|
||
|
|
message(STATUS "** OpenSSL_LIBRARIES: ${OPENSSL_LIBRARIES}")
|
||
|
|
|
||
|
|
#Find dependency
|
||
|
|
option(Boost_USE_STATIC_LIBS "only find boost static libs" ON) # only find static libs
|
||
|
|
set(Boost_USE_MULTITHREADED ON)
|
||
|
|
set(Boost_USE_STATIC_RUNTIME ON)
|
||
|
|
if (WIN32)
|
||
|
|
find_package(Boost 1.56 REQUIRED COMPONENTS atomic thread system chrono date_time
|
||
|
|
log log_setup regex serialization filesystem locale iostreams zlib)
|
||
|
|
if (Boost_FOUND)
|
||
|
|
message(STATUS "** Boost Include dir: ${Boost_INCLUDE_DIR}")
|
||
|
|
message(STATUS "** Boost Libraries dir: ${Boost_LIBRARY_DIRS}")
|
||
|
|
message(STATUS "** Boost Libraries: ${Boost_LIBRARIES}")
|
||
|
|
include_directories(${Boost_INCLUDE_DIRS})
|
||
|
|
endif ()
|
||
|
|
else ()
|
||
|
|
#find_package(Boost 1.56 REQUIRED COMPONENTS atomic thread system chrono date_time log log_setup regex serialization filesystem locale iostreams)
|
||
|
|
set(Boost_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/bin/include)
|
||
|
|
set(Boost_LIBRARY_DIRS ${PROJECT_SOURCE_DIR}/bin/lib)
|
||
|
|
set(Boost_LIBRARIES ${Boost_LIBRARY_DIRS}/libboost_atomic.a;${Boost_LIBRARY_DIRS}/libboost_thread.a;${Boost_LIBRARY_DIRS}/libboost_system.a;
|
||
|
|
${Boost_LIBRARY_DIRS}/libboost_chrono.a;${Boost_LIBRARY_DIRS}/libboost_date_time.a;${Boost_LIBRARY_DIRS}/libboost_log.a;
|
||
|
|
${Boost_LIBRARY_DIRS}/libboost_log_setup.a;${Boost_LIBRARY_DIRS}/libboost_regex.a;${Boost_LIBRARY_DIRS}/libboost_serialization.a;
|
||
|
|
${Boost_LIBRARY_DIRS}/libboost_filesystem.a;${Boost_LIBRARY_DIRS}/libboost_locale.a;${Boost_LIBRARY_DIRS}/libboost_iostreams.a)
|
||
|
|
include_directories(${Boost_INCLUDE_DIR})
|
||
|
|
endif ()
|
||
|
|
|
||
|
|
message(STATUS "** Boost_INCLUDE_DIR: ${Boost_INCLUDE_DIR}")
|
||
|
|
message(STATUS "** Boost_LIBRARIES: ${Boost_LIBRARIES}")
|
||
|
|
|
||
|
|
option(Libevent_USE_STATIC_LIBS "only find libevent static libs" ON) # only find static libs
|
||
|
|
if (WIN32)
|
||
|
|
find_package(Libevent 2.0.22 REQUIRED COMPONENTS)
|
||
|
|
if (LIBEVENT_FOUND)
|
||
|
|
include_directories(${LIBEVENT_INCLUDE_DIRS})
|
||
|
|
message(STATUS "** libevent Include dir: ${LIBEVENT_INCLUDE_DIRS}")
|
||
|
|
message(STATUS "** libevent Libraries: ${LIBEVENT_LIBRARIES}")
|
||
|
|
endif ()
|
||
|
|
else ()
|
||
|
|
#find_package(Libevent 2.0.22 REQUIRED COMPONENTS)
|
||
|
|
set(LIBEVENT_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/bin/include)
|
||
|
|
set(LIBEVENT_LIBRARIES_DIR ${PROJECT_SOURCE_DIR}/bin/lib)
|
||
|
|
set(LIBEVENT_LIBRARIES ${LIBEVENT_LIBRARIES_DIR}/libevent.a;${LIBEVENT_LIBRARIES_DIR}/libevent_core.a;${LIBEVENT_LIBRARIES_DIR}/libevent_extra.a;
|
||
|
|
${LIBEVENT_LIBRARIES_DIR}/libevent_pthreads.a;${LIBEVENT_LIBRARIES_DIR}/libevent_openssl.a)
|
||
|
|
include_directories(${LIBEVENT_INCLUDE_DIRS})
|
||
|
|
endif ()
|
||
|
|
|
||
|
|
message(STATUS "** LIBEVENT_INCLUDE_DIR: ${LIBEVENT_INCLUDE_DIRS}")
|
||
|
|
message(STATUS "** LIBEVENT_LIBRARIES: ${LIBEVENT_LIBRARIES}")
|
||
|
|
|
||
|
|
option(JSONCPP_USE_STATIC_LIBS "only find jsoncpp static libs" ON) # only find static libs
|
||
|
|
if (WIN32)
|
||
|
|
find_package(Jsoncpp 0.10.6)
|
||
|
|
if (JSONCPP_FOUND)
|
||
|
|
include_directories(${JSONCPP_INCLUDE_DIRS})
|
||
|
|
endif ()
|
||
|
|
else ()
|
||
|
|
set(JSONCPP_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/bin/include/jsoncpp)
|
||
|
|
set(JSONCPP_LIBRARIES_DIR ${PROJECT_SOURCE_DIR}/bin/lib)
|
||
|
|
set(JSONCPP_LIBRARIES ${JSONCPP_LIBRARIES_DIR}/libjsoncpp.a)
|
||
|
|
include_directories(${JSONCPP_INCLUDE_DIRS})
|
||
|
|
endif ()
|
||
|
|
|
||
|
|
message(STATUS "** JSONCPP_INCLUDE_DIRS: ${JSONCPP_INCLUDE_DIRS}")
|
||
|
|
message(STATUS "** JSONCPP_LIBRARIES: ${JSONCPP_LIBRARIES}")
|
||
|
|
|
||
|
|
# put binaries in a different dir to make them easier to find.
|
||
|
|
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
|
||
|
|
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
|
||
|
|
|
||
|
|
# for unix, put debug files in a separate bin "debug" dir.
|
||
|
|
# release bin files should stay in the root of the bin dir.
|
||
|
|
# if (CMAKE_GENERATOR STREQUAL "Unix Makefiles")
|
||
|
|
# if (CMAKE_BUILD_TYPE STREQUAL Debug)
|
||
|
|
# set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin/debug)
|
||
|
|
# set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin/debug)
|
||
|
|
# endif()
|
||
|
|
# endif()
|
||
|
|
|
||
|
|
IF (WIN32)
|
||
|
|
add_definitions(-DWIN32 -DROCKETMQCLIENT_EXPORTS)
|
||
|
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc")
|
||
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
|
||
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
|
||
|
|
ELSE ()
|
||
|
|
set(C_FLAGS
|
||
|
|
#-g
|
||
|
|
-Wall
|
||
|
|
-Wno-deprecated
|
||
|
|
-fPIC
|
||
|
|
-fno-strict-aliasing
|
||
|
|
)
|
||
|
|
set(CXX_FLAGS
|
||
|
|
#-g
|
||
|
|
-Wall
|
||
|
|
-Wno-deprecated
|
||
|
|
-fPIC
|
||
|
|
-fno-strict-aliasing
|
||
|
|
-std=c++11
|
||
|
|
-Wno-unused-local-typedef
|
||
|
|
-Wno-expansion-to-defined
|
||
|
|
# -finline-limit=1000
|
||
|
|
# -Wextra
|
||
|
|
# -pedantic
|
||
|
|
# -pedantic-errors
|
||
|
|
# -D_FILE_OFFSET_BITS=64
|
||
|
|
# -DVALGRIND
|
||
|
|
# -DCHECK_PTHREAD_RETURN_VALUE
|
||
|
|
# -Werror
|
||
|
|
# -Wconversion
|
||
|
|
# -Wno-unused-parameter
|
||
|
|
# -Wunused-but-set-variable
|
||
|
|
# -Wold-style-cast
|
||
|
|
# -Woverloaded-virtual
|
||
|
|
# -Wpointer-arith
|
||
|
|
# -Wshadow
|
||
|
|
# -Wwrite-strings
|
||
|
|
# -Wdeprecated-declarations
|
||
|
|
# -march=native
|
||
|
|
# -MMD
|
||
|
|
# -std=c++0x
|
||
|
|
# -rdynamic
|
||
|
|
)
|
||
|
|
|
||
|
|
if (CMAKE_BUILD_BITS EQUAL 32)
|
||
|
|
list(APPEND CXX_FLAGS "-m32")
|
||
|
|
else () #not-condition
|
||
|
|
list(APPEND CXX_FLAGS "-m64")
|
||
|
|
endif ()
|
||
|
|
|
||
|
|
string(REPLACE ";" " " CMAKE_CXX_FLAGS "${CXX_FLAGS}")
|
||
|
|
string(REPLACE ";" " " CMAKE_C_FLAGS "${C_FLAGS}")
|
||
|
|
|
||
|
|
option(ENABLE_ASAN "Enable asan reporting" OFF)
|
||
|
|
if (ENABLE_ASAN)
|
||
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer -static-libasan")
|
||
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer -static-libasan")
|
||
|
|
message(STATUS "** ENABLE_ASAN: ${ENABLE_ASAN} Enable asan reporting")
|
||
|
|
endif ()
|
||
|
|
|
||
|
|
option(ENABLE_LSAN "Enable lsan reporting" OFF)
|
||
|
|
if (ENABLE_LSAN)
|
||
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=leak -fno-omit-frame-pointer -static-liblsan")
|
||
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=leak -fno-omit-frame-pointer -static-liblsan")
|
||
|
|
message(STATUS "** ENABLE_LSAN: ${ENABLE_LSAN} Enable lsan reporting")
|
||
|
|
endif ()
|
||
|
|
|
||
|
|
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -DDEBUG")
|
||
|
|
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
|
||
|
|
set(CMAKE_C_FLAGS_DEBUG "-g -O0 -DDEBUG")
|
||
|
|
set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG")
|
||
|
|
|
||
|
|
|
||
|
|
# Declare deplibs, so we can use list in linker later. There's probably
|
||
|
|
# a more elegant way of doing this; with SCons, when you check for the
|
||
|
|
# lib, it is automatically passed to the linker.
|
||
|
|
set(deplibs)
|
||
|
|
|
||
|
|
# For some reason, the check_function_exists macro doesn't detect
|
||
|
|
# the inet_aton on some pure Unix platforms (e.g. sunos5). So we
|
||
|
|
# need to do a more detailed check and also include some extra deplibs.
|
||
|
|
list(APPEND deplibs dl)
|
||
|
|
list(APPEND deplibs pthread)
|
||
|
|
if (NOT APPLE)
|
||
|
|
list(APPEND deplibs rt)
|
||
|
|
endif ()
|
||
|
|
list(APPEND deplibs z)
|
||
|
|
|
||
|
|
option(CODE_COVERAGE "Enable coverage reporting" OFF)
|
||
|
|
if (CODE_COVERAGE AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||
|
|
# Add required flags (GCC & LLVM/Clang)
|
||
|
|
# Code Coverage Configuration
|
||
|
|
add_library(coverage_config INTERFACE)
|
||
|
|
target_compile_options(coverage_config INTERFACE
|
||
|
|
-O0 # no optimization
|
||
|
|
-g # generate debug info
|
||
|
|
--coverage # sets all required flags
|
||
|
|
)
|
||
|
|
if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.13)
|
||
|
|
target_link_options(coverage_config INTERFACE --coverage)
|
||
|
|
else ()
|
||
|
|
target_link_libraries(coverage_config INTERFACE --coverage)
|
||
|
|
endif ()
|
||
|
|
list(APPEND deplibs coverage_config)
|
||
|
|
endif (CODE_COVERAGE AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||
|
|
# add include dir for bsd (posix uses /usr/include/)
|
||
|
|
set(CMAKE_INCLUDE_PATH "${CMAKE_INCLUDE_PATH}:/usr/local/include")
|
||
|
|
ENDIF ()
|
||
|
|
|
||
|
|
# For config.h, set some static values; it may be a good idea to make
|
||
|
|
# these values dynamic for non-standard UNIX compilers.
|
||
|
|
set(ACCEPT_TYPE_ARG3 socklen_t)
|
||
|
|
set(HAVE_CXX_BOOL 1)
|
||
|
|
set(HAVE_CXX_CASTS 1)
|
||
|
|
set(HAVE_CXX_EXCEPTIONS 1)
|
||
|
|
set(HAVE_CXX_MUTABLE 1)
|
||
|
|
set(HAVE_CXX_STDLIB 1)
|
||
|
|
set(HAVE_PTHREAD_SIGNAL 1)
|
||
|
|
set(SELECT_TYPE_ARG1 int)
|
||
|
|
set(SELECT_TYPE_ARG234 "(fd_set *)")
|
||
|
|
set(SELECT_TYPE_ARG5 "(struct timeval *)")
|
||
|
|
set(STDC_HEADERS 1)
|
||
|
|
set(TIME_WITH_SYS_TIME 1)
|
||
|
|
set(HAVE_SOCKLEN_T 1)
|
||
|
|
|
||
|
|
# For config.h, save the results based on a template (config.h.in).
|
||
|
|
# configure_file(res/config.h.in ${root_dir}/config.h)
|
||
|
|
|
||
|
|
# add_definitions(-DSYSAPI_UNIX=1 -DHAVE_CONFIG_H)
|
||
|
|
|
||
|
|
add_subdirectory(libs)
|
||
|
|
add_subdirectory(project)
|
||
|
|
add_subdirectory(example)
|
||
|
|
|
||
|
|
|
||
|
|
option(RUN_UNIT_TEST "RUN_UNIT_TEST" OFF)
|
||
|
|
|
||
|
|
if (RUN_UNIT_TEST)
|
||
|
|
message(STATUS "** RUN_UNIT_TEST: ${RUN_UNIT_TEST} Do execution testing")
|
||
|
|
enable_testing()
|
||
|
|
add_subdirectory(test)
|
||
|
|
endif ()
|
||
|
|
|