Skip to content

Commit a7a0f46

Browse files
committed
Support building with MSVC
Fixes apache#7 ### Motivation The Python client cannot be built with MSVC. ### Modifications Add `vcpkg.json` to download the Boost.Python dependency.
1 parent 3e37e44 commit a7a0f46

File tree

4 files changed

+70
-12
lines changed

4 files changed

+70
-12
lines changed

.gitignore

+3-1
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,6 @@ __pycache__
1313
.pulsar-mac-wheels-cache
1414
.DS_Store
1515
wheelhouse
16-
.pulsar-mac-build
16+
.pulsar-mac-build
17+
vcpkg_installed/
18+
*.pyd

CMakeLists.txt

+54-10
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ project (pulsar-client-python)
2121
cmake_minimum_required(VERSION 3.18)
2222
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake_modules")
2323

24+
if (VCPKG_TRIPLET)
25+
message(STATUS "Use vcpkg, triplet is ${VCPKG_TRIPLET}")
26+
set(CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/vcpkg_installed/${VCPKG_TRIPLET}" ${CMAKE_PREFIX_PATH})
27+
message(STATUS "Use CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
28+
endif ()
2429
option(LINK_STATIC "Link against static libraries" OFF)
2530
MESSAGE(STATUS "LINK_STATIC: " ${LINK_STATIC})
2631

@@ -29,10 +34,22 @@ set(THREADS_PREFER_PTHREAD_FLAG TRUE)
2934
find_package(Threads REQUIRED)
3035
MESSAGE(STATUS "Threads library: " ${CMAKE_THREAD_LIBS_INIT})
3136

37+
if (MSVC)
38+
add_compile_options(/wd4819)
39+
endif ()
40+
3241
if (LINK_STATIC)
33-
find_library(PULSAR_LIBRARY NAMES libpulsar.a)
42+
if (MSVC)
43+
find_library(PULSAR_LIBRARY NAMES pulsarWithDeps.lib)
44+
string(REGEX REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
45+
string(REGEX REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
46+
string(REGEX REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_CXX_FLAGS_RELWITHDEBINFO})
47+
else ()
48+
find_library(PULSAR_LIBRARY NAMES libpulsar.a)
49+
endif ()
50+
add_definitions("-DPULSAR_STATIC")
3451
else()
35-
find_library(PULSAR_LIBRARY NAMES libpulsar.so libpulsar.dylib)
52+
find_library(PULSAR_LIBRARY NAMES pulsar libpulsar)
3653
endif()
3754
message(STATUS "PULSAR_LIBRARY: ${PULSAR_LIBRARY}")
3855

@@ -44,10 +61,29 @@ SET(CMAKE_CXX_STANDARD 11)
4461
find_package (Python3 REQUIRED COMPONENTS Development.Module)
4562
MESSAGE(STATUS "PYTHON: " ${Python3_VERSION} " - " ${Python3_INCLUDE_DIRS})
4663

64+
find_package(Boost REQUIRED ${Boost_INCLUDE_DIRS})
65+
message(STATUS "Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}")
66+
4767
SET(Boost_USE_STATIC_LIBS ${LINK_STATIC})
48-
find_package(Boost REQUIRED COMPONENTS python3)
49-
MESSAGE(STATUS "Boost Python3: " ${Boost_PYTHON3_LIBRARY})
50-
MESSAGE(STATUS "Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}")
68+
69+
set(BOOST_PYTHON_NAME_LIST python3 python310)
70+
foreach (BOOST_PYTHON_NAME IN LISTS BOOST_PYTHON_NAME_LIST)
71+
find_package(Boost QUIET COMPONENTS ${BOOST_PYTHON_NAME})
72+
if (${Boost_FOUND})
73+
set(BOOST_PYTHON_NAME_FOUND ${BOOST_PYTHON_NAME})
74+
message(STATUS "Found Boost COMPONENTS " ${BOOST_PYTHON_NAME_FOUND})
75+
break ()
76+
endif ()
77+
endforeach ()
78+
if (NOT BOOST_PYTHON_NAME_FOUND)
79+
message(FATAL_ERROR "Could not find Boost Python library")
80+
endif ()
81+
find_package(Boost REQUIRED COMPONENTS ${BOOST_PYTHON_NAME_FOUND})
82+
set(Boost_PYTHON3_LIBRARIES
83+
${Boost_PYTHON3_LIBRARY}
84+
${Boost_PYTHON310_LIBRARY}
85+
)
86+
MESSAGE(STATUS "Boost Python3: " ${Boost_PYTHON3_LIBRARIES})
5187

5288
########################################################################################################################
5389

@@ -68,8 +104,11 @@ ADD_LIBRARY(_pulsar SHARED src/pulsar.cc
68104
src/utils.cc
69105
)
70106

71-
SET(CMAKE_SHARED_LIBRARY_PREFIX )
72-
SET(CMAKE_SHARED_LIBRARY_SUFFIX .so)
107+
if (MSVC)
108+
set(CMAKE_SHARED_LIBRARY_SUFFIX .pyd)
109+
else ()
110+
set(CMAKE_SHARED_LIBRARY_SUFFIX .so)
111+
endif ()
73112

74113
if (NOT APPLE AND NOT MSVC)
75114
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_PYTHON}")
@@ -80,12 +119,17 @@ if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
80119
endif()
81120

82121
# Try all possible boost-python variable namings
83-
set(PYTHON_WRAPPER_LIBS ${PULSAR_LIBRARY}
84-
${Boost_PYTHON3_LIBRARY})
122+
set(PYTHON_WRAPPER_LIBS
123+
${PULSAR_LIBRARY}
124+
${Boost_PYTHON3_LIBRARIES})
125+
if (MSVC)
126+
message(STATUS "Python3_LIBRARIES: " ${Python3_LIBRARIES})
127+
set(PYTHON_WRAPPER_LIBS ${PYTHON_WRAPPER_LIBS} ${Python3_LIBRARIES})
128+
endif ()
85129

86130
message(STATUS "All libraries: ${PYTHON_WRAPPER_LIBS}")
87131

88-
if (LINK_STATIC)
132+
if (LINK_STATIC AND NOT MSVC)
89133
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
90134

91135
# We need to include all the static libs individually because we cannot easily create a universal2 libpulsar.a

setup.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from setuptools import setup
2222
from distutils.core import Extension
2323
from os import environ, path
24+
import platform
2425

2526
from distutils.command import build_ext
2627

@@ -58,7 +59,10 @@ def build_extension(self, ext):
5859
except OSError as e:
5960
if e.errno != 17: # already exists
6061
raise
61-
shutil.copyfile('_pulsar.so', self.get_ext_fullpath(ext.name))
62+
if 'Windows' in platform.platform():
63+
shutil.copyfile('_pulsar.pyd', self.get_ext_fullpath(ext.name))
64+
else:
65+
shutil.copyfile('_pulsar.so', self.get_ext_fullpath(ext.name))
6266

6367

6468
# Core Client dependencies

vcpkg.json

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"name": "pulsar-cpp",
3+
"version": "3.0.0",
4+
"description": "Pulsar Python SDK",
5+
"dependencies": [
6+
"boost-python"
7+
]
8+
}

0 commit comments

Comments
 (0)