From 5244eedfef492d427fc6c5b244f6463dff8a737e Mon Sep 17 00:00:00 2001 From: Yunze Xu Date: Mon, 11 Dec 2023 21:34:26 +0800 Subject: [PATCH 1/2] Integrate vcpkg to manage dependencies for all platforms (Windows, Linux, macOS) ### Motivation Currently we manage dependencies by ourselves: - When running unit tests in CI, dependencies are installed from the Debian package management tool `apt` - When verifying macOS build, dependencies are installed from the Homebrew package manager - When verifying Windows build, dependencies are installed via vcpkg but no versions are specified - When building pre-built binaries to release, dependencies are installed by scripts under `pkg/` directories. These scripts download the source code according to `dependencies.yaml` and build It makes the pre-built binaries never tested except for the simple manual tests when voting for a new release. As a result, regression like https://github.com/apache/pulsar-client-cpp/issues/363 could happen. This patch aims at integrating vcpkg to manage dependencies for all platforms, not only for Windows. ### Modifications Integrate the CMakeLists.txt with vcpkg by: 1. Introduce vcpkg as a submodule of this project 2. Update `vcpkg.json` to specify dependency versions. 3. Set `CMAKE_TOOLCHAIN_FILE` with the `vcpkg.cmake` in the submodule. Then, we can simply use `find_package` to find all dependencies and depend on them via a target like `CURL::libcurl` to have all include directores and link libraries. Update the `unit-tests` workflow to verify building the binaries via vcpkg to test. The README is also updated to show how much simpler to build with vcpkg now. ### TODO There are still some tasks that cannot be done by vcpkg: 1. The static library (e.g. `libpulsarwithdeps.a`) that bundles all 3rd-party dependencies. 2. The pre-built binaries are still built by scripts under `./pkg` directory. Specifically, vcpkg does not work with GCC 4.8 so on CentOS 7 we still need to build dependencies manually. So the previous CMakeLists.txt are retained and will be used if `INTEGRATE_VCPKG` is OFF (by default). They will be removed until the task above can be done by vcpkg in future. We also need to update `dependencies.yaml` to be consistent with `vcpkg.json` if all tasks above cannot be replaced by vcpkg. --- .github/workflows/ci-pr-validation.yaml | 46 ++-- .gitmodules | 3 + CMakeLists.txt | 341 ++++-------------------- LEGACY_BUILD.md | 250 +++++++++++++++++ LegacyFindPackages.cmake | 312 ++++++++++++++++++++++ README.md | 242 +++-------------- examples/CMakeLists.txt | 5 + lib/CMakeLists.txt | 47 +++- perf/BuildPerf.cmake | 24 ++ perf/CMakeLists.txt | 23 +- perf/LegacyBuildPerf.cmake | 37 +++ tests/BuildTests.cmake | 57 ++++ tests/CMakeLists.txt | 60 +---- tests/LegacyBuildTests.cmake | 77 ++++++ vcpkg | 1 + vcpkg.json | 115 ++++++-- 16 files changed, 1020 insertions(+), 620 deletions(-) create mode 100644 .gitmodules create mode 100644 LEGACY_BUILD.md create mode 100644 LegacyFindPackages.cmake create mode 100644 perf/BuildPerf.cmake create mode 100644 perf/LegacyBuildPerf.cmake create mode 100644 tests/BuildTests.cmake create mode 100644 tests/LegacyBuildTests.cmake create mode 160000 vcpkg diff --git a/.github/workflows/ci-pr-validation.yaml b/.github/workflows/ci-pr-validation.yaml index 80e1a1d3..20d1e14e 100644 --- a/.github/workflows/ci-pr-validation.yaml +++ b/.github/workflows/ci-pr-validation.yaml @@ -65,40 +65,40 @@ jobs: steps: - name: checkout uses: actions/checkout@v3 + with: + fetch-depth: 0 + submodules: recursive - - name: Install deps - run: | - sudo apt-get update -y && \ - sudo apt-get install -y \ - libcurl4-openssl-dev \ - protobuf-compiler \ - libprotobuf-dev \ - libboost-dev \ - libboost-program-options-dev \ - libzstd-dev \ - libsnappy-dev \ - libgmock-dev \ - libgtest-dev - - - name: Install gtest-parallel + - name: Build core libraries run: | - sudo curl -o /gtest-parallel https://raw.githubusercontent.com/google/gtest-parallel/master/gtest_parallel.py - - - name: CMake - run: cmake . -DCMAKE_BUILD_TYPE=Debug -DBUILD_PERF_TOOLS=ON + cmake . -DINTEGRATE_VCPKG=ON -DBUILD_TESTS=OFF + cmake --build . -j8 - name: Check formatting - run: make check-format + run: | + ./vcpkg/vcpkg format-manifest vcpkg.json + if [[ $(git diff | wc -l) -gt 0 ]]; then + echo "Please run `./vcpkg/vcpkg format-manifest vcpkg.json` to reformat vcpkg.json" + fi + make check-format - - name: Build + - name: Build tests run: | - # Build the libraries first to avoid possible link failures - cmake --build . -j8 --target pulsarShared pulsarStatic + cmake . -DINTEGRATE_VCPKG=ON -DBUILD_TESTS=ON cmake --build . -j8 + - name: Install gtest-parallel + run: | + sudo curl -o /gtest-parallel https://raw.githubusercontent.com/google/gtest-parallel/master/gtest_parallel.py + - name: Run unit tests run: RETRY_FAILED=3 ./run-unit-tests.sh + - name: Build perf tools + run: | + cmake . -DINTEGRATE_VCPKG=ON -DBUILD_TESTS=ON -DBUILD_PERF_TOOLS=ON + cmake --build . -j8 + cpp20-build: name: Build with the C++20 standard runs-on: ubuntu-22.04 diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..a0a57f3d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "vcpkg"] + path = vcpkg + url = https://github.com/microsoft/vcpkg.git diff --git a/CMakeLists.txt b/CMakeLists.txt index fb4f1b12..5bde2b77 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,23 @@ cmake_minimum_required(VERSION 3.13) +option(INTEGRATE_VCPKG "Integrate with Vcpkg" OFF) +if (INTEGRATE_VCPKG) + set(CMAKE_TOOLCHAIN_FILE "${CMAKE_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake") +endif () + +option(BUILD_TESTS "Build tests" ON) +message(STATUS "BUILD_TESTS: " ${BUILD_TESTS}) +if (BUILD_TESTS) + list(APPEND VCPKG_MANIFEST_FEATURES "tests") +endif () + +option(BUILD_PERF_TOOLS "Build Pulsar CLI perf producer/consumer" OFF) +message(STATUS "BUILD_PERF_TOOLS: " ${BUILD_PERF_TOOLS}) +if (BUILD_PERF_TOOLS) + list(APPEND VCPKG_MANIFEST_FEATURES "perf") +endif () + project (pulsar-cpp) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake_modules") @@ -33,30 +50,6 @@ message(STATUS "Pulsar Client version macro: ${PULSAR_CLIENT_VERSION_MACRO}") set(PVM_COMMENT "This is generated from Version.h.in by CMAKE. DO NOT EDIT DIRECTLY") configure_file(templates/Version.h.in include/pulsar/Version.h @ONLY) -option(LINK_STATIC "Link against static libraries" OFF) -if (VCPKG_TRIPLET) - message(STATUS "Use vcpkg, triplet is ${VCPKG_TRIPLET}") - set(CMAKE_PREFIX_PATH "${PROJECT_SOURCE_DIR}/vcpkg_installed/${VCPKG_TRIPLET}") - message(STATUS "Use CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}") - set(PROTOC_PATH "${CMAKE_PREFIX_PATH}/tools/protobuf/protoc") - message(STATUS "Use protoc: ${PROTOC_PATH}") - set(VCPKG_ROOT "${PROJECT_SOURCE_DIR}/vcpkg_installed/${VCPKG_TRIPLET}") - set(VCPKG_DEBUG_ROOT "${VCPKG_ROOT}/debug") - if (CMAKE_BUILD_TYPE STREQUAL "Debug") - set(ZLIB_ROOT ${VCPKG_DEBUG_ROOT}) - set(OPENSSL_ROOT_DIR ${VCPKG_ROOT} ${VCPKG_DEBUG_ROOT}) - set(CMAKE_PREFIX_PATH ${VCPKG_DEBUG_ROOT} ${CMAKE_PREFIX_PATH}) - else () - set(OPENSSL_ROOT_DIR ${VCPKG_ROOT}) - endif () - if (VCPKG_TRIPLET MATCHES ".*-static") - set(LINK_STATIC ON) - else () - set(LINK_STATIC OFF) - endif () -endif() -MESSAGE(STATUS "LINK_STATIC: " ${LINK_STATIC}) - find_program(CCACHE_PROGRAM ccache) if(CCACHE_PROGRAM) set(CMAKE_CXX_COMPILER_LAUNCHER "ccache") @@ -71,12 +64,6 @@ MESSAGE(STATUS "BUILD_DYNAMIC_LIB: " ${BUILD_DYNAMIC_LIB}) option(BUILD_STATIC_LIB "Build static lib" ON) MESSAGE(STATUS "BUILD_STATIC_LIB: " ${BUILD_STATIC_LIB}) -option(BUILD_TESTS "Build tests" ON) -MESSAGE(STATUS "BUILD_TESTS: " ${BUILD_TESTS}) - -option(BUILD_PERF_TOOLS "Build Pulsar CLI perf producer/consumer" OFF) -MESSAGE(STATUS "BUILD_PERF_TOOLS: " ${BUILD_PERF_TOOLS}) - IF (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RelWithDebInfo) ENDIF () @@ -87,25 +74,6 @@ set(THREADS_PREFER_PTHREAD_FLAG TRUE) find_package(Threads REQUIRED) MESSAGE(STATUS "Threads library: " ${CMAKE_THREAD_LIBS_INIT}) -set(Boost_NO_BOOST_CMAKE ON) - -if (APPLE AND NOT LINK_STATIC) - # The latest Protobuf dependency on macOS requires the C++17 support and - # it could only be found by the CONFIG mode - set(LATEST_PROTOBUF TRUE) -else () - set(LATEST_PROTOBUF FALSE) -endif () - -if (NOT CMAKE_CXX_STANDARD) - if (LATEST_PROTOBUF) - set(CMAKE_CXX_STANDARD 17) - else () - set(CMAKE_CXX_STANDARD 11) - endif () -endif () -set(CMAKE_C_STANDARD 11) - # Compiler specific configuration: # https://stackoverflow.com/questions/10046114/in-cmake-how-can-i-test-if-the-compiler-is-clang if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") @@ -133,255 +101,44 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON) add_definitions(-DBUILDING_PULSAR -DBOOST_ALL_NO_LIB -DBOOST_ALLOW_DEPRECATED_HEADERS) -# For dependencies other than OpenSSL, dynamic libraries are forbidden to link when LINK_STATIC is ON -if (LINK_STATIC) - if (NOT MSVC) - set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") - endif() -endif () - -find_package(Boost REQUIRED) -message("Boost_INCLUDE_DIRS: " ${Boost_INCLUDE_DIRS}) - -set(OPENSSL_ROOT_DIR ${OPENSSL_ROOT_DIR} /usr/lib64/) -if (APPLE) - set(OPENSSL_ROOT_DIR ${OPENSSL_ROOT_DIR} /usr/local/opt/openssl/ /opt/homebrew/opt/openssl) -endif () -find_package(OpenSSL REQUIRED) -message("OPENSSL_INCLUDE_DIR: " ${OPENSSL_INCLUDE_DIR}) -message("OPENSSL_LIBRARIES: " ${OPENSSL_LIBRARIES}) - -if (LATEST_PROTOBUF) - # See https://github.com/apache/arrow/issues/35987 - add_definitions(-DPROTOBUF_USE_DLLS) - # Use Config mode to avoid FindProtobuf.cmake does not find the Abseil library - find_package(Protobuf REQUIRED CONFIG) -else () - find_package(Protobuf REQUIRED) -endif () -message("Protobuf_INCLUDE_DIRS: " ${Protobuf_INCLUDE_DIRS}) -message("Protobuf_LIBRARIES: " ${Protobuf_LIBRARIES}) - -# NOTE: CMake might not find curl and zlib on some platforms like Ubuntu, in this case, find them manually -set(CURL_NO_CURL_CMAKE ON) -find_package(curl QUIET) -if (NOT CURL_FOUND) - find_path(CURL_INCLUDE_DIRS NAMES curl/curl.h) - find_library(CURL_LIBRARIES NAMES curl curllib libcurl_imp curllib_static libcurl) -endif () -message("CURL_INCLUDE_DIRS: " ${CURL_INCLUDE_DIRS}) -message("CURL_LIBRARIES: " ${CURL_LIBRARIES}) -if (NOT CURL_INCLUDE_DIRS OR NOT CURL_LIBRARIES) - message(FATAL_ERROR "Could not find libcurl") -endif () - -find_package(zlib QUIET) -if (NOT ZLIB_FOUND) - find_path(ZLIB_INCLUDE_DIRS NAMES zlib.h) - find_library(ZLIB_LIBRARIES NAMES z zlib zdll zlib1 zlibstatic) -endif () -message("ZLIB_INCLUDE_DIRS: " ${ZLIB_INCLUDE_DIRS}) -message("ZLIB_LIBRARIES: " ${ZLIB_LIBRARIES}) -if (NOT ZLIB_INCLUDE_DIRS OR NOT ZLIB_LIBRARIES) - message(FATAL_ERROR "Could not find zlib") -endif () - -if (LINK_STATIC AND NOT VCPKG_TRIPLET) - find_library(LIB_ZSTD NAMES libzstd.a) - message(STATUS "ZStd: ${LIB_ZSTD}") - find_library(LIB_SNAPPY NAMES libsnappy.a) - message(STATUS "LIB_SNAPPY: ${LIB_SNAPPY}") +set(AUTOGEN_DIR ${PROJECT_BINARY_DIR}/generated) +file(MAKE_DIRECTORY ${AUTOGEN_DIR}) - if (MSVC) - add_definitions(-DCURL_STATICLIB) - endif() -elseif (LINK_STATIC AND VCPKG_TRIPLET) - find_package(Protobuf REQUIRED) - message(STATUS "Found protobuf static library: " ${Protobuf_LIBRARIES}) - if (MSVC AND (${CMAKE_BUILD_TYPE} STREQUAL Debug)) - find_library(ZLIB_LIBRARIES NAMES zlibd) - else () - find_library(ZLIB_LIBRARIES NAMES zlib z) - endif () - if (ZLIB_LIBRARIES) - message(STATUS "Found zlib static library: " ${ZLIB_LIBRARIES}) - else () - message(FATAL_ERROR "Failed to find zlib static library") - endif () - if (MSVC AND (${CMAKE_BUILD_TYPE} STREQUAL Debug)) - find_library(CURL_LIBRARIES NAMES libcurl-d) - else () - find_library(CURL_LIBRARIES NAMES libcurl) - endif () - if (CURL_LIBRARIES) - message(STATUS "Found libcurl: ${CURL_LIBRARIES}") - else () - message(FATAL_ERROR "Cannot find libcurl") - endif () - find_library(LIB_ZSTD zstd) - if (LIB_ZSTD) - message(STATUS "Found ZSTD library: ${LIB_ZSTD}") - endif () - find_library(LIB_SNAPPY NAMES snappy) - if (LIB_SNAPPY) - message(STATUS "Found Snappy library: ${LIB_SNAPPY}") +if (INTEGRATE_VCPKG) + if (NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 11) endif () -else() - if (MSVC AND (${CMAKE_BUILD_TYPE} STREQUAL Debug)) - find_library(LIB_ZSTD zstdd HINTS "${VCPKG_DEBUG_ROOT}/lib") - else () - find_library(LIB_ZSTD zstd) + set(CMAKE_C_STANDARD 11) + set(Boost_NO_BOOST_CMAKE ON) + find_package(Boost REQUIRED) + include_directories(${Boost_INCLUDE_DIRS}) + message("Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}") + + set(CURL_NO_CURL_CMAKE ON) + find_package(CURL REQUIRED) + find_package(ZLIB REQUIRED) + find_package(OpenSSL REQUIRED) + find_package(protobuf CONFIG REQUIRED) + find_package(zstd CONFIG REQUIRED) + find_package(Snappy CONFIG REQUIRED) + set(COMMON_LIBS CURL::libcurl + ZLIB::ZLIB + OpenSSL::SSL + OpenSSL::Crypto + protobuf::libprotobuf + $,zstd::libzstd_shared,zstd::libzstd_static> + Snappy::snappy + ) + add_definitions(-DHAS_ZSTD -DHAS_SNAPPY) + if (MSVC) + find_package(dlfcn-win32 CONFIG REQUIRED) endif () - if (MSVC AND (${CMAKE_BUILD_TYPE} STREQUAL Debug)) - find_library(LIB_SNAPPY NAMES snappyd HINTS "${VCPKG_DEBUG_ROOT}/lib") - else () - find_library(LIB_SNAPPY NAMES snappy libsnappy) + if (BUILD_PERF_TOOLS) + find_package(Boost COMPONENTS program_options REQUIRED) endif () -endif () - -if (Boost_MAJOR_VERSION EQUAL 1 AND Boost_MINOR_VERSION LESS 69) - # Boost System does not require linking since 1.69 - set(BOOST_COMPONENTS ${BOOST_COMPONENTS} system) - MESSAGE(STATUS "Linking with Boost:System") -endif() - -if (MSVC) - set(BOOST_COMPONENTS ${BOOST_COMPONENTS} date_time) -endif() - -if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) - # GCC 4.8.2 implementation of std::regex is buggy - set(BOOST_COMPONENTS ${BOOST_COMPONENTS} regex) - set(CMAKE_CXX_FLAGS " -DPULSAR_USE_BOOST_REGEX") - MESSAGE(STATUS "Using Boost::Regex") -elseif (CMAKE_COMPILER_IS_GNUCC) - MESSAGE(STATUS "Using std::regex") - # Turn on color error messages and show additional help with errors (only available in GCC v4.9+): - add_compile_options(-fdiagnostics-show-option -fdiagnostics-color) -endif() - -if(BUILD_PERF_TOOLS) - set(BOOST_COMPONENTS ${BOOST_COMPONENTS} program_options) -endif() - -find_package(Boost REQUIRED COMPONENTS ${BOOST_COMPONENTS}) - -if (BUILD_TESTS) - find_path(GTEST_INCLUDE_PATH gtest/gtest.h) - find_path(GMOCK_INCLUDE_PATH gmock/gmock.h) -endif () - -if (NOT APPLE AND NOT MSVC) - # Hide all non-exported symbols to avoid conflicts - add_compile_options(-fvisibility=hidden) - if (CMAKE_COMPILER_IS_GNUCC) - add_link_options(-Wl,--exclude-libs=ALL) - endif () -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) + include(./LegacyFindPackages.cmake) endif () -MESSAGE(STATUS "HAS_SNAPPY: ${HAS_SNAPPY}") - -set(ADDITIONAL_LIBRARIES $ENV{PULSAR_ADDITIONAL_LIBRARIES}) -link_directories( $ENV{PULSAR_ADDITIONAL_LIBRARY_PATH} ) - -set(AUTOGEN_DIR ${PROJECT_BINARY_DIR}/generated) -file(MAKE_DIRECTORY ${AUTOGEN_DIR}) - -include_directories( - ${PROJECT_SOURCE_DIR} - ${PROJECT_SOURCE_DIR}/include - ${PROJECT_BINARY_DIR}/include - ${AUTOGEN_DIR} - ${Boost_INCLUDE_DIRS} - ${OPENSSL_INCLUDE_DIR} - ${ZLIB_INCLUDE_DIRS} - ${CURL_INCLUDE_DIRS} - ${Protobuf_INCLUDE_DIRS} - ${GTEST_INCLUDE_PATH} - ${GMOCK_INCLUDE_PATH} -) - -set(COMMON_LIBS - ${COMMON_LIBS} - ${CMAKE_THREAD_LIBS_INIT} - ${Boost_REGEX_LIBRARY} - ${Boost_SYSTEM_LIBRARY} - ${Boost_DATE_TIME_LIBRARY} - ${CURL_LIBRARIES} - ${OPENSSL_LIBRARIES} - ${ZLIB_LIBRARIES} - ${ADDITIONAL_LIBRARIES} - ${CMAKE_DL_LIBS} -) - -if (LATEST_PROTOBUF) - # Protobuf_LIBRARIES is empty when finding Protobuf in Config mode - set(COMMON_LIBS ${COMMON_LIBS} protobuf::libprotobuf) -else () - set(COMMON_LIBS ${COMMON_LIBS} ${Protobuf_LIBRARIES}) -endif () - -if (MSVC) - set(COMMON_LIBS - ${COMMON_LIBS} - ${Boost_DATE_TIME_LIBRARY} - wldap32.lib - Normaliz.lib) - if (LINK_STATIC) - # add external dependencies of libcurl - set(COMMON_LIBS ${COMMON_LIBS} ws2_32.lib crypt32.lib) - # the default compile options have /MD, which cannot be used to build DLLs that link static libraries - string(REGEX REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}) - string(REGEX REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}) - string(REGEX REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}) - message(STATUS "CMAKE_CXX_FLAGS_DEBUG: " ${CMAKE_CXX_FLAGS_DEBUG}) - message(STATUS "CMAKE_CXX_FLAGS_RELEASE: " ${CMAKE_CXX_FLAGS_RELEASE}) - message(STATUS "CMAKE_CXX_FLAGS_RELWITHDEBINFO: " ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}) - endif () -else() - set(COMMON_LIBS ${COMMON_LIBS} m) -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(${PROJECT_BINARY_DIR}/lib) set(LIB_NAME $ENV{PULSAR_LIBRARY_NAME}) if (NOT LIB_NAME) diff --git a/LEGACY_BUILD.md b/LEGACY_BUILD.md new file mode 100644 index 00000000..0920e2b5 --- /dev/null +++ b/LEGACY_BUILD.md @@ -0,0 +1,250 @@ + + +# Build without vcpkg + +## Requirements + +- A C++ compiler that supports C++11, like GCC >= 4.8 +- CMake >= 3.13 +- [Boost](http://www.boost.org/) +- [Protocol Buffer](https://developers.google.com/protocol-buffers/) >= 3 +- [libcurl](https://curl.se/libcurl/) +- [openssl](https://github.com/openssl/openssl) + +The default supported [compression types](include/pulsar/CompressionType.h) are: + +- `CompressionNone` +- `CompressionLZ4` + +If you want to enable other compression types, you need to install: + +- `CompressionZLib`: [zlib](https://zlib.net/) +- `CompressionZSTD`: [zstd](https://github.com/facebook/zstd) +- `CompressionSNAPPY`: [snappy](https://github.com/google/snappy) + +If you want to build and run the tests, you need to install [GTest](https://github.com/google/googletest). Otherwise, you need to add CMake option `-DBUILD_TESTS=OFF`. + +The [dependencies.yaml](./dependencies.yaml) file provides the recommended dependency versions, while you can still build from source with other dependency versions. If a dependency requires a higher C++ standard, e.g. C++14, you can specify the standard like: + +```bash +cmake . -DCMAKE_CXX_STANDARD=14 +``` + +> **Note**: +> +> On macOS, the default C++ standard is 17 because the latest Protobuf from Homebrew requires the C++17 support. + +## Compilation + +### Clone + +First of all, clone the source code: + +```shell +git clone https://github.com/apache/pulsar-client-cpp +cd pulsar-client-cpp +``` + +### Compile on Ubuntu + +#### Install all dependencies: + +```shell +sudo apt-get update -y && sudo apt-get install -y g++ cmake libssl-dev libcurl4-openssl-dev \ + libprotobuf-dev libboost-all-dev libgtest-dev libgmock-dev \ + protobuf-compiler +``` + +#### Compile Pulsar client library: + +```shell +cmake . +make +``` + +If you want to build performance tools, you need to run: + +```shell +cmake . -DBUILD_PERF_TOOLS=ON +make +``` + +#### Checks + +Client library will be placed in: + +``` +lib/libpulsar.so +lib/libpulsar.a +``` + +Examples will be placed in: + +``` +examples/ +``` + +Tools will be placed in: + +``` +perf/perfProducer +perf/perfConsumer +``` + +### Compile on Mac OS X + +#### Install all dependencies: + +```shell +brew install cmake openssl protobuf boost googletest zstd snappy +``` + +#### Compile Pulsar client library: + +```shell +cmake . +make +``` + +If you want to build performance tools, you need to run: + +```shell +cmake . -DBUILD_PERF_TOOLS=ON +make +``` + +#### Checks + +Client library will be placed in: + +``` +lib/libpulsar.dylib +lib/libpulsar.a +``` + +Examples will be placed in: + +``` +examples/ +``` + +Tools will be placed in: + +``` +perf/perfProducer +perf/perfConsumer +``` + +### Compile on Windows + +#### Install with [vcpkg](https://github.com/microsoft/vcpkg) + +It's highly recommended to use `vcpkg` for C++ package management on Windows. It's easy to install and well supported by Visual Studio (2015/2017/2019) and CMake. See [here](https://github.com/microsoft/vcpkg#quick-start-windows) for quick start. + +Take Windows 64-bit library as an example, you only need to run + +```bash +vcpkg install --feature-flags=manifests --triplet x64-windows +``` + +> **NOTE**: +> +> For Windows 32-bit library, change `x64-windows` to `x86-windows`, see [here](https://github.com/microsoft/vcpkg/blob/master/docs/users/triplets.md) for more details about the triplet concept in Vcpkg. + +The all dependencies, which are specified by [vcpkg.json](vcpkg.json), will be installed in `vcpkg_installed/` subdirectory, + +With `vcpkg`, you only need to run two commands: + +```bash +cmake \ + -B ./build \ + -A x64 \ + -DBUILD_TESTS=OFF \ + -DVCPKG_TRIPLET=x64-windows \ + -DCMAKE_BUILD_TYPE=Release \ + -S . +cmake --build ./build --config Release +``` + +Then all artifacts will be built into `build` subdirectory. + +> **NOTE**: +> +> 1. For Windows 32-bit, you need to use `-A Win32` and `-DVCPKG_TRIPLET=x86-windows`. +> 2. For MSVC Debug mode, you need to replace `Release` with `Debug` for both `CMAKE_BUILD_TYPE` variable and `--config` option. + +#### Install dependencies manually + +You need to install [dlfcn-win32](https://github.com/dlfcn-win32/dlfcn-win32) in addition. + +If you installed the dependencies manually, you need to run + +```shell +#If all dependencies are in your path, all that is necessary is +cmake . + +#if all dependencies are not in your path, then passing in a PROTOC_PATH and CMAKE_PREFIX_PATH is necessary +cmake -DPROTOC_PATH=C:/protobuf/bin/protoc -DCMAKE_PREFIX_PATH="C:/boost;C:/openssl;C:/zlib;C:/curl;C:/protobuf;C:/googletest;C:/dlfcn-win32" . + +#This will generate pulsar-cpp.sln. Open this in Visual Studio and build the desired configurations. +``` + +#### Checks + +Client library will be placed in: + +``` +build/lib/Release/pulsar.lib +build/lib/Release/pulsar.dll +``` + +#### Examples + +Add Windows environment paths: + +``` +build/lib/Release +vcpkg_installed +``` + +Examples will be available in: + +``` +build/examples/Release +``` + +## Tests + +```shell +# Execution +# Start standalone broker +./pulsar-test-service-start.sh + +# Run the tests +cd tests +./pulsar-tests + +# When no longer needed, stop standalone broker +./pulsar-test-service-stop.sh +``` + + diff --git a/LegacyFindPackages.cmake b/LegacyFindPackages.cmake new file mode 100644 index 00000000..10c9fa7c --- /dev/null +++ b/LegacyFindPackages.cmake @@ -0,0 +1,312 @@ +# +# 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. +# + +option(LINK_STATIC "Link against static libraries" OFF) +if (VCPKG_TRIPLET) + message(STATUS "Use vcpkg, triplet is ${VCPKG_TRIPLET}") + set(CMAKE_PREFIX_PATH "${PROJECT_SOURCE_DIR}/vcpkg_installed/${VCPKG_TRIPLET}") + message(STATUS "Use CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}") + set(PROTOC_PATH "${CMAKE_PREFIX_PATH}/tools/protobuf/protoc") + message(STATUS "Use protoc: ${PROTOC_PATH}") + set(VCPKG_ROOT "${PROJECT_SOURCE_DIR}/vcpkg_installed/${VCPKG_TRIPLET}") + set(VCPKG_DEBUG_ROOT "${VCPKG_ROOT}/debug") + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(ZLIB_ROOT ${VCPKG_DEBUG_ROOT}) + set(OPENSSL_ROOT_DIR ${VCPKG_ROOT} ${VCPKG_DEBUG_ROOT}) + set(CMAKE_PREFIX_PATH ${VCPKG_DEBUG_ROOT} ${CMAKE_PREFIX_PATH}) + else () + set(OPENSSL_ROOT_DIR ${VCPKG_ROOT}) + endif () + if (VCPKG_TRIPLET MATCHES ".*-static") + set(LINK_STATIC ON) + else () + set(LINK_STATIC OFF) + endif () +endif() +MESSAGE(STATUS "LINK_STATIC: " ${LINK_STATIC}) + +if (MSVC) + find_package(dlfcn-win32 REQUIRED) +endif () + +set(Boost_NO_BOOST_CMAKE ON) + +if (APPLE AND NOT LINK_STATIC) + # The latest Protobuf dependency on macOS requires the C++17 support and + # it could only be found by the CONFIG mode + set(LATEST_PROTOBUF TRUE) +else () + set(LATEST_PROTOBUF FALSE) +endif () + +if (NOT CMAKE_CXX_STANDARD) + if (LATEST_PROTOBUF) + set(CMAKE_CXX_STANDARD 17) + else () + set(CMAKE_CXX_STANDARD 11) + endif () +endif () +set(CMAKE_C_STANDARD 11) + +# For dependencies other than OpenSSL, dynamic libraries are forbidden to link when LINK_STATIC is ON +if (LINK_STATIC) + if (NOT MSVC) + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") + endif() +endif () + +find_package(Boost REQUIRED) +message("Boost_INCLUDE_DIRS: " ${Boost_INCLUDE_DIRS}) + +set(OPENSSL_ROOT_DIR ${OPENSSL_ROOT_DIR} /usr/lib64/) +if (APPLE) + set(OPENSSL_ROOT_DIR ${OPENSSL_ROOT_DIR} /usr/local/opt/openssl/ /opt/homebrew/opt/openssl) +endif () +find_package(OpenSSL REQUIRED) +message("OPENSSL_INCLUDE_DIR: " ${OPENSSL_INCLUDE_DIR}) +message("OPENSSL_LIBRARIES: " ${OPENSSL_LIBRARIES}) + +if (LATEST_PROTOBUF) + # See https://github.com/apache/arrow/issues/35987 + add_definitions(-DPROTOBUF_USE_DLLS) + # Use Config mode to avoid FindProtobuf.cmake does not find the Abseil library + find_package(Protobuf REQUIRED CONFIG) +else () + find_package(Protobuf REQUIRED) +endif () +message("Protobuf_INCLUDE_DIRS: " ${Protobuf_INCLUDE_DIRS}) +message("Protobuf_LIBRARIES: " ${Protobuf_LIBRARIES}) + +# NOTE: CMake might not find curl and zlib on some platforms like Ubuntu, in this case, find them manually +set(CURL_NO_CURL_CMAKE ON) +find_package(curl QUIET) +if (NOT CURL_FOUND) + find_path(CURL_INCLUDE_DIRS NAMES curl/curl.h) + find_library(CURL_LIBRARIES NAMES curl curllib libcurl_imp curllib_static libcurl) +endif () +message("CURL_INCLUDE_DIRS: " ${CURL_INCLUDE_DIRS}) +message("CURL_LIBRARIES: " ${CURL_LIBRARIES}) +if (NOT CURL_INCLUDE_DIRS OR NOT CURL_LIBRARIES) + message(FATAL_ERROR "Could not find libcurl") +endif () + +find_package(zlib QUIET) +if (NOT ZLIB_FOUND) + find_path(ZLIB_INCLUDE_DIRS NAMES zlib.h) + find_library(ZLIB_LIBRARIES NAMES z zlib zdll zlib1 zlibstatic) +endif () +message("ZLIB_INCLUDE_DIRS: " ${ZLIB_INCLUDE_DIRS}) +message("ZLIB_LIBRARIES: " ${ZLIB_LIBRARIES}) +if (NOT ZLIB_INCLUDE_DIRS OR NOT ZLIB_LIBRARIES) + message(FATAL_ERROR "Could not find zlib") +endif () + +if (LINK_STATIC AND NOT VCPKG_TRIPLET) + find_library(LIB_ZSTD NAMES libzstd.a) + message(STATUS "ZStd: ${LIB_ZSTD}") + find_library(LIB_SNAPPY NAMES libsnappy.a) + message(STATUS "LIB_SNAPPY: ${LIB_SNAPPY}") + + if (MSVC) + add_definitions(-DCURL_STATICLIB) + endif() +elseif (LINK_STATIC AND VCPKG_TRIPLET) + find_package(Protobuf REQUIRED) + message(STATUS "Found protobuf static library: " ${Protobuf_LIBRARIES}) + if (MSVC AND (${CMAKE_BUILD_TYPE} STREQUAL Debug)) + find_library(ZLIB_LIBRARIES NAMES zlibd) + else () + find_library(ZLIB_LIBRARIES NAMES zlib z) + endif () + if (ZLIB_LIBRARIES) + message(STATUS "Found zlib static library: " ${ZLIB_LIBRARIES}) + else () + message(FATAL_ERROR "Failed to find zlib static library") + endif () + if (MSVC AND (${CMAKE_BUILD_TYPE} STREQUAL Debug)) + find_library(CURL_LIBRARIES NAMES libcurl-d) + else () + find_library(CURL_LIBRARIES NAMES libcurl) + endif () + if (CURL_LIBRARIES) + message(STATUS "Found libcurl: ${CURL_LIBRARIES}") + else () + message(FATAL_ERROR "Cannot find libcurl") + endif () + find_library(LIB_ZSTD zstd) + if (LIB_ZSTD) + message(STATUS "Found ZSTD library: ${LIB_ZSTD}") + endif () + find_library(LIB_SNAPPY NAMES snappy) + if (LIB_SNAPPY) + message(STATUS "Found Snappy library: ${LIB_SNAPPY}") + endif () +else() + if (MSVC AND (${CMAKE_BUILD_TYPE} STREQUAL Debug)) + find_library(LIB_ZSTD zstdd HINTS "${VCPKG_DEBUG_ROOT}/lib") + else () + find_library(LIB_ZSTD zstd) + endif () + if (MSVC AND (${CMAKE_BUILD_TYPE} STREQUAL Debug)) + find_library(LIB_SNAPPY NAMES snappyd HINTS "${VCPKG_DEBUG_ROOT}/lib") + else () + find_library(LIB_SNAPPY NAMES snappy libsnappy) + endif () +endif () + +if (Boost_MAJOR_VERSION EQUAL 1 AND Boost_MINOR_VERSION LESS 69) + # Boost System does not require linking since 1.69 + set(BOOST_COMPONENTS ${BOOST_COMPONENTS} system) + MESSAGE(STATUS "Linking with Boost:System") +endif() + +if (MSVC) + set(BOOST_COMPONENTS ${BOOST_COMPONENTS} date_time) +endif() + +if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) + # GCC 4.8.2 implementation of std::regex is buggy + set(BOOST_COMPONENTS ${BOOST_COMPONENTS} regex) + set(CMAKE_CXX_FLAGS " -DPULSAR_USE_BOOST_REGEX") + MESSAGE(STATUS "Using Boost::Regex") +elseif (CMAKE_COMPILER_IS_GNUCC) + MESSAGE(STATUS "Using std::regex") + # Turn on color error messages and show additional help with errors (only available in GCC v4.9+): + add_compile_options(-fdiagnostics-show-option -fdiagnostics-color) +endif() + +if(BUILD_PERF_TOOLS) + set(BOOST_COMPONENTS ${BOOST_COMPONENTS} program_options) +endif() + +find_package(Boost REQUIRED COMPONENTS ${BOOST_COMPONENTS}) + +if (BUILD_TESTS) + find_path(GTEST_INCLUDE_PATH gtest/gtest.h) + find_path(GMOCK_INCLUDE_PATH gmock/gmock.h) +endif () + +if (NOT APPLE AND NOT MSVC) + # Hide all non-exported symbols to avoid conflicts + add_compile_options(-fvisibility=hidden) + if (CMAKE_COMPILER_IS_GNUCC) + add_link_options(-Wl,--exclude-libs=ALL) + endif () +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} ) + +include_directories( + ${PROJECT_SOURCE_DIR} + ${PROJECT_SOURCE_DIR}/include + ${PROJECT_BINARY_DIR}/include + ${AUTOGEN_DIR} + ${Boost_INCLUDE_DIRS} + ${OPENSSL_INCLUDE_DIR} + ${ZLIB_INCLUDE_DIRS} + ${CURL_INCLUDE_DIRS} + ${Protobuf_INCLUDE_DIRS} + ${GTEST_INCLUDE_PATH} + ${GMOCK_INCLUDE_PATH} +) + +set(COMMON_LIBS + ${COMMON_LIBS} + ${CMAKE_THREAD_LIBS_INIT} + ${Boost_REGEX_LIBRARY} + ${Boost_SYSTEM_LIBRARY} + ${Boost_DATE_TIME_LIBRARY} + ${CURL_LIBRARIES} + ${OPENSSL_LIBRARIES} + ${ZLIB_LIBRARIES} + ${ADDITIONAL_LIBRARIES} + ${CMAKE_DL_LIBS} +) + +if (LATEST_PROTOBUF) + # Protobuf_LIBRARIES is empty when finding Protobuf in Config mode + set(COMMON_LIBS ${COMMON_LIBS} protobuf::libprotobuf) +else () + set(COMMON_LIBS ${COMMON_LIBS} ${Protobuf_LIBRARIES}) +endif () + +if (MSVC) + set(COMMON_LIBS + ${COMMON_LIBS} + ${Boost_DATE_TIME_LIBRARY} + wldap32.lib + Normaliz.lib) + if (LINK_STATIC) + # add external dependencies of libcurl + set(COMMON_LIBS ${COMMON_LIBS} ws2_32.lib crypt32.lib) + # the default compile options have /MD, which cannot be used to build DLLs that link static libraries + string(REGEX REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}) + string(REGEX REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}) + string(REGEX REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}) + message(STATUS "CMAKE_CXX_FLAGS_DEBUG: " ${CMAKE_CXX_FLAGS_DEBUG}) + message(STATUS "CMAKE_CXX_FLAGS_RELEASE: " ${CMAKE_CXX_FLAGS_RELEASE}) + message(STATUS "CMAKE_CXX_FLAGS_RELWITHDEBINFO: " ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}) + endif () +else() + set(COMMON_LIBS ${COMMON_LIBS} m) +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(${PROJECT_BINARY_DIR}/lib) diff --git a/README.md b/README.md index 055fb8fd..bd574797 100644 --- a/README.md +++ b/README.md @@ -31,239 +31,83 @@ For how to use APIs to publish and consume messages, see [examples](https://gith Pulsar C++ client uses [doxygen](https://www.doxygen.nl) to build API documents. After installing `doxygen`, you only need to run `doxygen` to generate the API documents whose main page is under the `doxygen/html/index.html` path. -## Requirements +## Build with vcpkg -- A C++ compiler that supports C++11, like GCC >= 4.8 -- CMake >= 3.13 -- [Boost](http://www.boost.org/) -- [Protocol Buffer](https://developers.google.com/protocol-buffers/) >= 3 -- [libcurl](https://curl.se/libcurl/) -- [openssl](https://github.com/openssl/openssl) +Since it's integrated with vcpkg, see [vcpkg#README](https://github.com/microsoft/vcpkg#readme) for the requirements. See [LEGACY_BUILD](./LEGACY_BUILD.md) if you want to manage dependencies by yourself or you cannot install vcpkg in your own environment. -The default supported [compression types](include/pulsar/CompressionType.h) are: - -- `CompressionNone` -- `CompressionLZ4` - -If you want to enable other compression types, you need to install: - -- `CompressionZLib`: [zlib](https://zlib.net/) -- `CompressionZSTD`: [zstd](https://github.com/facebook/zstd) -- `CompressionSNAPPY`: [snappy](https://github.com/google/snappy) - -If you want to build and run the tests, you need to install [GTest](https://github.com/google/googletest). Otherwise, you need to add CMake option `-DBUILD_TESTS=OFF`. - -The [dependencies.yaml](./dependencies.yaml) file provides the recommended dependency versions, while you can still build from source with other dependency versions. If a dependency requires a higher C++ standard, e.g. C++14, you can specify the standard like: +### How to build from source ```bash -cmake . -DCMAKE_CXX_STANDARD=14 -``` - -> **Note**: -> -> On macOS, the default C++ standard is 17 because the latest Protobuf from Homebrew requires the C++17 support. - -## Platforms - -Pulsar C++ Client Library has been tested on: - -- Linux -- Mac OS X -- Windows x64 - -## Compilation - -### Clone - -First of all, clone the source code: - -```shell -git clone https://github.com/apache/pulsar-client-cpp +git clone https://github.com/apache/pulsar-client-cpp.git +git submodule update --init --recursive cd pulsar-client-cpp +cmake -B build -DINTEGRATE_VCPKG=ON +cmake --build build -j8 ``` -### Compile on Ubuntu - -#### Install all dependencies: - -```shell -sudo apt-get update -y && sudo apt-get install -y g++ cmake libssl-dev libcurl4-openssl-dev \ - libprotobuf-dev libboost-all-dev libgtest-dev libgmock-dev \ - protobuf-compiler -``` - -#### Compile Pulsar client library: - -```shell -cmake . -make -``` - -If you want to build performance tools, you need to run: - -```shell -cmake . -DBUILD_PERF_TOOLS=ON -make -``` - -#### Checks - -Client library will be placed in: - -``` -lib/libpulsar.so -lib/libpulsar.a -``` - -Examples will be placed in: - -``` -examples/ -``` - -Tools will be placed in: - -``` -perf/perfProducer -perf/perfConsumer -``` - -### Compile on Mac OS X +The 1st step will download vcpkg and then install all dependencies according to the version description in [vcpkg.json](./vcpkg.json). The 2nd step will build the Pulsar C++ libraries under `./build/lib/`, where `./build` is the CMake build directory. -#### Install all dependencies: +After the build, the hierarchy of the `build` directory will be: -```shell -brew install cmake openssl protobuf boost googletest zstd snappy ``` - -#### Compile Pulsar client library: - -```shell -cmake . -make -``` - -If you want to build performance tools, you need to run: - -```shell -cmake . -DBUILD_PERF_TOOLS=ON -make +build/ + include/ -- extra C++ headers + lib/ -- libraries + tests/ -- test executables + examples/ -- example executables + generated/ + lib/ -- protobuf source files for PulsarApi.proto + tests/ -- protobuf source files for *.proto used in tests ``` -#### Checks +### How to install -Client library will be placed in: +To install the C++ headers and libraries into a specific path, e.g. `/tmp/pulsar`, run the following commands: -``` -lib/libpulsar.dylib -lib/libpulsar.a -``` - -Examples will be placed in: - -``` -examples/ +```bash +cmake -B build -DINTEGRATE_VCPKG=ON -DCMAKE_INSTALL_PREFIX=/tmp/pulsar +cmake --build build -j8 --target install ``` -Tools will be placed in: +For example, on macOS you will see: ``` -perf/perfProducer -perf/perfConsumer +/tmp/pulsar/ + include/pulsar -- C/C++ headers + lib/ + libpulsar.a -- Static library + libpulsar.dylib -- Dynamic library ``` -### Compile on Windows +### Tests -#### Install with [vcpkg](https://github.com/microsoft/vcpkg) +Tests are built by default. You should execute [run-unit-tests.sh](./run-unit-tests.sh) to run tests locally. -It's highly recommended to use `vcpkg` for C++ package management on Windows. It's easy to install and well supported by Visual Studio (2015/2017/2019) and CMake. See [here](https://github.com/microsoft/vcpkg#quick-start-windows) for quick start. - -Take Windows 64-bit library as an example, you only need to run +If you don't want to build the tests, disable the `BUILD_TESTS` option: ```bash -vcpkg install --feature-flags=manifests --triplet x64-windows +cmake -B build -DINTEGRATE_VCPKG=ON -DBUILD_TESTS=OFF +cmake --build build -j8 ``` -> **NOTE**: -> -> For Windows 32-bit library, change `x64-windows` to `x86-windows`, see [here](https://github.com/microsoft/vcpkg/blob/master/docs/users/triplets.md) for more details about the triplet concept in Vcpkg. - -The all dependencies, which are specified by [vcpkg.json](vcpkg.json), will be installed in `vcpkg_installed/` subdirectory, +### Build perf tools -With `vcpkg`, you only need to run two commands: +If you want to build the perf tools, enable the `BUILD_PERF_TOOLS` option: ```bash -cmake \ - -B ./build \ - -A x64 \ - -DBUILD_TESTS=OFF \ - -DVCPKG_TRIPLET=x64-windows \ - -DCMAKE_BUILD_TYPE=Release \ - -S . -cmake --build ./build --config Release -``` - -Then all artifacts will be built into `build` subdirectory. - -> **NOTE**: -> -> 1. For Windows 32-bit, you need to use `-A Win32` and `-DVCPKG_TRIPLET=x86-windows`. -> 2. For MSVC Debug mode, you need to replace `Release` with `Debug` for both `CMAKE_BUILD_TYPE` variable and `--config` option. - -#### Install dependencies manually - -You need to install [dlfcn-win32](https://github.com/dlfcn-win32/dlfcn-win32) in addition. - -If you installed the dependencies manually, you need to run - -```shell -#If all dependencies are in your path, all that is necessary is -cmake . - -#if all dependencies are not in your path, then passing in a PROTOC_PATH and CMAKE_PREFIX_PATH is necessary -cmake -DPROTOC_PATH=C:/protobuf/bin/protoc -DCMAKE_PREFIX_PATH="C:/boost;C:/openssl;C:/zlib;C:/curl;C:/protobuf;C:/googletest;C:/dlfcn-win32" . - -#This will generate pulsar-cpp.sln. Open this in Visual Studio and build the desired configurations. -``` - -#### Checks - -Client library will be placed in: - -``` -build/lib/Release/pulsar.lib -build/lib/Release/pulsar.dll -``` - -#### Examples - -Add Windows environment paths: - -``` -build/lib/Release -vcpkg_installed +cmake -B build -DINTEGRATE_VCPKG=ON -DBUILD_PERF_TOOLS=ON +cmake --build build -j8 ``` -Examples will be available in: +Then the perf tools will be built under `./build/perf/`. -``` -build/examples/Release -``` - -## Tests - -```shell -# Execution -# Start standalone broker -./pulsar-test-service-start.sh +## Platforms -# Run the tests -cd tests -./pulsar-tests +Pulsar C++ Client Library has been tested on: -# When no longer needed, stop standalone broker -./pulsar-test-service-stop.sh -``` +- Linux +- Mac OS X +- Windows x64 ## Wireshark Dissector diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index af1c91aa..d54c2284 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -86,6 +86,11 @@ add_executable(SampleKeyValueSchemaConsumer ${SAMPLE_KEY_VALUE_SCHEMA_ add_executable(SampleKeyValueSchemaProducer ${SAMPLE_KEY_VALUE_SCHEMA_PRODUCER}) add_executable(SampleCustomLoggerCApi ${SAMPLE_CUSTOM_LOGGER_CAPI}) +if (INTEGRATE_VCPKG) + # pulsarShared already carries INCLUDE_DIRECTORIES and LINK_DIRECTORIES properties + set(CLIENT_LIBS "") +endif () + target_link_libraries(SampleAsyncProducer ${CLIENT_LIBS} pulsarShared) target_link_libraries(SampleConsumer ${CLIENT_LIBS} pulsarShared) target_link_libraries(SampleConsumerListener ${CLIENT_LIBS} pulsarShared) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 8bd9749c..6edc05e2 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -27,16 +27,25 @@ set(LIB_AUTOGEN_DIR ${AUTOGEN_DIR}/lib) file(MAKE_DIRECTORY ${LIB_AUTOGEN_DIR}) include_directories(${LIB_AUTOGEN_DIR}) -# Protobuf generation is only supported natively starting from CMake 3.8 -# Using custom command for now -set(PROTO_SOURCES ${LIB_AUTOGEN_DIR}/PulsarApi.pb.cc ${LIB_AUTOGEN_DIR}/PulsarApi.pb.h) -set(PULSAR_SOURCES ${PULSAR_SOURCES} ${PROTO_SOURCES}) -ADD_CUSTOM_COMMAND( - OUTPUT ${PROTO_SOURCES} - COMMAND ${PROTOC_PATH} -I ../proto ../proto/PulsarApi.proto --cpp_out=${LIB_AUTOGEN_DIR} - DEPENDS - ../proto/PulsarApi.proto - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) +if (INTEGRATE_VCPKG) + add_library(PROTO_OBJECTS OBJECT "${CMAKE_SOURCE_DIR}/proto/PulsarApi.proto") + target_link_libraries(PROTO_OBJECTS PUBLIC protobuf::libprotobuf) + target_include_directories(PROTO_OBJECTS PUBLIC ${LIB_AUTOGEN_DIR}) + protobuf_generate( + TARGET PROTO_OBJECTS + IMPORT_DIRS ${CMAKE_SOURCE_DIR}/proto + PROTOC_OUT_DIR ${LIB_AUTOGEN_DIR}) + set(COMMON_LIBS ${COMMON_LIBS} PROTO_OBJECTS) +else () + set(PROTO_SOURCES ${LIB_AUTOGEN_DIR}/PulsarApi.pb.cc ${LIB_AUTOGEN_DIR}/PulsarApi.pb.h) + set(PULSAR_SOURCES ${PULSAR_SOURCES} ${PROTO_SOURCES}) + ADD_CUSTOM_COMMAND( + OUTPUT ${PROTO_SOURCES} + COMMAND ${PROTOC_PATH} -I ../proto ../proto/PulsarApi.proto --cpp_out=${LIB_AUTOGEN_DIR} + DEPENDS + ../proto/PulsarApi.proto + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) +endif () set(LIBRARY_VERSION $ENV{PULSAR_LIBRARY_VERSION}) if (NOT LIBRARY_VERSION) @@ -44,7 +53,6 @@ if (NOT LIBRARY_VERSION) endif(NOT LIBRARY_VERSION) if (MSVC) - find_package(dlfcn-win32 REQUIRED) set(CMAKE_DL_LIBS dlfcn-win32::dl psapi.lib) if (CMAKE_BUILD_TYPE STREQUAL "Debug") get_target_property(dlfcn-win32_LIBRARY dlfcn-win32::dl IMPORTED_LOCATION_DEBUG) @@ -60,12 +68,23 @@ set(LIB_NAME_SHARED ${LIB_NAME}) # this is the "object library" target: compiles the sources only once add_library(PULSAR_OBJECT_LIB OBJECT ${PULSAR_SOURCES}) set_property(TARGET PULSAR_OBJECT_LIB PROPERTY POSITION_INDEPENDENT_CODE 1) +if (INTEGRATE_VCPKG) + target_link_libraries(PULSAR_OBJECT_LIB PROTO_OBJECTS) +endif () +target_include_directories(PULSAR_OBJECT_LIB PUBLIC + "${CMAKE_SOURCE_DIR}" + "${CMAKE_SOURCE_DIR}/include" + "${CMAKE_BINARY_DIR}/include") if (BUILD_DYNAMIC_LIB) add_library(pulsarShared SHARED $) set_property(TARGET pulsarShared PROPERTY OUTPUT_NAME ${LIB_NAME_SHARED}) set_property(TARGET pulsarShared PROPERTY VERSION ${LIBRARY_VERSION}) - target_link_libraries(pulsarShared ${COMMON_LIBS} ${CMAKE_DL_LIBS}) + target_link_libraries(pulsarShared PRIVATE ${COMMON_LIBS} ${CMAKE_DL_LIBS}) + target_include_directories(pulsarShared PUBLIC + ${CMAKE_SOURCE_DIR} + ${CMAKE_SOURCE_DIR}/include) + target_link_directories(pulsarShared PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) if (MSVC) target_include_directories(pulsarShared PRIVATE ${dlfcn-win32_INCLUDE_DIRS}) target_link_options(pulsarShared PRIVATE $<$:/NODEFAULTLIB:MSVCRT>) @@ -80,6 +99,10 @@ endif() if (BUILD_STATIC_LIB) add_library(pulsarStatic STATIC $) + target_include_directories(pulsarStatic PUBLIC + ${CMAKE_BINARY_DIR}/include + ${CMAKE_SOURCE_DIR} + ${CMAKE_SOURCE_DIR}/include) if (MSVC) set_property(TARGET pulsarStatic PROPERTY OUTPUT_NAME "${LIB_NAME}-static") target_include_directories(pulsarStatic PRIVATE ${dlfcn-win32_INCLUDE_DIRS}) diff --git a/perf/BuildPerf.cmake b/perf/BuildPerf.cmake new file mode 100644 index 00000000..8b5bc6f7 --- /dev/null +++ b/perf/BuildPerf.cmake @@ -0,0 +1,24 @@ +# +# 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. +# + +add_executable(perfProducer PerfProducer.cc) +target_link_libraries(perfProducer pulsarShared Boost::program_options) + +add_executable(perfConsumer PerfConsumer.cc) +target_link_libraries(perfConsumer pulsarShared Boost::program_options) diff --git a/perf/CMakeLists.txt b/perf/CMakeLists.txt index 586f9b0f..74215c7d 100644 --- a/perf/CMakeLists.txt +++ b/perf/CMakeLists.txt @@ -17,21 +17,8 @@ # under the License. # -# Test tools -add_definitions(-D_GLIBCXX_USE_NANOSLEEP) - -set(PERF_PRODUCER_SOURCES - PerfProducer.cc -) - -set(PERF_CONSUMER_SOURCES - PerfConsumer.cc -) - -add_executable(perfProducer ${PERF_PRODUCER_SOURCES}) -add_executable(perfConsumer ${PERF_CONSUMER_SOURCES}) - -set(TOOL_LIBS ${CLIENT_LIBS} ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_THREAD_LIBRARY}) - -target_link_libraries(perfProducer pulsarShared ${TOOL_LIBS}) -target_link_libraries(perfConsumer pulsarShared ${TOOL_LIBS}) +if (INTEGRATE_VCPKG) + include(BuildPerf.cmake) +else () + include(LegacyBuildPerf.cmake) +endif () diff --git a/perf/LegacyBuildPerf.cmake b/perf/LegacyBuildPerf.cmake new file mode 100644 index 00000000..586f9b0f --- /dev/null +++ b/perf/LegacyBuildPerf.cmake @@ -0,0 +1,37 @@ +# +# 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. +# + +# Test tools +add_definitions(-D_GLIBCXX_USE_NANOSLEEP) + +set(PERF_PRODUCER_SOURCES + PerfProducer.cc +) + +set(PERF_CONSUMER_SOURCES + PerfConsumer.cc +) + +add_executable(perfProducer ${PERF_PRODUCER_SOURCES}) +add_executable(perfConsumer ${PERF_CONSUMER_SOURCES}) + +set(TOOL_LIBS ${CLIENT_LIBS} ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_THREAD_LIBRARY}) + +target_link_libraries(perfProducer pulsarShared ${TOOL_LIBS}) +target_link_libraries(perfConsumer pulsarShared ${TOOL_LIBS}) diff --git a/tests/BuildTests.cmake b/tests/BuildTests.cmake new file mode 100644 index 00000000..c468f51f --- /dev/null +++ b/tests/BuildTests.cmake @@ -0,0 +1,57 @@ +# +# 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. +# + +set(LIB_AUTOGEN_DIR ${AUTOGEN_DIR}/tests) +file(MAKE_DIRECTORY ${LIB_AUTOGEN_DIR}) +include_directories(${LIB_AUTOGEN_DIR}) + +find_package(GTest CONFIG REQUIRED) +set(GTEST_TARGETS GTest::gtest GTest::gtest_main GTest::gmock GTest::gmock_main) + +add_library(TESTS_PROTO_OBJECTS OBJECT + ${CMAKE_CURRENT_SOURCE_DIR}/PaddingDemo.proto + ${CMAKE_CURRENT_SOURCE_DIR}/proto/ExternalTest.proto + ${CMAKE_CURRENT_SOURCE_DIR}/proto/Test.proto + ) +target_link_libraries(TESTS_PROTO_OBJECTS PUBLIC protobuf::libprotobuf) +protobuf_generate( + TARGET TESTS_PROTO_OBJECTS + IMPORT_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/proto" "${CMAKE_CURRENT_SOURCE_DIR}" + PROTOC_OUT_DIR ${LIB_AUTOGEN_DIR}) + +file(GLOB TEST_SOURCES *.cc c/*.cc) +add_executable(pulsar-tests ${TEST_SOURCES}) +target_include_directories(pulsar-tests PRIVATE ${AUTOGEN_DIR}/lib) +target_compile_options(pulsar-tests PRIVATE -DTOKEN_PATH="${TOKEN_PATH}" -DTEST_CONF_DIR="${TEST_CONF_DIR}") +target_link_libraries(pulsar-tests PRIVATE pulsarStatic TESTS_PROTO_OBJECTS ${GTEST_TARGETS}) + +if (UNIX) + add_executable(ConnectionFailTest unix/ConnectionFailTest.cc HttpHelper.cc) + target_link_libraries(ConnectionFailTest pulsarStatic ${GTEST_TARGETS}) +endif () + +add_executable(BrokerMetadataTest brokermetadata/BrokerMetadataTest.cc) +target_link_libraries(BrokerMetadataTest pulsarStatic ${GTEST_TARGETS}) + +add_executable(Oauth2Test oauth2/Oauth2Test.cc) +target_compile_options(Oauth2Test PRIVATE -DTEST_CONF_DIR="${TEST_CONF_DIR}") +target_link_libraries(Oauth2Test pulsarStatic ${GTEST_TARGETS}) + +add_executable(ChunkDedupTest chunkdedup/ChunkDedupTest.cc HttpHelper.cc) +target_link_libraries(ChunkDedupTest pulsarStatic ${GTEST_TARGETS}) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 3bc5a156..f895d34e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -17,60 +17,8 @@ # under the License. # -if (NOT PROTOC_PATH) - set(PROTOC_PATH protoc) -endif() - -set(LIB_AUTOGEN_DIR ${AUTOGEN_DIR}/tests) -file(MAKE_DIRECTORY ${LIB_AUTOGEN_DIR}) -include_directories(${LIB_AUTOGEN_DIR}) - -set(PROTO_DIR ${CMAKE_CURRENT_SOURCE_DIR}/proto) -set(PROTO_SOURCES ${LIB_AUTOGEN_DIR}/Test.pb.cc ${LIB_AUTOGEN_DIR}/ExternalTest.pb.cc) -add_custom_command( - OUTPUT ${PROTO_SOURCES} - COMMAND ${PROTOC_PATH} -I ${PROTO_DIR} ${PROTO_DIR}/Test.proto ${PROTO_DIR}/ExternalTest.proto --cpp_out=${LIB_AUTOGEN_DIR}) - -set(PROTO_SOURCE_PADDING ${LIB_AUTOGEN_DIR}/PaddingDemo.pb.cc) -add_custom_command( - OUTPUT ${PROTO_SOURCE_PADDING} - COMMAND ${PROTOC_PATH} -I . ./PaddingDemo.proto --cpp_out=${LIB_AUTOGEN_DIR} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - -set(PROTO_SOURCES ${PROTO_SOURCES} ${PROTO_SOURCE_PADDING}) - -include_directories(${LIB_AUTOGEN_DIR}) - -find_library(GMOCK_LIBRARY_PATH gmock) -find_library(GTEST_LIBRARY_PATH gtest) -find_library(GMOCKD_LIBRARY_PATH gmockd) -find_library(GTESTD_LIBRARY_PATH gtestd) -if (NOT GMOCKD_LIBRARY_PATH) - set(GMOCKD_LIBRARY_PATH ${GMOCK_LIBRARY_PATH}) -endif() -if (NOT GTESTD_LIBRARY_PATH) - set(GTESTD_LIBRARY_PATH ${GTEST_LIBRARY_PATH}) -endif() - -file(GLOB TEST_SOURCES *.cc c/*.cc) - -add_executable(pulsar-tests ${TEST_SOURCES} ${PROTO_SOURCES}) - -target_include_directories(pulsar-tests PRIVATE ${AUTOGEN_DIR}/lib) -target_compile_options(pulsar-tests PRIVATE -DTOKEN_PATH="${TOKEN_PATH}" -DTEST_CONF_DIR="${TEST_CONF_DIR}") -target_link_libraries(pulsar-tests ${CLIENT_LIBS} pulsarStatic $<$:${GMOCKD_LIBRARY_PATH}> $<$:${GTESTD_LIBRARY_PATH}> $<$>:${GMOCK_LIBRARY_PATH}> $<$>:${GTEST_LIBRARY_PATH}>) - -if (UNIX) - add_executable(ConnectionFailTest unix/ConnectionFailTest.cc HttpHelper.cc) - target_link_libraries(ConnectionFailTest ${CLIENT_LIBS} pulsarStatic ${GTEST_LIBRARY_PATH}) +if (INTEGRATE_VCPKG) + include(BuildTests.cmake) +else () + include(LegacyBuildTests.cmake) endif () - -add_executable(BrokerMetadataTest brokermetadata/BrokerMetadataTest.cc) -target_link_libraries(BrokerMetadataTest ${CLIENT_LIBS} pulsarStatic ${GTEST_LIBRARY_PATH}) - -add_executable(Oauth2Test oauth2/Oauth2Test.cc) -target_compile_options(Oauth2Test PRIVATE -DTEST_CONF_DIR="${TEST_CONF_DIR}") -target_link_libraries(Oauth2Test ${CLIENT_LIBS} pulsarStatic ${GTEST_LIBRARY_PATH}) - -add_executable(ChunkDedupTest chunkdedup/ChunkDedupTest.cc HttpHelper.cc) -target_link_libraries(ChunkDedupTest ${CLIENT_LIBS} pulsarStatic ${GTEST_LIBRARY_PATH}) diff --git a/tests/LegacyBuildTests.cmake b/tests/LegacyBuildTests.cmake new file mode 100644 index 00000000..1e5335f7 --- /dev/null +++ b/tests/LegacyBuildTests.cmake @@ -0,0 +1,77 @@ +# +# 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. +# + +if (NOT PROTOC_PATH) + set(PROTOC_PATH protoc) +endif() + +set(LIB_AUTOGEN_DIR ${AUTOGEN_DIR}/tests) +file(MAKE_DIRECTORY ${LIB_AUTOGEN_DIR}) +include_directories(${LIB_AUTOGEN_DIR}) + +set(PROTO_DIR ${CMAKE_CURRENT_SOURCE_DIR}/proto) +set(PROTO_SOURCES ${LIB_AUTOGEN_DIR}/Test.pb.cc ${LIB_AUTOGEN_DIR}/ExternalTest.pb.cc) +add_custom_command( + OUTPUT ${PROTO_SOURCES} + COMMAND ${PROTOC_PATH} -I ${PROTO_DIR} ${PROTO_DIR}/Test.proto ${PROTO_DIR}/ExternalTest.proto --cpp_out=${LIB_AUTOGEN_DIR}) + +set(PROTO_SOURCE_PADDING ${LIB_AUTOGEN_DIR}/PaddingDemo.pb.cc) +add_custom_command( + OUTPUT ${PROTO_SOURCE_PADDING} + COMMAND ${PROTOC_PATH} -I . ./PaddingDemo.proto --cpp_out=${LIB_AUTOGEN_DIR} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + +set(PROTO_SOURCES ${PROTO_SOURCES} ${PROTO_SOURCE_PADDING}) + +include_directories(${LIB_AUTOGEN_DIR}) + +find_library(GMOCK_LIBRARY_PATH gmock) +find_library(GTEST_LIBRARY_PATH gtest) +find_library(GMOCKD_LIBRARY_PATH gmockd) +find_library(GTESTD_LIBRARY_PATH gtestd) +if (NOT GMOCKD_LIBRARY_PATH) + set(GMOCKD_LIBRARY_PATH ${GMOCK_LIBRARY_PATH}) +endif() +if (NOT GTESTD_LIBRARY_PATH) + set(GTESTD_LIBRARY_PATH ${GTEST_LIBRARY_PATH}) +endif() + +file(GLOB TEST_SOURCES *.cc c/*.cc) + +add_executable(pulsar-tests ${TEST_SOURCES} ${PROTO_SOURCES}) + +target_include_directories(pulsar-tests PRIVATE ${AUTOGEN_DIR}/lib) +target_compile_options(pulsar-tests PRIVATE -DTOKEN_PATH="${TOKEN_PATH}" -DTEST_CONF_DIR="${TEST_CONF_DIR}") +target_link_libraries(pulsar-tests ${CLIENT_LIBS} pulsarStatic $<$:${GMOCKD_LIBRARY_PATH}> $<$:${GTESTD_LIBRARY_PATH}> $<$>:${GMOCK_LIBRARY_PATH}> $<$>:${GTEST_LIBRARY_PATH}>) + +if (UNIX) + add_executable(ConnectionFailTest unix/ConnectionFailTest.cc HttpHelper.cc) + target_link_libraries(ConnectionFailTest ${CLIENT_LIBS} pulsarStatic ${GTEST_LIBRARY_PATH}) +endif () + +add_executable(BrokerMetadataTest brokermetadata/BrokerMetadataTest.cc) +target_link_libraries(BrokerMetadataTest ${CLIENT_LIBS} pulsarStatic ${GTEST_LIBRARY_PATH}) + +add_executable(Oauth2Test oauth2/Oauth2Test.cc) +target_compile_options(Oauth2Test PRIVATE -DTEST_CONF_DIR="${TEST_CONF_DIR}") +target_link_libraries(Oauth2Test ${CLIENT_LIBS} pulsarStatic ${GTEST_LIBRARY_PATH}) + +add_executable(ChunkDedupTest chunkdedup/ChunkDedupTest.cc HttpHelper.cc) +target_link_libraries(ChunkDedupTest ${CLIENT_LIBS} pulsarStatic ${GTEST_LIBRARY_PATH}) + diff --git a/vcpkg b/vcpkg new file mode 160000 index 00000000..b051745c --- /dev/null +++ b/vcpkg @@ -0,0 +1 @@ +Subproject commit b051745c68faa6f65c493371d564c4eb8af34dad diff --git a/vcpkg.json b/vcpkg.json index 5cc38635..1f9ed97f 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,29 +1,104 @@ { "name": "pulsar-cpp", - "version": "2.8.0", + "version": "3.5.0", "description": "Pulsar C++ SDK", + "builtin-baseline": "b051745c68faa6f65c493371d564c4eb8af34dad", "dependencies": [ - "boost-accumulators", - "boost-algorithm", - "boost-any", - "boost-circular-buffer", - "boost-asio", - "boost-date-time", - "boost-predef", - "boost-program-options", - "boost-property-tree", - "boost-random", - "boost-serialization", - "boost-xpressive", - "curl", - "openssl", - "protobuf", - "snappy", - "zlib", - "zstd", + { + "name": "boost-accumulators", + "version>=": "1.83.0" + }, + { + "name": "boost-algorithm", + "version>=": "1.83.0" + }, + { + "name": "boost-any", + "version>=": "1.83.0" + }, + { + "name": "boost-asio", + "version>=": "1.83.0" + }, + { + "name": "boost-circular-buffer", + "version>=": "1.83.0" + }, + { + "name": "boost-date-time", + "version>=": "1.83.0" + }, + { + "name": "boost-predef", + "version>=": "1.83.0" + }, + { + "name": "boost-property-tree", + "version>=": "1.83.0" + }, + { + "name": "boost-random", + "version>=": "1.83.0" + }, + { + "name": "boost-serialization", + "version>=": "1.83.0" + }, + { + "name": "boost-xpressive", + "version>=": "1.83.0" + }, + { + "name": "curl", + "default-features": false, + "features": [ + "openssl" + ], + "version>=": "8.4.0" + }, { "name": "dlfcn-win32", "platform": "windows" + }, + { + "name": "openssl", + "version>=": "3.1.4#1" + }, + { + "name": "protobuf", + "version>=": "3.21.12" + }, + { + "name": "snappy", + "version>=": "1.1.10" + }, + { + "name": "zlib", + "version>=": "1.3" + }, + { + "name": "zstd", + "version>=": "1.5.5" + } + ], + "features": { + "perf": { + "description": "Build Performance Tool", + "dependencies": [ + { + "name": "boost-program-options", + "version>=": "1.83.0" + } + ] + }, + "tests": { + "description": "Build Tests", + "dependencies": [ + { + "name": "gtest", + "version>=": "1.14.0" + } + ] } - ] + } } From b19c2d5ec9f20020d25039284df007df74ea72aa Mon Sep 17 00:00:00 2001 From: Yunze Xu Date: Wed, 13 Dec 2023 11:15:33 +0800 Subject: [PATCH 2/2] Fix git submodule order --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bd574797..03957ce0 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,8 @@ Since it's integrated with vcpkg, see [vcpkg#README](https://github.com/microsof ```bash git clone https://github.com/apache/pulsar-client-cpp.git -git submodule update --init --recursive cd pulsar-client-cpp +git submodule update --init --recursive cmake -B build -DINTEGRATE_VCPKG=ON cmake --build build -j8 ```