Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 93 additions & 32 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,35 +1,50 @@
cmake_minimum_required(VERSION 3.16)

project(QtNatsProject)
project(QtNatsProject VERSION 0.1.0)

include(CMakePrintHelpers)
include(FetchContent)
include(GenerateExportHeader)

set(default_build_type "Release")
include(GNUInstallDirs)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_AUTOMOC ON)

message("Using Qt version ${QT_VERSION}")

# show that we're git-cloning cnats
set(FETCHCONTENT_QUIET FALSE)
FetchContent_Declare(
cnats
URL https://github.com/nats-io/nats.c/archive/refs/tags/v3.3.0.tar.gz
)

set(NATS_BUILD_WITH_TLS ON)
set(NATS_BUILD_EXAMPLES OFF)
set(NATS_BUILD_STREAMING OFF)
set(NATS_BUILD_LIB_SHARED OFF)
find_package(cnats CONFIG QUIET)
if(NOT cnats_FOUND)
message(STATUS "cnats not found via find_package, fetching via FetchContent...")
include(FetchContent)
FetchContent_Declare(cnats
URL https://github.com/nats-io/nats.c/archive/refs/tags/v3.3.0.tar.gz
URL_HASH SHA256=16e700d912034faefb235a955bd920cfe4d449a260d0371b9694d722eb617ae1
)
set(NATS_BUILD_WITH_TLS ON CACHE BOOL "" FORCE)
set(NATS_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(NATS_BUILD_STREAMING OFF CACHE BOOL "" FORCE)
set(BUILD_TESTING_SAVED "${BUILD_TESTING}")
set(BUILD_TESTING OFF CACHE BOOL "" FORCE)
FetchContent_Populate(cnats)
add_subdirectory(${cnats_SOURCE_DIR} ${cnats_BINARY_DIR} EXCLUDE_FROM_ALL)
set(BUILD_TESTING "${BUILD_TESTING_SAVED}" CACHE BOOL "" FORCE)

# cnats exposes <nats.h> at build time, but vcpkg installs it as <nats/nats.h>.
# Create a wrapper so #include <nats/nats.h> works in both cases.
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/cnats_include/nats")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/cnats_include/nats/nats.h"
"#include <nats.h>\n")
target_include_directories(nats_static PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/cnats_include>)

set(CNATS_FETCHED TRUE)
endif()

set(BUILD_TESTING OFF) # do not build cnats tests
set(BUILD_QT_NATS_INTEGRATION_TESTING OFF)
if(TARGET cnats::nats_static)
set(CNATS_TARGET cnats::nats_static)
else()
set(CNATS_TARGET nats_static)
endif()

FetchContent_MakeAvailable(cnats)
find_package(Qt6 REQUIRED COMPONENTS Core)

