subrepo: subdir: "deps/nats.c" merged: "5d057f6" upstream: origin: "https://github.com/nats-io/nats.c.git" branch: "v3.7.0" commit: "5d057f6" git-subrepo: version: "0.4.6" commit: "affc4c01a"
284 lines
9.2 KiB
CMake
284 lines
9.2 KiB
CMake
cmake_minimum_required(VERSION 3.13)
|
|
|
|
project(cnats)
|
|
include(CTest)
|
|
include(FindPackageHandleStandardArgs)
|
|
|
|
# Uncomment to have the build process verbose
|
|
#set(CMAKE_VERBOSE_MAKEFILE TRUE)
|
|
|
|
# Uncomment to have the executable moved to 'build' instead of their respective 'build/xxx' directories
|
|
#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
|
|
|
|
# Set a default build type if none was specified
|
|
set(default_build_type "Release")
|
|
|
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
|
|
set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE
|
|
STRING "Choose the type of build." FORCE)
|
|
# Set the possible values of build type for cmake-gui
|
|
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
|
|
"Release" "Debug" "MinSizeRel" "RelWithDebInfo")
|
|
endif()
|
|
|
|
option(NATS_UPDATE_VERSION "Update the version file" OFF)
|
|
option(NATS_UPDATE_DOC "Update the doc template file" OFF)
|
|
option(NATS_COVERAGE "Code coverage" OFF)
|
|
option(NATS_BUILD_NO_SPIN "Enable if spin code does not compile on your arch" OFF)
|
|
option(NATS_BUILD_WITH_TLS "Build with TLS support" ON)
|
|
option(NATS_BUILD_TLS_FORCE_HOST_VERIFY "Forces hostname verification" ON)
|
|
option(NATS_BUILD_TLS_USE_OPENSSL_1_1_API "Build for OpenSSL 1.1+" ON)
|
|
option(NATS_BUILD_USE_SODIUM "Build using libsodium library" OFF)
|
|
option(NATS_BUILD_EXAMPLES "Build examples" ON)
|
|
option(NATS_BUILD_LIBUV_EXAMPLE "Build libuv examples" OFF)
|
|
option(NATS_BUILD_LIBEVENT_EXAMPLE "Build libevent examples" OFF)
|
|
option(NATS_BUILD_STATIC_EXAMPLES "Statically link examples" OFF)
|
|
option(NATS_BUILD_STREAMING "Build NATS Streaming" ON)
|
|
option(NATS_BUILD_NO_PREFIX_CONNSTS "No prefix for connection status enum" OFF)
|
|
option(NATS_BUILD_LIB_STATIC "Build static library" ON)
|
|
option(NATS_BUILD_LIB_SHARED "Build shared library" ON)
|
|
option(NATS_COMPILER_HARDENING "Compiler hardening flags" OFF)
|
|
if(UNIX AND APPLE)
|
|
option(CMAKE_MACOSX_RPATH "Build with macOS RPath" ON)
|
|
endif()
|
|
|
|
if(DEFINED ENV{NATS_SANITIZE})
|
|
set(NATS_STANITIZE "$ENV{NATS_SANITIZE}")
|
|
mark_as_advanced(NATS_SANITIZE)
|
|
endif()
|
|
|
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_BINARY_DIR})
|
|
|
|
if(NATS_COVERAGE)
|
|
message("-- Coverage Enabled")
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage -fprofile-arcs -ftest-coverage")
|
|
endif(NATS_COVERAGE)
|
|
|
|
if(NATS_BUILD_WITH_TLS)
|
|
set(OPENSSL_USE_STATIC_LIBS ${NATS_BUILD_OPENSSL_STATIC_LIBS})
|
|
find_package(OpenSSL REQUIRED)
|
|
endif(NATS_BUILD_WITH_TLS)
|
|
|
|
set(LIBUV_DIR "" CACHE PATH "Libuv install directory")
|
|
set(LIBEVENT_DIR "" CACHE PATH "Libevent install directory")
|
|
|
|
set(NATS_DOC_PROJECT_NAME "NATS C Client with JetStream support")
|
|
if(NATS_BUILD_STREAMING)
|
|
IF(DEFINED ENV{NATS_PROTOBUF_DIR})
|
|
SET(NATS_PROTOBUF_DIR "$ENV{NATS_PROTOBUF_DIR}")
|
|
ENDIF()
|
|
FIND_PATH(
|
|
NATS_PROTOBUF_INCLUDE_DIR
|
|
protobuf-c/protobuf-c.h
|
|
HINTS
|
|
${NATS_PROTOBUF_DIR}
|
|
)
|
|
FIND_LIBRARY(NATS_PROTOBUF_LIBRARY
|
|
NAMES libprotobuf-c.so libprotobuf-c.dylib libprotobuf-c.a protobuf-c.lib protobuf-c.dll
|
|
HINTS ${NATS_PROTOBUF_DIR}
|
|
)
|
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(libprotobuf-c DEFAULT_MSG
|
|
NATS_PROTOBUF_INCLUDE_DIR
|
|
NATS_PROTOBUF_LIBRARY
|
|
)
|
|
IF(libprotobuf-c_FOUND)
|
|
SET(NATS_PROTOBUF_INCLUDE_DIRS ${NATS_PROTOBUF_INCLUDE_DIR})
|
|
SET(NATS_PROTOBUF_LIBRARIES ${NATS_PROTOBUF_LIBRARY})
|
|
MARK_AS_ADVANCED(
|
|
NATS_PROTOBUF_LIBRARY
|
|
NATS_PROTOBUF_INCLUDE_DIR
|
|
NATS_PROTOBUF_DIR
|
|
)
|
|
ELSE()
|
|
SET(NATS_PROTOBUF_DIR "" CACHE STRING
|
|
"An optional hint to a directory for finding `libprotobuf-c`"
|
|
)
|
|
MESSAGE(FATAL_ERROR
|
|
"Could not find libprotobuf-c package. Check build instructions: https://github.com/nats-io/nats.c#building-with-streaming")
|
|
ENDIF()
|
|
add_definitions(-DNATS_HAS_STREAMING)
|
|
set(NATS_DOC_INCLUDE_STREAMING "NATS_HAS_STREAMING")
|
|
set(NATS_DOC_PROJECT_NAME "NATS C Client with JetStream and Streaming support")
|
|
endif(NATS_BUILD_STREAMING)
|
|
|
|
if(NATS_BUILD_USE_SODIUM)
|
|
IF(DEFINED ENV{NATS_SODIUM_DIR})
|
|
SET(NATS_SODIUM_DIR "$ENV{NATS_SODIUM_DIR}")
|
|
ENDIF()
|
|
FIND_PATH(
|
|
NATS_SODIUM_INCLUDE_DIR
|
|
sodium.h
|
|
HINTS
|
|
${NATS_SODIUM_DIR}
|
|
)
|
|
FIND_LIBRARY(NATS_SODIUM_LIBRARY
|
|
NAMES libsodium.so libsodium.dylib libsodium.a libsodium.lib libsodium.dll
|
|
HINTS ${NATS_SODIUM_DIR}
|
|
)
|
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(libsodium DEFAULT_MSG
|
|
NATS_SODIUM_INCLUDE_DIR
|
|
NATS_SODIUM_LIBRARY
|
|
)
|
|
IF(libsodium_FOUND)
|
|
SET(NATS_SODIUM_INCLUDE_DIRS ${NATS_SODIUM_INCLUDE_DIR})
|
|
SET(NATS_SODIUM_LIBRARIES ${NATS_SODIUM_LIBRARY})
|
|
MARK_AS_ADVANCED(
|
|
NATS_SODIUM_LIBRARY
|
|
NATS_SODIUM_INCLUDE_DIR
|
|
NATS_SODIUM_DIR
|
|
)
|
|
ELSE()
|
|
SET(NATS_SODIUM_DIR "" CACHE STRING
|
|
"An optional hint to a directory for finding `libsodium`"
|
|
)
|
|
MESSAGE(FATAL_ERROR
|
|
"Could not find libsodium package. Check build instructions: https://github.com/nats-io/nats.c#building-with-libsodium")
|
|
ENDIF()
|
|
add_definitions(-DNATS_USE_LIBSODIUM)
|
|
endif(NATS_BUILD_USE_SODIUM)
|
|
|
|
if(NATS_BUILD_NO_PREFIX_CONNSTS)
|
|
add_definitions(-DNATS_CONN_STATUS_NO_PREFIX)
|
|
endif(NATS_BUILD_NO_PREFIX_CONNSTS)
|
|
|
|
# Platform specific settings
|
|
if(UNIX)
|
|
#---------------------------------------------------------------------------
|
|
# Define NATS cache variables that override the CMAKE and MEMCHECK variables
|
|
#---------------------------------------------------------------------------
|
|
include(GNUInstallDirs)
|
|
|
|
set(NATS_LIBDIR ${CMAKE_INSTALL_LIBDIR})
|
|
set(NATS_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR})
|
|
|
|
set(NATS_BUILD_ARCH "64" CACHE STRING "32 for 32bits builds")
|
|
|
|
find_program(MEMORYCHECK_COMMAND valgrind)
|
|
set(NATS_MEMCHECK_CMD_OPTS "--leak-check=full --track-fds=yes --show-reachable=yes --num-callers=50" CACHE STRING "Memcheck options")
|
|
set(MEMORYCHECK_COMMAND_OPTIONS ${NATS_MEMCHECK_CMD_OPTS} CACHE INTERNAL "")
|
|
|
|
set(NATS_COMMON_C_FLAGS "-std=c99 -pedantic")
|
|
|
|
# Some compiler hardening flags.
|
|
if(NATS_COMPILER_HARDENING)
|
|
set(NATS_COMMON_C_FLAGS "${NATS_COMMON_C_FLAGS} -fPIE -fstack-protector-all -D_FORTIFY_SOURCE=2 -O1")
|
|
# Works only with GCC.
|
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
|
set(NATS_COMMON_C_FLAGS "${NATS_COMMON_C_FLAGS} -Wl,-z,relro,-z,now -pie")
|
|
endif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
|
endif(NATS_COMPILER_HARDENING)
|
|
|
|
set(NATS_WARNINGS "-fstrict-aliasing -Wall -W -Wno-unused-parameter -Wno-unused-function -Wstrict-prototypes -Wwrite-strings")
|
|
set(NATS_PLATFORM_INCLUDE "unix")
|
|
|
|
if(APPLE)
|
|
set(NATS_OS "DARWIN")
|
|
else(APPLE)
|
|
set(NATS_OS "LINUX")
|
|
set(NATS_USE_PTHREAD "-pthread")
|
|
set(NATS_EXTRA_LIB "rt")
|
|
endif(APPLE)
|
|
if (${NATS_BUILD_ARCH} MATCHES "32")
|
|
if(NOT APPLE)
|
|
message("-----------------------------------------------------------")
|
|
message("If build fails, you probably need to install libc6-dev-i386")
|
|
message("apt-get install libc6-dev-i386")
|
|
message("-----------------------------------------------------------")
|
|
endif(NOT APPLE)
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
|
|
set(CMAKE_C_LINKER_FLAGS "${CMAKE_C_LINKER_FLAGS} -m32")
|
|
endif(${NATS_BUILD_ARCH} MATCHES "32")
|
|
|
|
elseif(WIN32)
|
|
set(NATS_LIBDIR "lib")
|
|
set(NATS_INCLUDE_DIR "include")
|
|
set(NATS_EXTRA_LIB "Ws2_32")
|
|
set(NATS_OS "_WIN32")
|
|
set(NATS_PLATFORM_INCLUDE "win")
|
|
if(sodium_USE_STATIC_LIBS)
|
|
add_definitions(
|
|
-DSODIUM_STATIC
|
|
-DSODIUM_EXPORT=
|
|
)
|
|
endif(sodium_USE_STATIC_LIBS)
|
|
endif(UNIX)
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${NATS_COMMON_C_FLAGS} ${NATS_USE_PTHREAD} ${NATS_WARNINGS}")
|
|
if(NATS_SANITIZE)
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer -fno-optimize-sibling-calls")
|
|
endif(NATS_SANITIZE)
|
|
|
|
if(UNIX)
|
|
if(APPLE)
|
|
else(APPLE)
|
|
add_definitions(-D_GNU_SOURCE)
|
|
if(NATS_BUILD_NO_SPIN)
|
|
add_definitions(-DNATS_NO_SPIN)
|
|
endif(NATS_BUILD_NO_SPIN)
|
|
endif(APPLE)
|
|
endif(UNIX)
|
|
add_definitions(-D${NATS_OS})
|
|
add_definitions(-D_REENTRANT)
|
|
if(NATS_BUILD_WITH_TLS)
|
|
add_definitions(-DNATS_HAS_TLS)
|
|
if(NATS_BUILD_TLS_USE_OPENSSL_1_1_API)
|
|
add_definitions(-DNATS_USE_OPENSSL_1_1)
|
|
endif(NATS_BUILD_TLS_USE_OPENSSL_1_1_API)
|
|
if(NATS_BUILD_TLS_FORCE_HOST_VERIFY)
|
|
add_definitions(-DNATS_FORCE_HOST_VERIFICATION)
|
|
endif(NATS_BUILD_TLS_FORCE_HOST_VERIFY)
|
|
endif(NATS_BUILD_WITH_TLS)
|
|
|
|
|
|
#------------
|
|
# Versionning and Doc
|
|
|
|
set(NATS_VERSION_MAJOR 3)
|
|
set(NATS_VERSION_MINOR 7)
|
|
set(NATS_VERSION_PATCH 0)
|
|
set(NATS_VERSION_SUFFIX "")
|
|
|
|
set(NATS_VERSION_REQUIRED_NUMBER 0x030700)
|
|
|
|
if(NATS_UPDATE_VERSION OR NATS_UPDATE_DOC)
|
|
configure_file(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/version.h.in
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/version.h
|
|
@ONLY)
|
|
|
|
configure_file(
|
|
${CMAKE_SOURCE_DIR}/doc/DoxyFile.NATS.Client.in
|
|
${CMAKE_SOURCE_DIR}/doc/DoxyFile.NATS.Client
|
|
@ONLY)
|
|
endif(NATS_UPDATE_VERSION OR NATS_UPDATE_DOC)
|
|
#------------
|
|
|
|
#------------
|
|
# pkg-config
|
|
if(UNIX)
|
|
configure_file(
|
|
${PROJECT_SOURCE_DIR}/src/libnats.pc.in
|
|
${PROJECT_BINARY_DIR}/libnats.pc
|
|
@ONLY
|
|
)
|
|
install (
|
|
FILES "${PROJECT_BINARY_DIR}/libnats.pc"
|
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
|
endif(UNIX)
|
|
#------------
|
|
|
|
#----------------------------
|
|
# Add the project directories
|
|
|
|
add_subdirectory(src)
|
|
add_subdirectory(examples)
|
|
add_subdirectory(examples/getstarted)
|
|
if(NATS_BUILD_STREAMING)
|
|
add_subdirectory(examples/stan)
|
|
endif()
|
|
add_subdirectory(test)
|
|
add_subdirectory(test/dylib)
|
|
#----------------------------
|