This is an automated email from the ASF dual-hosted git repository.
xyz pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-client-python.git
The following commit(s) were added to refs/heads/main by this push:
new 22c6797 Build wheel files in CI (#11)
22c6797 is described below
commit 22c6797aa83cb381182a8f8efdb200705ad3b42d
Author: Matteo Merli <[email protected]>
AuthorDate: Wed Oct 12 21:45:15 2022 -0700
Build wheel files in CI (#11)
### Motivation
Added CI jobs to build wheel files for Mac and Linux.
### Modifications
* Simplified `CMakeList.txt` for easier detection of Boost-Python
* Added PR validation to build wheels for small number of combinations
* Added job triggered on when a tag is pushed to create all the
combination of wheels for Py (3.7, 3.8, 3.9, 3.10), OS (Mac, linux glibc, linux
musl) and CPU (x86_64 and arm64).
* The wheels binaries are tested to verify no libraries/symbols are missing
* The wheels are uploaded as artifacts for the job, so that they can later
be staged for official release.
---
.github/workflows/ci-build-release-wheels.yaml | 143 +++++++++
.github/workflows/ci-pr-validation.yaml | 92 +++++-
.gitignore | 4 +-
CMakeLists.txt | 106 +++----
build-mac-wheels.sh | 334 ---------------------
...tall-cpp-client.sh => copy-deps-versionfile.sh} | 19 +-
.../{install-cpp-client.sh => dep-version.py} | 20 +-
build-support/install-cpp-client.sh | 47 ++-
.../install-cpp-client.sh => dependencies.yaml | 25 +-
.../build-wheel-inside-docker.sh | 26 +-
pkg/mac/build-dependencies.sh | 237 +++++++++++++++
pkg/mac/build-mac-wheels.sh | 80 +++++
pkg/mac/build-pulsar-cpp.sh | 64 ++++
.../install-cpp-client.sh => pkg/mac/common.sh | 19 +-
pkg/manylinux2014/Dockerfile | 56 ++++
pkg/manylinux_musl/Dockerfile | 53 ++++
.../install-cpp-client.sh => pkg/test-wheel.sh | 18 +-
pulsar-client-cpp-version.txt | 2 +-
pulsar/__init__.py | 2 +-
19 files changed, 849 insertions(+), 498 deletions(-)
diff --git a/.github/workflows/ci-build-release-wheels.yaml
b/.github/workflows/ci-build-release-wheels.yaml
new file mode 100644
index 0000000..f79bfc2
--- /dev/null
+++ b/.github/workflows/ci-build-release-wheels.yaml
@@ -0,0 +1,143 @@
+#
+# 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: Build release wheels
+on:
+ push:
+ tags:
+ - '*'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+
+ linux-wheel:
+ name: Wheel ${{matrix.image.name}} - Py ${{matrix.python.version}} -
${{matrix.cpu.platform}}
+ runs-on: ubuntu-22.04
+ timeout-minutes: 300
+
+ strategy:
+ fail-fast: false
+ matrix:
+ image:
+ - {name: 'manylinux2014', py_suffix: ''}
+ - {name: 'manylinux_musl', py_suffix: '-alpine'}
+ python:
+ - {version: '3.7', spec: 'cp37-cp37m'}
+ - {version: '3.8', spec: 'cp38-cp38'}
+ - {version: '3.9', spec: 'cp39-cp39'}
+ - {version: '3.10', spec: 'cp310-cp310'}
+ cpu:
+ - {arch: 'x86_64', platform: 'x86_64'}
+ - {arch: 'aarch64', platform: 'arm64'}
+
+ steps:
+ - name: checkout
+ uses: actions/checkout@v3
+
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v2
+
+ - uses: docker/setup-buildx-action@v2
+ - run: build-support/copy-deps-versionfile.sh
+
+ - name: Build Manylinux Docker image
+ uses: docker/build-push-action@v3
+ with:
+ context: ./pkg/${{matrix.image.name}}
+ load: true
+ tags: build:latest
+ platforms: linux/${{matrix.cpu.arch}}
+ build-args: |
+ PLATFORM=${{matrix.cpu.platform}}
+ ARCH=${{matrix.cpu.arch}}
+ PYTHON_VERSION=${{matrix.python.version}}
+ PYTHON_SPEC=${{matrix.python.spec}}
+ cache-from: type=gha
+ cache-to: type=gha,mode=max
+
+ - name: Build wheel file
+ run: |
+ docker run -i -v $PWD:/pulsar-client-python build:latest \
+ /pulsar-client-python/pkg/build-wheel-inside-docker.sh
+
+ - name: Test wheel file
+ run: |
+ docker run -i -v $PWD:/pulsar-client-python \
+ --platform linux/${{matrix.cpu.arch}} \
+ python:${{matrix.python.version}}${{matrix.image.py_suffix}} \
+ /pulsar-client-python/pkg/test-wheel.sh
+
+ - name: Upload artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ name:
wheel-${{matrix.image.name}}-py${{matrix.python.version}}-${{matrix.cpu.platform}}
+ path: wheelhouse/*.whl
+
+ mac-wheels:
+ name: Wheel MacOS Universal2 - Py ${{matrix.py.version}}
+ runs-on: macos-12
+ timeout-minutes: 300
+
+ strategy:
+ fail-fast: false
+ matrix:
+ py:
+ - {version: '3.7', version_long: '3.7.14'}
+ - {version: '3.8', version_long: '3.8.13'}
+ - {version: '3.9', version_long: '3.9.14'}
+ - {version: '3.10', version_long: '3.10.7'}
+
+ steps:
+ - name: checkout
+ uses: actions/checkout@v3
+
+ - name: Dependencies cache
+ uses: actions/cache@v3
+ id: cache-deps
+ with:
+ path: .pulsar-mac-build/deps/install
+ key: ${{matrix.py.version_long}}-${{ hashFiles('dependencies.yaml')
}}-${{ hashFiles('pkg/mac/*') }}
+
+ - name: Build dependencies
+ if: steps.cache-deps.outputs.cache-hit != 'true'
+ run: pkg/mac/build-dependencies.sh ${{matrix.py.version}}
${{matrix.py.version_long}}
+
+ - name: Pulsar C++ cache
+ uses: actions/cache@v3
+ id: cache-cpp
+ with:
+ path: .pulsar-mac-build/cpp/install
+ key: ${{ hashFiles('dependencies.yaml') }}-${{
hashFiles('pulsar-client-cpp-version.txt') }}-${{ hashFiles('pkg/mac/*') }}
+
+ - name: Build Pulsar C++ client
+ if: steps.cache-cpp.outputs.cache-hit != 'true'
+ run: pkg/mac/build-pulsar-cpp.sh
+
+ - name: Build and test Mac wheels
+ run: pkg/mac/build-mac-wheels.sh ${{matrix.py.version}}
+
+ - name: Upload artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ name: wheel-mac-py${{matrix.py.version}}
+ path: dist/*.whl
+
diff --git a/.github/workflows/ci-pr-validation.yaml
b/.github/workflows/ci-pr-validation.yaml
index fb2a888..515c9e7 100644
--- a/.github/workflows/ci-pr-validation.yaml
+++ b/.github/workflows/ci-pr-validation.yaml
@@ -30,7 +30,7 @@ jobs:
unit-tests:
name: Run unit tests
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
timeout-minutes: 120
steps:
@@ -64,3 +64,93 @@ jobs:
- name: Stop Pulsar service
run: ./build-support/pulsar-test-service-stop.sh
+
+ linux-wheel:
+ name: Wheel ${{matrix.image.name}} - Py ${{matrix.python.version}} -
${{matrix.cpu.platform}}
+ runs-on: ubuntu-22.04
+ timeout-minutes: 300
+
+ strategy:
+ fail-fast: false
+ matrix:
+ image:
+ - {name: 'manylinux2014', py_suffix: ''}
+ - {name: 'manylinux_musl', py_suffix: '-alpine'}
+ python:
+ - {version: '3.10', spec: 'cp310-cp310'}
+ cpu:
+ - {arch: 'x86_64', platform: 'x86_64'}
+
+ steps:
+ - name: checkout
+ uses: actions/checkout@v3
+
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v2
+
+ - uses: docker/setup-buildx-action@v2
+ - run: build-support/copy-deps-versionfile.sh
+
+ - name: Build Manylinux Docker image
+ uses: docker/build-push-action@v3
+ with:
+ context: ./pkg/${{matrix.image.name}}
+ load: true
+ tags: build:latest
+ platforms: linux/${{matrix.cpu.arch}}
+ build-args: |
+ PLATFORM=${{matrix.cpu.platform}}
+ ARCH=${{matrix.cpu.arch}}
+ PYTHON_VERSION=${{matrix.python.version}}
+ PYTHON_SPEC=${{matrix.python.spec}}
+ cache-from: type=gha
+ cache-to: type=gha,mode=max
+
+ - name: Build wheel file
+ run: |
+ docker run -i -v $PWD:/pulsar-client-python build:latest \
+ /pulsar-client-python/pkg/build-wheel-inside-docker.sh
+
+ - name: Test wheel file
+ run: |
+ docker run -i -v $PWD:/pulsar-client-python
python:${{matrix.python.version}}${{matrix.image.py_suffix}} \
+ /pulsar-client-python/pkg/test-wheel.sh
+
+ mac-wheels:
+ name: Wheel MacOS Universal2 - Py ${{matrix.py.version}}
+ runs-on: macos-12
+ timeout-minutes: 300
+
+ strategy:
+ matrix:
+ py:
+ - {version: '3.10', version_long: '3.10.7'}
+
+ steps:
+ - name: checkout
+ uses: actions/checkout@v3
+
+ - name: Dependencies cache
+ uses: actions/cache@v3
+ id: cache-deps
+ with:
+ path: .pulsar-mac-build/deps/install
+ key: ${{matrix.py.version_long}}-${{ hashFiles('dependencies.yaml')
}}-${{ hashFiles('pkg/mac/*') }}
+
+ - name: Build dependencies
+ if: steps.cache-deps.outputs.cache-hit != 'true'
+ run: pkg/mac/build-dependencies.sh ${{matrix.py.version}}
${{matrix.py.version_long}}
+
+ - name: Pulsar C++ cache
+ uses: actions/cache@v3
+ id: cache-cpp
+ with:
+ path: .pulsar-mac-build/cpp/install
+ key: ${{ hashFiles('dependencies.yaml') }}-${{
hashFiles('pulsar-client-cpp-version.txt') }}-${{ hashFiles('pkg/mac/*') }}
+
+ - name: Build Pulsar C++ client
+ if: steps.cache-cpp.outputs.cache-hit != 'true'
+ run: pkg/mac/build-pulsar-cpp.sh
+
+ - name: Build and test Mac wheels
+ run: pkg/mac/build-mac-wheels.sh ${{matrix.py.version}}
diff --git a/.gitignore b/.gitignore
index fdff2ec..ee9119f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,4 +11,6 @@ cmake_install.cmake
__pycache__
.build
.pulsar-mac-wheels-cache
-.DS_Store
\ No newline at end of file
+.DS_Store
+wheelhouse
+.pulsar-mac-build
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 087678c..10a70ec 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -18,7 +18,7 @@
#
project (pulsar-client-python)
-cmake_minimum_required(VERSION 3.12)
+cmake_minimum_required(VERSION 3.18)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake_modules")
option(LINK_STATIC "Link against static libraries" OFF)
@@ -32,42 +32,22 @@ MESSAGE(STATUS "Threads library: "
${CMAKE_THREAD_LIBS_INIT})
if (LINK_STATIC)
find_library(PULSAR_LIBRARY NAMES libpulsar.a)
else()
- find_library(PULSAR_LIBRARY NAMES libpulsar.so)
+ find_library(PULSAR_LIBRARY NAMES libpulsar.so libpulsar.dylib)
endif()
message(STATUS "PULSAR_LIBRARY: ${PULSAR_LIBRARY}")
find_path(PULSAR_INCLUDE pulsar/Client.h)
message(STATUS "PULSAR_INCLUDE: ${PULSAR_INCLUDE}")
-SET(Boost_NO_BOOST_CMAKE ON)
-SET(Boost_USE_STATIC_LIBS ${LINK_STATIC})
-
SET(CMAKE_CXX_STANDARD 11)
-find_package(Boost)
-
-find_package (Python3 COMPONENTS Development)
+find_package (Python3 REQUIRED COMPONENTS Development.Module)
MESSAGE(STATUS "PYTHON: " ${Python3_VERSION} " - " ${Python3_INCLUDE_DIRS})
-string(REPLACE "." ";" PYTHONLIBS_VERSION_NO_LIST ${Python3_VERSION})
-
-set(BOOST_PYTHON_NAME_POSTFIX ${Python3_VERSION_MAJOR}${Python3_VERSION_MINOR})
-# For python3 the lib name is boost_python3
-set(BOOST_PYTHON_NAME_LIST
python${BOOST_PYTHON_NAME_POSTFIX};python37;python38;python39;python310;python3;python3-mt;python-py${BOOST_PYTHON_NAME_POSTFIX};python${BOOST_PYTHON_NAME_POSTFIX}-mt)
-
-foreach (BOOST_PYTHON_NAME IN LISTS BOOST_PYTHON_NAME_LIST)
- find_package(Boost QUIET COMPONENTS ${BOOST_PYTHON_NAME})
- if (${Boost_FOUND})
- set(BOOST_PYTHON_NAME_FOUND ${BOOST_PYTHON_NAME})
- break()
- endif()
-endforeach()
-
-if (NOT ${Boost_FOUND})
- MESSAGE(FATAL_ERROR "Could not find Boost Python library")
-endif ()
-
-MESSAGE(STATUS "BOOST_PYTHON_NAME_FOUND: " ${BOOST_PYTHON_NAME_FOUND})
+SET(Boost_USE_STATIC_LIBS ${LINK_STATIC})
+find_package(Boost REQUIRED COMPONENTS python3)
+MESSAGE(STATUS "Boost Python3: " ${Boost_PYTHON3_LIBRARY})
+MESSAGE(STATUS "Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}")
########################################################################################################################
@@ -99,55 +79,43 @@ if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
set(CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS
"${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS} -Qunused-arguments -undefined
dynamic_lookup")
endif()
-# Newer boost versions don't use the -mt suffix
-if (NOT DEFINED ${Boost_PYTHON37-MT_LIBRARY})
- set(Boost_PYTHON37-MT_LIBRARY ${Boost_PYTHON37_LIBRARY})
-endif()
+# Try all possible boost-python variable namings
+set(PYTHON_WRAPPER_LIBS ${PULSAR_LIBRARY}
+ ${Boost_PYTHON3_LIBRARY})
-if (NOT DEFINED ${Boost_PYTHON38-MT_LIBRARY})
- set(Boost_PYTHON38-MT_LIBRARY ${Boost_PYTHON38_LIBRARY})
-endif()
+message(STATUS "All libraries: ${PYTHON_WRAPPER_LIBS}")
-if (NOT DEFINED ${Boost_PYTHON39-MT_LIBRARY})
- set(Boost_PYTHON39-MT_LIBRARY ${Boost_PYTHON39_LIBRARY})
-endif()
+if (LINK_STATIC)
+ set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
-if (NOT DEFINED ${Boost_PYTHON310-MT_LIBRARY})
- set(Boost_PYTHON310-MT_LIBRARY ${Boost_PYTHON310_LIBRARY})
-endif()
+ # We need to include all the static libs individually because we cannot
easily create a universal2 libpulsar.a
+ # with all the deps included.
+ find_package(OpenSSL REQUIRED)
+ message("OPENSSL_LIBRARIES: " ${OPENSSL_LIBRARIES})
-# Try all possible boost-python variable namings
-set(PYTHON_WRAPPER_LIBS ${PULSAR_LIBRARY}
- ${Boost_PYTHON_LIBRARY}
- ${Boost_PYTHON3_LIBRARY}
- ${Boost_PYTHON37-MT_LIBRARY}
- ${Boost_PYTHON38_LIBRARY}
- ${Boost_PYTHON39_LIBRARY}
- ${Boost_PYTHON310_LIBRARY}
- )
-
-if (APPLE)
- if (Boost_PYTHON37-MT_LIBRARY_RELEASE)
- set(PYTHON_WRAPPER_LIBS ${PYTHON_WRAPPER_LIBS}
${Boost_PYTHON37-MT_LIBRARY_RELEASE})
- endif ()
- if (Boost_PYTHON38-MT_LIBRARY_RELEASE)
- set(PYTHON_WRAPPER_LIBS ${PYTHON_WRAPPER_LIBS}
${Boost_PYTHON38-MT_LIBRARY_RELEASE})
- endif ()
- if (Boost_PYTHON39-MT_LIBRARY_RELEASE)
- set(PYTHON_WRAPPER_LIBS ${PYTHON_WRAPPER_LIBS}
${Boost_PYTHON39-MT_LIBRARY_RELEASE})
- endif ()
- if (Boost_PYTHON310-MT_LIBRARY_RELEASE)
- set(PYTHON_WRAPPER_LIBS ${PYTHON_WRAPPER_LIBS}
${Boost_PYTHON310-MT_LIBRARY_RELEASE})
- endif ()
-endif()
+ find_package(Protobuf REQUIRED)
+ message("Protobuf_LIBRARIES: " ${Protobuf_LIBRARIES})
-if (NOT PYTHON_WRAPPER_LIBS)
- MESSAGE(FATAL_ERROR "Could not find Boost Python library")
-endif ()
+ find_package(curl REQUIRED)
+ message("CURL_LIBRARIES: " ${CURL_LIBRARIES})
-message(STATUS "All libraries: ${PYTHON_WRAPPER_LIBS}")
+ find_package(zlib)
+ message("ZLIB_LIBRARIES: " ${ZLIB_LIBRARIES})
+
+ 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(PYTHON_WRAPPER_LIBS ${PYTHON_WRAPPER_LIBS}
+ ${OPENSSL_LIBRARIES}
+ ${Protobuf_LIBRARIES}
+ ${ZLIB_LIBRARIES}
+ ${LIB_ZSTD}
+ ${LIB_SNAPPY}
+ ${CURL_LIBRARIES}
+ )
-if (LINK_STATIC)
if (APPLE)
set(CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS
"${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS} -undefined dynamic_lookup")
target_link_libraries(_pulsar -Wl,-all_load ${PYTHON_WRAPPER_LIBS})
diff --git a/build-mac-wheels.sh b/build-mac-wheels.sh
deleted file mode 100755
index 38072f6..0000000
--- a/build-mac-wheels.sh
+++ /dev/null
@@ -1,334 +0,0 @@
-#!/usr/bin/env bash
-#
-# 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 -e
-
-PYTHON_VERSIONS=(
- '3.7 3.7.13'
- '3.8 3.8.13'
- '3.9 3.9.10'
- '3.10 3.10.2'
-)
-
-export MACOSX_DEPLOYMENT_TARGET=10.15
-MACOSX_DEPLOYMENT_TARGET_MAJOR=${MACOSX_DEPLOYMENT_TARGET%%.*}
-
-ZLIB_VERSION=1.2.12
-OPENSSL_VERSION=1_1_1n
-BOOST_VERSION=1.78.0
-PROTOBUF_VERSION=3.20.0
-ZSTD_VERSION=1.5.2
-SNAPPY_VERSION=1.1.3
-CURL_VERSION=7.61.0
-
-ROOT_DIR=$(git rev-parse --show-toplevel)
-cd "${ROOT_DIR}"
-
-PULSAR_VERSION=$(cat version.txt | grep pulsar-client-cpp | awk '{print $2}')
-
-# Compile and cache dependencies
-CACHE_DIR=~/.pulsar-mac-wheels-cache
-mkdir -p $CACHE_DIR
-
-cd $CACHE_DIR
-
-PREFIX=$CACHE_DIR/install
-
-###############################################################################
-for line in "${PYTHON_VERSIONS[@]}"; do
- read -r -a PY <<< "$line"
- PYTHON_VERSION=${PY[0]}
- PYTHON_VERSION_LONG=${PY[1]}
-
- if [ ! -f Python-${PYTHON_VERSION_LONG}/.done ]; then
- echo "Building Python $PYTHON_VERSION_LONG"
- curl -O -L
https://www.python.org/ftp/python/${PYTHON_VERSION_LONG}/Python-${PYTHON_VERSION_LONG}.tgz
- tar xfz Python-${PYTHON_VERSION_LONG}.tgz
-
- PY_PREFIX=$CACHE_DIR/py-$PYTHON_VERSION
- pushd Python-${PYTHON_VERSION_LONG}
- if [ $PYTHON_VERSION = '3.7' ]; then
- UNIVERSAL_ARCHS='intel-64'
- PY_CFLAGS=" -arch x86_64"
- else
- UNIVERSAL_ARCHS='universal2'
- fi
-
- CFLAGS="-fPIC -O3 -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}
-I${PREFIX}/include ${PY_CFLAGS}" \
- LDFLAGS=" ${PY_CFLAGS} -L${PREFIX}/lib" \
- ./configure --prefix=$PY_PREFIX --enable-shared
--enable-universalsdk --with-universal-archs=${UNIVERSAL_ARCHS}
- make -j16
- make install
-
- curl -O -L
https://files.pythonhosted.org/packages/27/d6/003e593296a85fd6ed616ed962795b2f87709c3eee2bca4f6d0fe55c6d00/wheel-0.37.1-py2.py3-none-any.whl
- $PY_PREFIX/bin/pip3 install wheel-*.whl
-
- touch .done
- popd
- else
- echo "Using cached Python $PYTHON_VERSION_LONG"
- fi
-done
-
-
-###############################################################################
-if [ ! -f zlib-${ZLIB_VERSION}/.done ]; then
- echo "Building ZLib"
- curl -O -L https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz
- tar xvfz zlib-$ZLIB_VERSION.tar.gz
- pushd zlib-$ZLIB_VERSION
- CFLAGS="-fPIC -O3 -arch arm64 -arch x86_64
-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" ./configure --prefix=$PREFIX
- make -j16
- make install
- touch .done
- popd
-else
- echo "Using cached ZLib"
-fi
-
-###############################################################################
-if [ ! -f openssl-OpenSSL_${OPENSSL_VERSION}.done ]; then
- echo "Building OpenSSL"
- curl -O -L
https://github.com/openssl/openssl/archive/OpenSSL_${OPENSSL_VERSION}.tar.gz
- # -arch arm64 -arch x86_64
- tar xvfz OpenSSL_${OPENSSL_VERSION}.tar.gz
- mv openssl-OpenSSL_${OPENSSL_VERSION}
openssl-OpenSSL_${OPENSSL_VERSION}-arm64
- pushd openssl-OpenSSL_${OPENSSL_VERSION}-arm64
- CFLAGS="-fPIC -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
- ./Configure --prefix=$PREFIX no-shared darwin64-arm64-cc
- make -j8
- make install
- popd
-
- tar xvfz OpenSSL_${OPENSSL_VERSION}.tar.gz
- mv openssl-OpenSSL_${OPENSSL_VERSION}
openssl-OpenSSL_${OPENSSL_VERSION}-x86_64
- pushd openssl-OpenSSL_${OPENSSL_VERSION}-x86_64
- CFLAGS="-fPIC -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
- ./Configure --prefix=$PREFIX no-shared darwin64-x86_64-cc
- make -j8
- make install
- popd
-
- # Create universal binaries
- lipo -create openssl-OpenSSL_${OPENSSL_VERSION}-arm64/libssl.a
openssl-OpenSSL_${OPENSSL_VERSION}-x86_64/libssl.a \
- -output $PREFIX/lib/libssl.a
- lipo -create openssl-OpenSSL_${OPENSSL_VERSION}-arm64/libcrypto.a
openssl-OpenSSL_${OPENSSL_VERSION}-x86_64/libcrypto.a \
- -output $PREFIX/lib/libcrypto.a
-
- touch openssl-OpenSSL_${OPENSSL_VERSION}.done
-else
- echo "Using cached OpenSSL"
-fi
-
-###############################################################################
-BOOST_VERSION_=${BOOST_VERSION//./_}
-for line in "${PYTHON_VERSIONS[@]}"; do
- read -r -a PY <<< "$line"
- PYTHON_VERSION=${PY[0]}
- PYTHON_VERSION_LONG=${PY[1]}
-
- DIR=boost-src-${BOOST_VERSION}-python-${PYTHON_VERSION}
- if [ ! -f $DIR/.done ]; then
- echo "Building Boost for Py $PYTHON_VERSION"
- curl -O -L
https://boostorg.jfrog.io/artifactory/main/release/${BOOST_VERSION}/source/boost_${BOOST_VERSION_}.tar.gz
- tar xfz boost_${BOOST_VERSION_}.tar.gz
- mv boost_${BOOST_VERSION_} $DIR
-
- PY_PREFIX=$CACHE_DIR/py-$PYTHON_VERSION
- PY_INCLUDE_DIR=${PY_PREFIX}/include/python${PYTHON_VERSION}
- if [ $PYTHON_VERSION = '3.7' ]; then
- PY_INCLUDE_DIR=${PY_INCLUDE_DIR}m
- fi
-
- pushd $DIR
- cat <<EOF > user-config.jam
- using python : $PYTHON_VERSION
- : python3
- : ${PY_INCLUDE_DIR}
- : ${PY_PREFIX}/lib
- ;
-EOF
- ./bootstrap.sh --with-libraries=python --with-python=python3
--with-python-root=$PY_PREFIX \
- --prefix=$CACHE_DIR/boost-py-$PYTHON_VERSION
- ./b2 address-model=64 cxxflags="-fPIC -arch arm64 -arch x86_64
-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
- link=static threading=multi \
- --user-config=./user-config.jam \
- variant=release python=${PYTHON_VERSION} \
- -j16 \
- install
- touch .done
- popd
- else
- echo "Using cached Boost for Py $PYTHON_VERSION"
- fi
-
-done
-
-
-
-###############################################################################
-if [ ! -f protobuf-${PROTOBUF_VERSION}/.done ]; then
- echo "Building Protobuf"
- curl -O -L
https://github.com/google/protobuf/releases/download/v${PROTOBUF_VERSION}/protobuf-cpp-${PROTOBUF_VERSION}.tar.gz
- tar xvfz protobuf-cpp-${PROTOBUF_VERSION}.tar.gz
- pushd protobuf-${PROTOBUF_VERSION}
- CXXFLAGS="-fPIC -arch arm64 -arch x86_64
-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
- ./configure --prefix=$PREFIX
- make -j16
- make install
- touch .done
- popd
-else
- echo "Using cached Protobuf"
-fi
-
-###############################################################################
-if [ ! -f zstd-${ZSTD_VERSION}/.done ]; then
- echo "Building ZStd"
- curl -O -L
https://github.com/facebook/zstd/releases/download/v${ZSTD_VERSION}/zstd-${ZSTD_VERSION}.tar.gz
- tar xvfz zstd-${ZSTD_VERSION}.tar.gz
- pushd zstd-${ZSTD_VERSION}
- CFLAGS="-fPIC -O3 -arch arm64 -arch x86_64
-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" PREFIX=$PREFIX \
- make -j16 install
- touch .done
- popd
-else
- echo "Using cached ZStd"
-fi
-
-###############################################################################
-if [ ! -f snappy-${SNAPPY_VERSION}/.done ]; then
- echo "Building Snappy"
- curl -O -L
https://github.com/google/snappy/releases/download/${SNAPPY_VERSION}/snappy-${SNAPPY_VERSION}.tar.gz
- tar xvfz snappy-${SNAPPY_VERSION}.tar.gz
- pushd snappy-${SNAPPY_VERSION}
- CXXFLAGS="-fPIC -O3 -arch arm64 -arch x86_64
-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
- ./configure --prefix=$PREFIX
- make -j16
- make install
- touch .done
- popd
-else
- echo "Using cached Snappy"
-fi
-
-###############################################################################
-if [ ! -f curl-${CURL_VERSION}/.done ]; then
- echo "Building LibCurl"
- CURL_VERSION_=${CURL_VERSION//./_}
- curl -O -L
https://github.com/curl/curl/releases/download/curl-${CURL_VERSION_}/curl-${CURL_VERSION}.tar.gz
- tar xfz curl-${CURL_VERSION}.tar.gz
- pushd curl-${CURL_VERSION}
- CFLAGS="-fPIC -arch arm64 -arch x86_64
-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
- ./configure --with-ssl=$PREFIX \
- --without-nghttp2 --without-libidn2 --disable-ldap \
- --prefix=$PREFIX
- make -j16 install
- touch .done
- popd
-else
- echo "Using cached LibCurl"
-fi
-
-###############################################################################
-if [ ! -f apache-pulsar-${PULSAR_VERSION}-src/.done ]; then
- echo "Building Pulsar C++ client - ${PULSAR_VERSION}"
- curl -O -L
https://archive.apache.org/dist/pulsar/pulsar-${PULSAR_VERSION}/apache-pulsar-${PULSAR_VERSION}-src.tar.gz
- rm -rf apache-pulsar-${PULSAR_VERSION}-src/pulsar-client-cpp
- tar xfz apache-pulsar-${PULSAR_VERSION}-src.tar.gz
- pushd apache-pulsar-${PULSAR_VERSION}-src
- pushd pulsar-client-cpp
- ARCHS='arm64;x86_64'
-
- chmod +x build-support/merge_archives.sh
- set -x
- cmake . \
- -DCMAKE_OSX_ARCHITECTURES=${ARCHS} \
- -DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} \
- -DCMAKE_INSTALL_PREFIX=$PREFIX \
- -DCMAKE_BUILD_TYPE=Release \
- -DCMAKE_PREFIX_PATH=$PREFIX \
- -DCMAKE_CXX_FLAGS=-I$PREFIX/include \
-
-DBoost_INCLUDE_DIR=$CACHE_DIR/boost-py-$PYTHON_VERSION/include \
- -DBoost_LIBRARY_DIR=$CACHE_DIR/boost-py-$PYTHON_VERSION/lib \
- -DLINK_STATIC=OFF \
- -DBUILD_TESTS=OFF \
- -DBUILD_PYTHON_WRAPPER=OFF \
- -DBUILD_WIRESHARK=OFF \
- -DBUILD_DYNAMIC_LIB=OFF \
- -DBUILD_STATIC_LIB=ON \
- -DPROTOC_PATH=$PREFIX/bin/protoc
-
- make -j16 install
- popd
- touch .done
- popd
-else
- echo "Using cached Pulsar C++ client"
-fi
-
-###############################################################################
-###############################################################################
-###############################################################################
-###############################################################################
-
-for line in "${PYTHON_VERSIONS[@]}"; do
- read -r -a PY <<< "$line"
- PYTHON_VERSION=${PY[0]}
- PYTHON_VERSION_LONG=${PY[1]}
- echo
'----------------------------------------------------------------------------'
- echo
'----------------------------------------------------------------------------'
- echo
'----------------------------------------------------------------------------'
- echo "Build wheel for Python $PYTHON_VERSION"
-
- cd "${ROOT_DIR}"
-
- find . -name CMakeCache.txt | xargs -r rm
- find . -name CMakeFiles | xargs -r rm -rf
-
- PY_PREFIX=$CACHE_DIR/py-$PYTHON_VERSION
- PY_EXE=$PY_PREFIX/bin/python3
-
- PY_INCLUDE_DIR=${PY_PREFIX}/include/python${PYTHON_VERSION}
- ARCHS='arm64;x86_64'
- if [ $PYTHON_VERSION = '3.7' ]; then
- PY_INCLUDE_DIR=${PY_INCLUDE_DIR}m
- ARCHS='x86_64'
- fi
-
- set -x
- cmake . \
- -DCMAKE_OSX_ARCHITECTURES=${ARCHS} \
- -DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} \
- -DCMAKE_INSTALL_PREFIX=$PREFIX \
- -DCMAKE_BUILD_TYPE=Release \
- -DCMAKE_PREFIX_PATH=$PREFIX \
- -DCMAKE_CXX_FLAGS=-I$PREFIX/include \
- -DBoost_INCLUDE_DIR=$CACHE_DIR/boost-py-$PYTHON_VERSION/include \
- -DBoost_LIBRARY_DIR=$CACHE_DIR/boost-py-$PYTHON_VERSION/lib \
- -DPython3_INCLUDE_DIR=$PY_INCLUDE_DIR \
- -DPython3_LIBRARY=$PY_PREFIX/lib/libpython${PYTHON_VERSION}.dylib \
- -DPULSAR_INCLUDE=${PREFIX}/include
-
- make clean
- make -j16
-
- $PY_EXE setup.py bdist_wheel
-done
diff --git a/build-support/install-cpp-client.sh
b/build-support/copy-deps-versionfile.sh
similarity index 61%
copy from build-support/install-cpp-client.sh
copy to build-support/copy-deps-versionfile.sh
index 2efe8f2..0a36d10 100755
--- a/build-support/install-cpp-client.sh
+++ b/build-support/copy-deps-versionfile.sh
@@ -18,19 +18,12 @@
# under the License.
#
-set -e -x
+set -e
ROOT_DIR=$(git rev-parse --show-toplevel)
-cd $ROOT_DIR
-
-CPP_CLIENT_VERSION=$(cat pulsar-client-cpp-version.txt | xargs)
-
-# Fetch the client binaries
-## TODO: Fetch from official release once it's available
-pushd /tmp
- curl -L -O
https://github.com/merlimat/pulsar-client-cpp/releases/download/${CPP_CLIENT_VERSION}/apache-pulsar-client.deb
- curl -L -O
https://github.com/merlimat/pulsar-client-cpp/releases/download/${CPP_CLIENT_VERSION}/apache-pulsar-client-dev.deb
-popd
-
-sudo apt install /tmp/apache-pulsar-client.deb
/tmp/apache-pulsar-client-dev.deb
+for dir in manylinux2014 manylinux_musl; do
+ mkdir -p pkg/$dir/.build
+ cp $ROOT_DIR/dependencies.yaml pkg/$dir/.build
+ cp $ROOT_DIR/build-support/dep-version.py pkg/$dir/.build
+done
diff --git a/build-support/install-cpp-client.sh b/build-support/dep-version.py
similarity index 57%
copy from build-support/install-cpp-client.sh
copy to build-support/dep-version.py
index 2efe8f2..31200cd 100755
--- a/build-support/install-cpp-client.sh
+++ b/build-support/dep-version.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/usr/bin/env python3
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
@@ -18,19 +18,7 @@
# under the License.
#
-set -e -x
+import yaml, sys
-ROOT_DIR=$(git rev-parse --show-toplevel)
-
-cd $ROOT_DIR
-
-CPP_CLIENT_VERSION=$(cat pulsar-client-cpp-version.txt | xargs)
-
-# Fetch the client binaries
-## TODO: Fetch from official release once it's available
-pushd /tmp
- curl -L -O
https://github.com/merlimat/pulsar-client-cpp/releases/download/${CPP_CLIENT_VERSION}/apache-pulsar-client.deb
- curl -L -O
https://github.com/merlimat/pulsar-client-cpp/releases/download/${CPP_CLIENT_VERSION}/apache-pulsar-client-dev.deb
-popd
-
-sudo apt install /tmp/apache-pulsar-client.deb
/tmp/apache-pulsar-client-dev.deb
+deps = yaml.safe_load(open("dependencies.yaml"))
+print(deps[sys.argv[1]])
diff --git a/build-support/install-cpp-client.sh
b/build-support/install-cpp-client.sh
index 2efe8f2..ac493c1 100755
--- a/build-support/install-cpp-client.sh
+++ b/build-support/install-cpp-client.sh
@@ -20,17 +20,48 @@
set -e -x
-ROOT_DIR=$(git rev-parse --show-toplevel)
+ROOT_DIR=$(dirname $(dirname $0))
+CPP_CLIENT_VERSION=$(cat $ROOT_DIR/pulsar-client-cpp-version.txt | xargs)
-cd $ROOT_DIR
+if [ $USER != "root" ]; then
+ SUDO="sudo"
+fi
-CPP_CLIENT_VERSION=$(cat pulsar-client-cpp-version.txt | xargs)
+# Get the flavor of Linux
+export $(cat /etc/*-release | grep "^ID=")
+
+cd /tmp
# Fetch the client binaries
## TODO: Fetch from official release once it's available
-pushd /tmp
- curl -L -O
https://github.com/merlimat/pulsar-client-cpp/releases/download/${CPP_CLIENT_VERSION}/apache-pulsar-client.deb
- curl -L -O
https://github.com/merlimat/pulsar-client-cpp/releases/download/${CPP_CLIENT_VERSION}/apache-pulsar-client-dev.deb
-popd
+BASE_URL=https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-cpp-${CPP_CLIENT_VERSION}-candidate-1
+
+UNAME_ARCH=$(uname -m)
+if [ $UNAME_ARCH == 'aarch64' ]; then
+ PLATFORM=arm64
+else
+ PLATFORM=x86_64
+fi
+
+if [ $ID == 'ubuntu' ]; then
+ curl -L -O ${BASE_URL}/deb-${PLATFORM}/apache-pulsar-client.deb
+ curl -L -O ${BASE_URL}/deb-${PLATFORM}/apache-pulsar-client-dev.deb
+ $SUDO apt install -y /tmp/*.deb
+
+elif [ $ID == 'alpine' ]; then
+ curl -L -O
${BASE_URL}/apk-${PLATFORM}/apache-pulsar-client-${CPP_CLIENT_VERSION}-r0.apk
+ curl -L -O
${BASE_URL}/apk-${PLATFORM}/apache-pulsar-client-dev-${CPP_CLIENT_VERSION}-r0.apk
+ $SUDO apk add --allow-untrusted /tmp/*.apk
+
+elif [ $ID == '"centos"' ]; then
+ curl -L -O
${BASE_URL}/rpm-${PLATFORM}/${UNAME_ARCH}/apache-pulsar-client-${CPP_CLIENT_VERSION}-1.${UNAME_ARCH}.rpm
+ curl -L -O
${BASE_URL}/rpm-${PLATFORM}/${UNAME_ARCH}/apache-pulsar-client-devel-${CPP_CLIENT_VERSION}-1.${UNAME_ARCH}.rpm
+ $SUDO rpm -i /tmp/*.rpm
+
+else
+ echo "Unknown Linux distribution: '$ID'"
+ exit 1
+fi
+
+
-sudo apt install /tmp/apache-pulsar-client.deb
/tmp/apache-pulsar-client-dev.deb
diff --git a/build-support/install-cpp-client.sh b/dependencies.yaml
old mode 100755
new mode 100644
similarity index 57%
copy from build-support/install-cpp-client.sh
copy to dependencies.yaml
index 2efe8f2..d91f97e
--- a/build-support/install-cpp-client.sh
+++ b/dependencies.yaml
@@ -1,4 +1,3 @@
-#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
@@ -18,19 +17,13 @@
# under the License.
#
-set -e -x
+boost: 1.80.0
-ROOT_DIR=$(git rev-parse --show-toplevel)
-
-cd $ROOT_DIR
-
-CPP_CLIENT_VERSION=$(cat pulsar-client-cpp-version.txt | xargs)
-
-# Fetch the client binaries
-## TODO: Fetch from official release once it's available
-pushd /tmp
- curl -L -O
https://github.com/merlimat/pulsar-client-cpp/releases/download/${CPP_CLIENT_VERSION}/apache-pulsar-client.deb
- curl -L -O
https://github.com/merlimat/pulsar-client-cpp/releases/download/${CPP_CLIENT_VERSION}/apache-pulsar-client-dev.deb
-popd
-
-sudo apt install /tmp/apache-pulsar-client.deb
/tmp/apache-pulsar-client-dev.deb
+# Only used for MacOS builds
+cmake: 3.24.2
+protobuf: 3.20.0
+zlib: 1.2.12
+zstd: 1.5.2
+snappy: 1.1.9
+openssl: 1.1.1q
+curl: 7.85.0
diff --git a/build-support/install-cpp-client.sh
b/pkg/build-wheel-inside-docker.sh
similarity index 59%
copy from build-support/install-cpp-client.sh
copy to pkg/build-wheel-inside-docker.sh
index 2efe8f2..a477b35 100755
--- a/build-support/install-cpp-client.sh
+++ b/pkg/build-wheel-inside-docker.sh
@@ -20,17 +20,23 @@
set -e -x
-ROOT_DIR=$(git rev-parse --show-toplevel)
+cd /pulsar-client-python
-cd $ROOT_DIR
+build-support/install-cpp-client.sh
-CPP_CLIENT_VERSION=$(cat pulsar-client-cpp-version.txt | xargs)
+rm -f CMakeCache.txt CMakeFiles
-# Fetch the client binaries
-## TODO: Fetch from official release once it's available
-pushd /tmp
- curl -L -O
https://github.com/merlimat/pulsar-client-cpp/releases/download/${CPP_CLIENT_VERSION}/apache-pulsar-client.deb
- curl -L -O
https://github.com/merlimat/pulsar-client-cpp/releases/download/${CPP_CLIENT_VERSION}/apache-pulsar-client-dev.deb
-popd
+cmake . \
+ -DCMAKE_BUILD_TYPE=Release
-sudo apt install /tmp/apache-pulsar-client.deb
/tmp/apache-pulsar-client-dev.deb
+make -j4
+
+./setup.py bdist_wheel
+
+# Audit wheel is required to convert a wheel that is tagged as generic
+# 'linux' into a 'multilinux' wheel.
+# Only wheel files tagged as multilinux can be uploaded to PyPI
+# Audit wheel will make sure no external dependencies are needed for
+# the shared library and that only symbols supported by most linux
+# distributions are used.
+auditwheel repair dist/pulsar_client*-$PYTHON_SPEC-linux_*.whl
diff --git a/pkg/mac/build-dependencies.sh b/pkg/mac/build-dependencies.sh
new file mode 100755
index 0000000..35f8685
--- /dev/null
+++ b/pkg/mac/build-dependencies.sh
@@ -0,0 +1,237 @@
+#!/usr/bin/env bash
+#
+# 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 -e -x
+
+ROOT_DIR=$(git rev-parse --show-toplevel)
+cd "${ROOT_DIR}"
+
+PYTHON_VERSION=$1
+PYTHON_VERSION_LONG=$2
+
+source pkg/mac/common.sh
+
+pip3 install pyyaml
+
+dep=$ROOT_DIR/build-support/dep-version.py
+ZLIB_VERSION=$($dep zlib)
+OPENSSL_VERSION=$($dep openssl)
+BOOST_VERSION=$($dep boost)
+PROTOBUF_VERSION=$($dep protobuf)
+ZSTD_VERSION=$($dep zstd)
+SNAPPY_VERSION=$($dep snappy)
+CURL_VERSION=$($dep curl)
+
+# Compile and cache dependencies
+CACHE_DIR=${CACHE_DIR_DEPS}
+mkdir -p $CACHE_DIR
+cd $CACHE_DIR
+
+PREFIX=$CACHE_DIR/install
+
+
+###############################################################################
+if [ ! -f zlib-${ZLIB_VERSION}/.done ]; then
+ echo "Building ZLib"
+ curl -O -L https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz
+ tar xfz zlib-$ZLIB_VERSION.tar.gz
+ pushd zlib-$ZLIB_VERSION
+ CFLAGS="-fPIC -O3 -arch arm64 -arch x86_64
-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" ./configure --prefix=$PREFIX
+ make -j16
+ make install
+ touch .done
+ popd
+else
+ echo "Using cached ZLib"
+fi
+
+###############################################################################
+if [ ! -f Python-${PYTHON_VERSION_LONG}/.done ]; then
+ echo "Building Python $PYTHON_VERSION_LONG"
+ curl -O -L
https://www.python.org/ftp/python/${PYTHON_VERSION_LONG}/Python-${PYTHON_VERSION_LONG}.tgz
+ tar xfz Python-${PYTHON_VERSION_LONG}.tgz
+
+ pushd Python-${PYTHON_VERSION_LONG}
+ if [ $PYTHON_VERSION = '3.7' ]; then
+ UNIVERSAL_ARCHS='intel-64'
+ PY_CFLAGS=" -arch x86_64"
+ else
+ UNIVERSAL_ARCHS='universal2'
+ fi
+
+ CFLAGS="-fPIC -O3 -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}
-I${PREFIX}/include ${PY_CFLAGS}" \
+ LDFLAGS=" ${PY_CFLAGS} -L${PREFIX}/lib" \
+ ./configure --prefix=$PREFIX --enable-shared --enable-universalsdk
--with-universal-archs=${UNIVERSAL_ARCHS}
+ make -j16
+ make install
+
+ curl -O -L
https://files.pythonhosted.org/packages/27/d6/003e593296a85fd6ed616ed962795b2f87709c3eee2bca4f6d0fe55c6d00/wheel-0.37.1-py2.py3-none-any.whl
+ $PREFIX/bin/pip3 install wheel-*.whl
+
+ touch .done
+ popd
+else
+ echo "Using cached Python $PYTHON_VERSION_LONG"
+fi
+
+###############################################################################
+OPENSSL_VERSION_UNDERSCORE=$(echo $OPENSSL_VERSION | sed 's/\./_/g')
+if [ ! -f openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}.done ]; then
+ echo "Building OpenSSL"
+ curl -O -L
https://github.com/openssl/openssl/archive/OpenSSL_${OPENSSL_VERSION_UNDERSCORE}.tar.gz
+ # -arch arm64 -arch x86_64
+ tar xfz OpenSSL_${OPENSSL_VERSION_UNDERSCORE}.tar.gz
+
+ mv openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}
openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}-arm64
+ pushd openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}-arm64
+ echo -e "#include <string.h>\n$(cat test/v3ext.c)" > test/v3ext.c
+ CFLAGS="-fPIC -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
+ ./Configure --prefix=$PREFIX no-shared no-unit-test darwin64-arm64-cc
+ make -j8
+ make install_sw
+ popd
+
+ tar xfz OpenSSL_${OPENSSL_VERSION_UNDERSCORE}.tar.gz
+ mv openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}
openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}-x86_64
+ pushd openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}-x86_64
+ echo -e "#include <string.h>\n$(cat test/v3ext.c)" > test/v3ext.c
+ CFLAGS="-fPIC -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
+ ./Configure --prefix=$PREFIX no-shared no-unit-test
darwin64-x86_64-cc
+ make -j8
+ make install_sw
+ popd
+
+ # Create universal binaries
+ lipo -create openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}-arm64/libssl.a
openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}-x86_64/libssl.a \
+ -output $PREFIX/lib/libssl.a
+ lipo -create
openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}-arm64/libcrypto.a
openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}-x86_64/libcrypto.a \
+ -output $PREFIX/lib/libcrypto.a
+
+ touch openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}.done
+else
+ echo "Using cached OpenSSL"
+fi
+
+###############################################################################
+BOOST_VERSION_=${BOOST_VERSION//./_}
+DIR=boost-src-${BOOST_VERSION}
+if [ ! -f $DIR/.done ]; then
+ echo "Building Boost for Py $PYTHON_VERSION"
+ curl -O -L
https://boostorg.jfrog.io/artifactory/main/release/${BOOST_VERSION}/source/boost_${BOOST_VERSION_}.tar.gz
+ tar xfz boost_${BOOST_VERSION_}.tar.gz
+ mv boost_${BOOST_VERSION_} $DIR
+
+ PY_INCLUDE_DIR=${PREFIX}/include/python${PYTHON_VERSION}
+ if [ $PYTHON_VERSION = '3.7' ]; then
+ PY_INCLUDE_DIR=${PY_INCLUDE_DIR}m
+ fi
+
+ pushd $DIR
+ cat <<EOF > user-config.jam
+ using python : $PYTHON_VERSION
+ : python3
+ : ${PY_INCLUDE_DIR}
+ : ${PREFIX}/lib
+ ;
+EOF
+ ./bootstrap.sh --with-libraries=python --with-python=python3
--with-python-root=$PREFIX \
+ --prefix=${PREFIX}
+ ./b2 -d0 address-model=64 cxxflags="-fPIC -arch arm64 -arch x86_64
-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
+ link=static threading=multi \
+ --user-config=./user-config.jam \
+ variant=release python=${PYTHON_VERSION} \
+ -j16 \
+ install
+ touch .done
+ popd
+else
+ echo "Using cached Boost for Py $PYTHON_VERSION"
+fi
+
+
+
+###############################################################################
+if [ ! -f protobuf-${PROTOBUF_VERSION}/.done ]; then
+ echo "Building Protobuf"
+ curl -O -L
https://github.com/google/protobuf/releases/download/v${PROTOBUF_VERSION}/protobuf-cpp-${PROTOBUF_VERSION}.tar.gz
+ tar xfz protobuf-cpp-${PROTOBUF_VERSION}.tar.gz
+ pushd protobuf-${PROTOBUF_VERSION}
+ CXXFLAGS="-fPIC -arch arm64 -arch x86_64
-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
+ ./configure --prefix=$PREFIX
+ make -j16
+ make install
+ touch .done
+ popd
+else
+ echo "Using cached Protobuf"
+fi
+
+###############################################################################
+if [ ! -f zstd-${ZSTD_VERSION}/.done ]; then
+ echo "Building ZStd"
+ curl -O -L
https://github.com/facebook/zstd/releases/download/v${ZSTD_VERSION}/zstd-${ZSTD_VERSION}.tar.gz
+ tar xfz zstd-${ZSTD_VERSION}.tar.gz
+ pushd zstd-${ZSTD_VERSION}
+ CFLAGS="-fPIC -O3 -arch arm64 -arch x86_64
-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" PREFIX=$PREFIX \
+ make -j16 -C lib install-static install-includes
+ touch .done
+ popd
+else
+ echo "Using cached ZStd"
+fi
+
+###############################################################################
+if [ ! -f snappy-${SNAPPY_VERSION}/.done ]; then
+ echo "Building Snappy"
+ curl -O -L
https://github.com/google/snappy/archive/refs/tags/${SNAPPY_VERSION}.tar.gz
+ tar xfz ${SNAPPY_VERSION}.tar.gz
+ pushd snappy-${SNAPPY_VERSION}
+ CXXFLAGS="-fPIC -O3 -arch arm64 -arch x86_64
-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
+ cmake . -DCMAKE_INSTALL_PREFIX=$PREFIX -DSNAPPY_BUILD_TESTS=OFF
-DSNAPPY_BUILD_BENCHMARKS=OFF
+ make -j16
+ make install
+ touch .done
+ popd
+else
+ echo "Using cached Snappy"
+fi
+
+###############################################################################
+if [ ! -f curl-${CURL_VERSION}/.done ]; then
+ echo "Building LibCurl"
+ CURL_VERSION_=${CURL_VERSION//./_}
+ curl -O -L
https://github.com/curl/curl/releases/download/curl-${CURL_VERSION_}/curl-${CURL_VERSION}.tar.gz
+ tar xfz curl-${CURL_VERSION}.tar.gz
+ pushd curl-${CURL_VERSION}
+ CFLAGS="-fPIC -arch arm64 -arch x86_64
-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
+ ./configure --with-ssl=$PREFIX \
+ --without-nghttp2 \
+ --without-libidn2 \
+ --disable-ldap \
+ --without-brotli \
+ --without-secure-transport \
+ --disable-ipv6 \
+ --prefix=$PREFIX
+ make -j16 install
+ touch .done
+ popd
+else
+ echo "Using cached LibCurl"
+fi
diff --git a/pkg/mac/build-mac-wheels.sh b/pkg/mac/build-mac-wheels.sh
new file mode 100755
index 0000000..edb23f5
--- /dev/null
+++ b/pkg/mac/build-mac-wheels.sh
@@ -0,0 +1,80 @@
+#!/usr/bin/env bash
+#
+# 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 -e -x
+
+ROOT_DIR=$(git rev-parse --show-toplevel)
+cd "${ROOT_DIR}"
+
+source pkg/mac/common.sh
+
+PYTHON_CLIENT_VERSION=$(cat version.txt | xargs)
+
+PYTHON_VERSION=$1
+
+###############################################################################
+###############################################################################
+###############################################################################
+###############################################################################
+PREFIX=${CACHE_DIR_DEPS}/install
+
+echo
'----------------------------------------------------------------------------'
+echo
'----------------------------------------------------------------------------'
+echo
'----------------------------------------------------------------------------'
+echo "Build wheel for Python $PYTHON_VERSION"
+
+cd "${ROOT_DIR}"
+
+rm -f CMakeCache.txt
+
+PY_EXE=$PREFIX/bin/python3
+PIP_EXE=$PREFIX/bin/pip3
+
+ARCHS='arm64;x86_64'
+PIP_TAG='universal2'
+if [ $PYTHON_VERSION = '3.7' ]; then
+ ARCHS='x86_64'
+ PIP_TAG=$ARCHS
+fi
+
+cmake . \
+ -DCMAKE_OSX_ARCHITECTURES=${ARCHS} \
+ -DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_PREFIX_PATH=$PREFIX \
+ -DCMAKE_CXX_FLAGS=-I$PREFIX/include \
+ -DLINK_STATIC=ON \
+ -DPULSAR_LIBRARY=${CACHE_DIR_CPP_CLIENT}/install/lib/libpulsar.a \
+ -DPULSAR_INCLUDE=${CACHE_DIR_CPP_CLIENT}/install/include \
+ -DPython3_ROOT_DIR=$PREFIX \
+ -DBOOST_ROOT=${PREFIX}
+
+make clean
+make -j16 VERBOSE=1
+
+$PY_EXE setup.py bdist_wheel
+
+PY_SPEC=$(echo $PYTHON_VERSION | sed 's/\.//g')
+
+cd /tmp
+$PIP_EXE install --no-dependencies --force-reinstall \
+
$ROOT_DIR/dist/pulsar_client-${PYTHON_CLIENT_VERSION}-cp$PY_SPEC-*-macosx_10_15_${PIP_TAG}.whl
+$PY_EXE -c 'import pulsar'
+
diff --git a/pkg/mac/build-pulsar-cpp.sh b/pkg/mac/build-pulsar-cpp.sh
new file mode 100755
index 0000000..c1eb514
--- /dev/null
+++ b/pkg/mac/build-pulsar-cpp.sh
@@ -0,0 +1,64 @@
+#!/usr/bin/env bash
+#
+# 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 -e -x
+
+ROOT_DIR=$(git rev-parse --show-toplevel)
+cd "${ROOT_DIR}"
+
+source pkg/mac/common.sh
+
+PULSAR_CPP_VERSION=$(cat pulsar-client-cpp-version.txt | xargs)
+
+# Compile and cache dependencies
+mkdir -p $CACHE_DIR_CPP_CLIENT
+cd $CACHE_DIR_CPP_CLIENT
+
+PREFIX=$CACHE_DIR_CPP_CLIENT/install
+
+DEPS_PREFIX=${CACHE_DIR_DEPS}/install
+
+###############################################################################
+
+## TODO: Fetch from official release
+curl -O -L
https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-cpp-${PULSAR_CPP_VERSION}-candidate-1/apache-pulsar-client-cpp-${PULSAR_CPP_VERSION}.tar.gz
+tar xfz apache-pulsar-client-cpp-${PULSAR_CPP_VERSION}.tar.gz
+
+if [ ! -f apache-pulsar-client-cpp-${PULSAR_CPP_VERSION}/.done ]; then
+ pushd apache-pulsar-client-cpp-${PULSAR_CPP_VERSION}
+ ARCHS='arm64;x86_64'
+
+ cmake . \
+ -DCMAKE_OSX_ARCHITECTURES=${ARCHS} \
+ -DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} \
+ -DCMAKE_INSTALL_PREFIX=$PREFIX \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_PREFIX_PATH=${DEPS_PREFIX} \
+ -DCMAKE_CXX_FLAGS=-I${DEPS_PREFIX}/include \
+ -DLINK_STATIC=OFF \
+ -DBUILD_TESTS=OFF \
+ -DBUILD_WIRESHARK=OFF \
+ -DBUILD_DYNAMIC_LIB=OFF \
+ -DBUILD_STATIC_LIB=ON \
+ -DPROTOC_PATH=${DEPS_PREFIX}/bin/protoc
+
+ make -j16 install
+ popd
+fi
diff --git a/build-support/install-cpp-client.sh b/pkg/mac/common.sh
old mode 100755
new mode 100644
similarity index 58%
copy from build-support/install-cpp-client.sh
copy to pkg/mac/common.sh
index 2efe8f2..fa2ed35
--- a/build-support/install-cpp-client.sh
+++ b/pkg/mac/common.sh
@@ -18,19 +18,8 @@
# under the License.
#
-set -e -x
+export MACOSX_DEPLOYMENT_TARGET=10.15
+export MACOSX_DEPLOYMENT_TARGET_MAJOR=${MACOSX_DEPLOYMENT_TARGET%%.*}
-ROOT_DIR=$(git rev-parse --show-toplevel)
-
-cd $ROOT_DIR
-
-CPP_CLIENT_VERSION=$(cat pulsar-client-cpp-version.txt | xargs)
-
-# Fetch the client binaries
-## TODO: Fetch from official release once it's available
-pushd /tmp
- curl -L -O
https://github.com/merlimat/pulsar-client-cpp/releases/download/${CPP_CLIENT_VERSION}/apache-pulsar-client.deb
- curl -L -O
https://github.com/merlimat/pulsar-client-cpp/releases/download/${CPP_CLIENT_VERSION}/apache-pulsar-client-dev.deb
-popd
-
-sudo apt install /tmp/apache-pulsar-client.deb
/tmp/apache-pulsar-client-dev.deb
+CACHE_DIR_DEPS=$PWD/.pulsar-mac-build/deps
+CACHE_DIR_CPP_CLIENT=$PWD/.pulsar-mac-build/cpp
diff --git a/pkg/manylinux2014/Dockerfile b/pkg/manylinux2014/Dockerfile
new file mode 100644
index 0000000..7355585
--- /dev/null
+++ b/pkg/manylinux2014/Dockerfile
@@ -0,0 +1,56 @@
+#
+# 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.
+#
+
+ARG ARCH
+FROM quay.io/pypa/manylinux2014_${ARCH}
+
+ARG PYTHON_VERSION
+ARG PYTHON_SPEC
+ARG PLATFORM
+ARG ARCH
+
+ENV PYTHON_VERSION=${PYTHON_VERSION}
+ENV PYTHON_SPEC=${PYTHON_SPEC}
+
+ENV PATH="/opt/python/${PYTHON_SPEC}/bin:${PATH}"
+
+ENV PYTHON_INCLUDE_DIR /opt/python/${PYTHON_SPEC}/include
+ENV PYTHON_LIBRARIES /opt/python/${PYTHON_SPEC}/lib/python${PYTHON_VERSION}
+
+RUN pip3 install pyyaml
+
+ADD .build/dependencies.yaml /
+ADD .build/dep-version.py /usr/local/bin
+
+# Download and compile boost
+RUN BOOST_VERSION=$(dep-version.py boost) && \
+ BOOST_VERSION_UNDESRSCORE=$(echo $BOOST_VERSION | sed 's/\./_/g') && \
+ curl -O -L
https://boostorg.jfrog.io/artifactory/main/release/${BOOST_VERSION}/source/boost_${BOOST_VERSION_UNDESRSCORE}.tar.gz
&& \
+ tar xfz boost_${BOOST_VERSION_UNDESRSCORE}.tar.gz && \
+ cd boost_${BOOST_VERSION_UNDESRSCORE} && \
+ ./bootstrap.sh --with-libraries=python && \
+ ./b2 -d0 address-model=64 cxxflags=-fPIC link=shared threading=multi
variant=release install && \
+ rm -rf /boost_${BOOST_VERSION_UNDESRSCORE}.tar.gz
/boost_${BOOST_VERSION_UNDESRSCORE}
+
+RUN CMAKE_VERSION=$(dep-version.py cmake) && \
+ curl -O -L
https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-${ARCH}.tar.gz
&& \
+ tar xfz cmake-${CMAKE_VERSION}-linux-${ARCH}.tar.gz && \
+ cp cmake-${CMAKE_VERSION}-linux-${ARCH}/bin/* /usr/bin/ && \
+ cp -r cmake-${CMAKE_VERSION}-linux-${ARCH}/share/cmake-* /usr/share/ && \
+ rm -rf cmake-${CMAKE_VERSION}-linux-${ARCH}
cmake-${CMAKE_VERSION}-linux-${ARCH}.tar.gz
diff --git a/pkg/manylinux_musl/Dockerfile b/pkg/manylinux_musl/Dockerfile
new file mode 100644
index 0000000..f402bec
--- /dev/null
+++ b/pkg/manylinux_musl/Dockerfile
@@ -0,0 +1,53 @@
+#
+# 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.
+#
+
+ARG ARCH
+FROM quay.io/pypa/musllinux_1_1_${ARCH}
+
+ARG PYTHON_VERSION
+ARG PYTHON_SPEC
+
+ENV PYTHON_VERSION=${PYTHON_VERSION}
+ENV PYTHON_SPEC=${PYTHON_SPEC}
+
+ARG ARCH
+ENV ARCH=${ARCH}
+
+ENV PATH="/opt/python/${PYTHON_SPEC}/bin:${PATH}"
+ENV PYTHON_INCLUDE_DIR /opt/python/${PYTHON_SPEC}/include
+ENV PYTHON_LIBRARIES /opt/python/${PYTHON_SPEC}/lib/python${PYTHON_VERSION}
+
+RUN pip install pyyaml
+
+RUN apk add cmake
+
+ADD .build/dependencies.yaml /
+ADD .build/dep-version.py /usr/local/bin
+
+# Download and compile boost
+RUN BOOST_VERSION=$(dep-version.py boost) && \
+ BOOST_VERSION_UNDESRSCORE=$(echo $BOOST_VERSION | sed 's/\./_/g') && \
+ curl -O -L
https://boostorg.jfrog.io/artifactory/main/release/${BOOST_VERSION}/source/boost_${BOOST_VERSION_UNDESRSCORE}.tar.gz
&& \
+ tar xfz boost_${BOOST_VERSION_UNDESRSCORE}.tar.gz && \
+ cd boost_${BOOST_VERSION_UNDESRSCORE} && \
+ ./bootstrap.sh --with-libraries=python && \
+ ./b2 -d0 address-model=64 cxxflags=-fPIC link=shared threading=multi
variant=release install && \
+ rm -rf /boost_${BOOST_VERSION_UNDESRSCORE}.tar.gz
/boost_${BOOST_VERSION_UNDESRSCORE}
+
+
diff --git a/build-support/install-cpp-client.sh b/pkg/test-wheel.sh
similarity index 58%
copy from build-support/install-cpp-client.sh
copy to pkg/test-wheel.sh
index 2efe8f2..d19b280 100755
--- a/build-support/install-cpp-client.sh
+++ b/pkg/test-wheel.sh
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/usr/bin/env sh
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
@@ -20,17 +20,9 @@
set -e -x
-ROOT_DIR=$(git rev-parse --show-toplevel)
+cd /
-cd $ROOT_DIR
+pip3 install /pulsar-client-python/wheelhouse/pulsar_client-*.whl
-CPP_CLIENT_VERSION=$(cat pulsar-client-cpp-version.txt | xargs)
-
-# Fetch the client binaries
-## TODO: Fetch from official release once it's available
-pushd /tmp
- curl -L -O
https://github.com/merlimat/pulsar-client-cpp/releases/download/${CPP_CLIENT_VERSION}/apache-pulsar-client.deb
- curl -L -O
https://github.com/merlimat/pulsar-client-cpp/releases/download/${CPP_CLIENT_VERSION}/apache-pulsar-client-dev.deb
-popd
-
-sudo apt install /tmp/apache-pulsar-client.deb
/tmp/apache-pulsar-client-dev.deb
+# Load the wheel to ensure there are no linking problems
+python3 -c 'import pulsar'
diff --git a/pulsar-client-cpp-version.txt b/pulsar-client-cpp-version.txt
index 6390d75..4a36342 100644
--- a/pulsar-client-cpp-version.txt
+++ b/pulsar-client-cpp-version.txt
@@ -1 +1 @@
-3.0.0-pre-1
+3.0.0
diff --git a/pulsar/__init__.py b/pulsar/__init__.py
index 942ec8f..ef17844 100644
--- a/pulsar/__init__.py
+++ b/pulsar/__init__.py
@@ -116,7 +116,6 @@ _schema = schema
import re
_retype = type(re.compile('x'))
-import certifi
from datetime import timedelta
@@ -469,6 +468,7 @@ class Client:
if tls_trust_certs_file_path:
conf.tls_trust_certs_file_path(tls_trust_certs_file_path)
else:
+ import certifi
conf.tls_trust_certs_file_path(certifi.where())
conf.tls_allow_insecure_connection(tls_allow_insecure_connection)
conf.tls_validate_hostname(tls_validate_hostname)