# ------------- qtnats library ----------------------
add_library(qtnats
Expand All @@ -38,25 +53,75 @@ add_library(qtnats
src/qtnats/qtnats.cpp
src/qtnats/qtnats.h
src/qtnats/qtnats_p.h
${CMAKE_CURRENT_BINARY_DIR}/qtnats_export.h
${CMAKE_CURRENT_BINARY_DIR}/qtnats/qtnats_export.h
)

target_include_directories(qtnats
PUBLIC
src
${CMAKE_CURRENT_BINARY_DIR}
${cnats_SOURCE_DIR}/src
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)

target_link_libraries(qtnats PUBLIC ${CNATS_TARGET} Qt6::Core)

target_link_libraries(qtnats nats_static Qt::Core)
set_target_properties(qtnats PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION 0.1
EXPORT_NAME qtnats
)

# this has no effect on Windows due to https://gitlab.kitware.com/cmake/cmake/-/issues/19618
set_target_properties(qtnats PROPERTIES VERSION 0.1.0 SOVERSION 0.1)
GENERATE_EXPORT_HEADER(qtnats
EXPORT_FILE_NAME qtnats/qtnats_export.h
)

GENERATE_EXPORT_HEADER(qtnats)
# ------------- install rules ----------------------
# Install/export rules require cnats from find_package (e.g. vcpkg).
# When cnats is fetched via FetchContent, skip these to avoid conflicts
# with cnats's own export sets. FetchContent consumers use add_subdirectory
# and don't need install targets.
if(NOT CNATS_FETCHED)
install(TARGETS qtnats
EXPORT qtnats-targets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

install(FILES
src/qtnats/qtnats.h
src/qtnats/qtnats_p.h
${CMAKE_CURRENT_BINARY_DIR}/qtnats/qtnats_export.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/qtnats
)

install(EXPORT qtnats-targets
NAMESPACE qtnats::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/qtnats
)

include(CMakePackageConfigHelpers)

configure_package_config_file(
cmake/qtnats-config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/qtnats-config.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/qtnats
)

write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/qtnats-config-version.cmake
COMPATIBILITY SameMajorVersion
)

install(FILES
${CMAKE_CURRENT_BINARY_DIR}/qtnats-config.cmake
${CMAKE_CURRENT_BINARY_DIR}/qtnats-config-version.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/qtnats
)
endif()

# integration tests (these spin up nats server and nats client)
set(BUILD_QT_NATS_INTEGRATION_TESTING OFF CACHE BOOL "Build qtnats integration tests")
if (BUILD_QT_NATS_INTEGRATION_TESTING)
add_executable(test_core test/test_core.cpp)
add_test(NAME test_core COMMAND test_core)
Expand All @@ -66,7 +131,3 @@ if (BUILD_QT_NATS_INTEGRATION_TESTING)
add_test(NAME test_jetstream COMMAND test_jetstream)
target_link_libraries(test_jetstream PRIVATE qtnats Qt::Test)
endif ()

if(COMMAND dc_register_thirdparty_library)
dc_register_thirdparty_library(qtnats)
endif()
10 changes: 10 additions & 0 deletions cmake/qtnats-config.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
@PACKAGE_INIT@

include(CMakeFindDependencyMacro)

find_dependency(cnats CONFIG)
find_dependency(Qt6 COMPONENTS Core)

include("${CMAKE_CURRENT_LIST_DIR}/qtnats-targets.cmake")

check_required_components(qtnats)
21 changes: 10 additions & 11 deletions src/qtnats/qtnats.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
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.
*/

#include <opts.h>

#include <algorithm>

#include <QThread>
Expand All @@ -31,15 +29,16 @@ void QtNats::checkError(natsStatus s)

Options::Options()
{
// don't want to include opts.h in qtnats.h
timeout = NATS_OPTS_DEFAULT_TIMEOUT;
pingInterval = NATS_OPTS_DEFAULT_PING_INTERVAL;
maxPingsOut = NATS_OPTS_DEFAULT_MAX_PING_OUT;
ioBufferSize = NATS_OPTS_DEFAULT_IO_BUF_SIZE;
maxReconnect = NATS_OPTS_DEFAULT_MAX_RECONNECT;
reconnectWait = NATS_OPTS_DEFAULT_RECONNECT_WAIT;
reconnectBufferSize = NATS_OPTS_DEFAULT_RECONNECT_BUF_SIZE;
maxPendingMessages = NATS_OPTS_DEFAULT_MAX_PENDING_MSGS;
// These defaults mirror the cnats opts.h constants.
// We hardcode them to avoid depending on the private cnats header.
timeout = 2000; // NATS_OPTS_DEFAULT_TIMEOUT (ms)
pingInterval = 120000; // NATS_OPTS_DEFAULT_PING_INTERVAL (ms)
maxPingsOut = 2; // NATS_OPTS_DEFAULT_MAX_PING_OUT
ioBufferSize = 32768; // NATS_OPTS_DEFAULT_IO_BUF_SIZE
maxReconnect = 60; // NATS_OPTS_DEFAULT_MAX_RECONNECT
reconnectWait = 2000; // NATS_OPTS_DEFAULT_RECONNECT_WAIT (ms)
reconnectBufferSize = 8 * 1024 * 1024; // NATS_OPTS_DEFAULT_RECONNECT_BUF_SIZE
maxPendingMessages = 65536; // NATS_OPTS_DEFAULT_MAX_PENDING_MSGS
}

static natsOptions* buildNatsOptions(const Options& opts)
Expand Down
4 changes: 2 additions & 2 deletions src/qtnats/qtnats.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ Unless required by applicable law or agreed to in writing, software distributed
#include <QMultiHash>
#include <QSemaphore>

#include <nats.h>
#include <nats/nats.h>

#include <qtnats_export.h>
#include <qtnats/qtnats_export.h>

namespace QtNats {

Expand Down