You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by pe...@apache.org on 2021/04/27 08:06:38 UTC
[pulsar] 03/03: Add CI to verify C++ client could be built on
Windows (#10387)
This is an automated email from the ASF dual-hosted git repository.
penghui pushed a commit to branch branch-2.7
in repository https://gitbox.apache.org/repos/asf/pulsar.git
commit bc0587d1daeb0b6aa011aa7466505397812366c5
Author: Yunze Xu <xy...@gmail.com>
AuthorDate: Tue Apr 27 02:36:35 2021 +0800
Add CI to verify C++ client could be built on Windows (#10387)
* Add vcpkg dependencies
* Add dependencies for compression
* Add C++ client Windows build CI
* Remove redundant variables
* Update README
* Fix compile error
(cherry picked from commit d81c16abed5d2f390dafe617fade57e8de644a95)
---
.github/workflows/ci-cpp-build-windows.yaml | 79 +++++++++++++++++++++++++++
pulsar-client-cpp/.gitignore | 7 +++
pulsar-client-cpp/CMakeLists.txt | 8 +++
pulsar-client-cpp/README.md | 84 ++++++++++++++++++++++-------
pulsar-client-cpp/lib/ConnectionPool.cc | 1 -
pulsar-client-cpp/lib/JavaStringHash.cc | 1 +
pulsar-client-cpp/lib/JavaStringHash.h | 1 -
pulsar-client-cpp/lib/TopicName.cc | 1 -
pulsar-client-cpp/lib/auth/AuthOauth2.h | 1 -
pulsar-client-cpp/vcpkg.json | 26 +++++++++
10 files changed, 185 insertions(+), 24 deletions(-)
diff --git a/.github/workflows/ci-cpp-build-windows.yaml b/.github/workflows/ci-cpp-build-windows.yaml
new file mode 100644
index 0000000..87de993
--- /dev/null
+++ b/.github/workflows/ci-cpp-build-windows.yaml
@@ -0,0 +1,79 @@
+#
+# 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.
+#
+
+name: CI - CPP build on Windows
+on:
+ pull_request:
+ branches:
+ - master
+ push:
+ branches:
+ - branch-*
+
+env:
+ VCPKG_FEATURE_FLAGS: manifests
+
+jobs:
+ cpp-build-windows:
+ timeout-minutes: 120
+
+ name: ${{ matrix.name }}
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - name: 'Windows x64'
+ os: windows-latest
+ triplet: x64-windows
+ vcpkg_dir: 'C:\vcpkg'
+ suffix: 'windows-win64'
+ generator: 'Visual Studio 16 2019'
+ arch: '-A x64'
+
+ steps:
+ - name: checkout
+ uses: actions/checkout@v2
+
+ - name: Install vcpkg packages
+ shell: bash
+ run: |
+ cd pulsar-client-cpp && vcpkg install --triplet ${{ matrix.triplet }}
+
+ - name: Configure
+ shell: bash
+ run: |
+ if [ "$RUNNER_OS" == "Windows" ]; then
+ cd pulsar-client-cpp && \
+ cmake \
+ -B ./build \
+ -G "${{ matrix.generator }}" ${{ matrix.arch }} \
+ -DBUILD_PYTHON_WRAPPER=OFF -DBUILD_TESTS=OFF \
+ -DVCPKG_TRIPLET=${{ matrix.triplet }} \
+ -DCMAKE_BUILD_TYPE=Release \
+ -S .
+ fi
+
+ - name: Compile
+ shell: bash
+ run: |
+ if [ "$RUNNER_OS" == "Windows" ]; then
+ cd pulsar-client-cpp && \
+ cmake --build ./build
+ fi
diff --git a/pulsar-client-cpp/.gitignore b/pulsar-client-cpp/.gitignore
index f031a55..afb332d 100644
--- a/pulsar-client-cpp/.gitignore
+++ b/pulsar-client-cpp/.gitignore
@@ -73,3 +73,10 @@ pulsar-dist
install_manifest.txt
merged-library
python/venv
+
+# Visual Studio files
+out/
+CMakeSettings.json
+
+# vcpkg dependencies directory
+vcpkg_installed/
diff --git a/pulsar-client-cpp/CMakeLists.txt b/pulsar-client-cpp/CMakeLists.txt
index d4fdb8e..59b1c00 100644
--- a/pulsar-client-cpp/CMakeLists.txt
+++ b/pulsar-client-cpp/CMakeLists.txt
@@ -21,6 +21,14 @@ cmake_minimum_required(VERSION 3.4)
project (pulsar-cpp)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake_modules")
+if (VCPKG_TRIPLET)
+ message(STATUS "Use vcpkg, triplet is ${VCPKG_TRIPLET}")
+ set(CMAKE_PREFIX_PATH "${CMAKE_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}")
+endif()
+
find_program(CCACHE_PROGRAM ccache)
if(CCACHE_PROGRAM)
set(CMAKE_CXX_COMPILER_LAUNCHER "ccache")
diff --git a/pulsar-client-cpp/README.md b/pulsar-client-cpp/README.md
index 67ec2bf..f489c3d 100644
--- a/pulsar-client-cpp/README.md
+++ b/pulsar-client-cpp/README.md
@@ -37,14 +37,31 @@ https://github.com/apache/pulsar/tree/master/pulsar-client-cpp/examples
## Requirements
- * CMake
+ * A C++ compiler that supports C++11, like GCC >= 4.8
+ * CMake >= 3.4
* [Boost](http://www.boost.org/)
- * [Protocol Buffer 2.6](https://developers.google.com/protocol-buffers/)
- * [Log4CXX](https://logging.apache.org/log4cxx)
- * LibCurl
- * [GTest](https://github.com/google/googletest)
- * JsonCpp
+ * [Protocol Buffer](https://developers.google.com/protocol-buffers/)
+ * [libcurl](https://curl.se/libcurl/)
+ * [openssl](https://github.com/openssl/openssl)
+It's recommended to use Protocol Buffer 2.6 because it's verified by CI, but 3.x also works.
+
+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`.
+
+If you don't want to build Python client since `boost-python` may not be easy to install, you need to add CMake option `-DBUILD_PYTHON_WRAPPER=OFF`.
+
+If you want to use `ClientConfiguration::setLogConfFilePath`, you need to install the [Log4CXX](https://logging.apache.org/log4cxx) and add CMake option `-DUSE_LOG4CXX=ON`.
## Platforms
@@ -52,6 +69,7 @@ Pulsar C++ Client Library has been tested on:
* Linux
* Mac OS X
+* Windows x64
## Compilation
@@ -76,7 +94,7 @@ Run unit tests:
```shell
apt-get install -y g++ cmake libssl-dev libcurl4-openssl-dev liblog4cxx-dev \
libprotobuf-dev libboost-all-dev libgtest-dev google-mock \
- libjsoncpp-dev libxml2-utils protobuf-compiler python-setuptools
+ protobuf-compiler python-setuptools
```
#### Compile and install Google Test:
@@ -167,22 +185,45 @@ ${PULSAR_PATH}/pulsar-client-cpp/perf/perfConsumer
### Compile on Windows
-#### Install all dependencies:
+#### Install with [vcpkg](https://github.com/microsoft/vcpkg)
-Clone and build all dependencies from source if a binary distro can't be found.
+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.
-- [Boost](https://github.com/boostorg/boost)
-- [LibCurl](https://github.com/curl/curl)
-- [zlib](https://github.com/madler/zlib)
-- [OpenSSL](https://github.com/openssl/openssl)
-- [ProtoBuf](https://github.com/protocolbuffers/protobuf)
-- [dlfcn-win32](https://github.com/dlfcn-win32/dlfcn-win32)
-- [LLVM](https://llvm.org/builds/) (for clang-tidy and clang-format)
+Take 64 bits Windows as an example, you only need to run
-If you want to build and run the tests, then also install
-- [GTest and GMock](https://github.com/google/googletest)
+```bash
+vcpkg install --feature-flags=manifests --triplet x64-windows
+```
-#### Compile Pulsar client library:
+> NOTE: The default triplet is `x86-windows`, see [here](https://github.com/microsoft/vcpkg/blob/master/docs/users/triplets.md) for more details.
+
+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_PYTHON_WRAPPER=OFF -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. Change `Release` to `Debug` if you want to build a debug version library.
+> 2. For 32 bits Windows, you need to use `-A Win32` and `-DVCPKG_TRIPLET=x32-windows`.
+
+#### 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
@@ -212,4 +253,7 @@ ${PULSAR_PATH}/pulsar-test-service-stop.sh
```
## Requirements for Contributors
-We welcome contributions from the open source community, kindly make sure your changes are backward compatible with gcc-4.4.7 and Boost 1.41.
+
+It's recommended to install [LLVM](https://llvm.org/builds/) for `clang-tidy` and `clang-format`. Pulsar C++ client use `clang-format` 5.0 to format files, which is a little different with latest `clang-format`.
+
+We welcome contributions from the open source community, kindly make sure your changes are backward compatible with GCC 4.8 and Boost 1.53.
diff --git a/pulsar-client-cpp/lib/ConnectionPool.cc b/pulsar-client-cpp/lib/ConnectionPool.cc
index 586acec..cc5668b 100644
--- a/pulsar-client-cpp/lib/ConnectionPool.cc
+++ b/pulsar-client-cpp/lib/ConnectionPool.cc
@@ -21,7 +21,6 @@
#include "LogUtils.h"
#include "Url.h"
-#include <boost/iostreams/stream.hpp>
#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>
diff --git a/pulsar-client-cpp/lib/JavaStringHash.cc b/pulsar-client-cpp/lib/JavaStringHash.cc
index 7579e0e..bf809bf 100644
--- a/pulsar-client-cpp/lib/JavaStringHash.cc
+++ b/pulsar-client-cpp/lib/JavaStringHash.cc
@@ -17,6 +17,7 @@
* under the License.
*/
#include "JavaStringHash.h"
+#include <limits>
namespace pulsar {
diff --git a/pulsar-client-cpp/lib/JavaStringHash.h b/pulsar-client-cpp/lib/JavaStringHash.h
index 8498d1a..6059b1a 100644
--- a/pulsar-client-cpp/lib/JavaStringHash.h
+++ b/pulsar-client-cpp/lib/JavaStringHash.h
@@ -24,7 +24,6 @@
#include <cstdint>
#include <string>
-#include <boost/functional/hash.hpp>
namespace pulsar {
class PULSAR_PUBLIC JavaStringHash : public Hash {
diff --git a/pulsar-client-cpp/lib/TopicName.cc b/pulsar-client-cpp/lib/TopicName.cc
index 46fa355..a56b979 100644
--- a/pulsar-client-cpp/lib/TopicName.cc
+++ b/pulsar-client-cpp/lib/TopicName.cc
@@ -21,7 +21,6 @@
#include "PartitionedProducerImpl.h"
#include "TopicName.h"
-#include <boost/format.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/find.hpp>
#include <memory>
diff --git a/pulsar-client-cpp/lib/auth/AuthOauth2.h b/pulsar-client-cpp/lib/auth/AuthOauth2.h
index f9bdc21..4de6f53 100644
--- a/pulsar-client-cpp/lib/auth/AuthOauth2.h
+++ b/pulsar-client-cpp/lib/auth/AuthOauth2.h
@@ -21,7 +21,6 @@
#include <pulsar/Authentication.h>
#include <string>
-#include <boost/function.hpp>
namespace pulsar {
diff --git a/pulsar-client-cpp/vcpkg.json b/pulsar-client-cpp/vcpkg.json
new file mode 100644
index 0000000..3c14d10
--- /dev/null
+++ b/pulsar-client-cpp/vcpkg.json
@@ -0,0 +1,26 @@
+{
+ "name": "pulsar-cpp",
+ "version": "2.8.0",
+ "description": "Pulsar C++ SDK",
+ "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",
+ "dlfcn-win32",
+ "openssl",
+ "protobuf",
+ "snappy",
+ "zlib",
+ "zstd"
+ ]
+}