1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
diff --git a/bindings/python/CMakeLists.txt b/bindings/python/CMakeLists.txt
index 0b9b3ebe7..74e608901 100644
--- a/bindings/python/CMakeLists.txt
+++ b/bindings/python/CMakeLists.txt
@@ -1,7 +1,6 @@
# To build python bindings we need a python executable and boost python module. Unfortunately,
# their names might not be interlinked and we can not implement a general solution.
-# The code below assumes default boost installation, when the module for python 2 is named
-# 'python' and the module for python 3 is named 'python3'.
+# The code below assumes default boost installation, when the module for python 3 is named 'python3'.
# To customize that one can provide a name for the Boost::python module via
# 'boost-python-module-name' variable when invoking cmake.
# E.g. on Gentoo with python 3.6 and Boost::python library name 'libboost_python-3.6.so'
@@ -15,12 +14,9 @@
# Sets _ret to a list of python versions (major.minor) that use the same MSVC runtime as this build does
# assumes MSVC was detected already
# See https://en.wikipedia.org/wiki/Microsoft_Visual_C++#Internal_version_numbering
+# See https://devguide.python.org/#status-of-python-branches for supported python versions
function(_get_compatible_python_versions _ret)
- if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 15 AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 16)
- list(APPEND _tmp 2.6 2.7 3.0 3.1 3.2)
- elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16 AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 17)
- list(APPEND _tmp 3.3 3.4)
- elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19 AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 20)
+ if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19 AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 20)
list(APPEND _tmp 3.5 3.6 3.7 3.8)
endif()
set(${_ret} ${_tmp} PARENT_SCOPE)
@@ -31,31 +27,26 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC" AND NOT skip-python-runtime-test)
_get_compatible_python_versions(Python_ADDITIONAL_VERSIONS)
endif()
-find_package(PythonInterp REQUIRED)
+find_package(Python3 COMPONENTS Interpreter Development REQUIRED)
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC" AND NOT skip-python-runtime-test)
- message(STATUS "Testing found python version. Requested: ${Python_ADDITIONAL_VERSIONS}, found: ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}")
- if (NOT "${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}" IN_LIST Python_ADDITIONAL_VERSIONS)
- message(FATAL_ERROR "Incompatible Python and C runtime: MSVC ${CMAKE_CXX_COMPILER_VERSION} and Python ${PYTHON_VERSION_STRING}")
+ message(STATUS "Testing found python version. Requested: ${Python_ADDITIONAL_VERSIONS}, found: ${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}")
+ if (NOT "${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}" IN_LIST Python_ADDITIONAL_VERSIONS)
+ message(FATAL_ERROR "Incompatible Python and C runtime: MSVC ${CMAKE_CXX_COMPILER_VERSION} and Python ${Python3_VERSION}")
endif()
endif()
-set(Python_ADDITIONAL_VERSIONS "${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}")
-find_package(PythonLibs REQUIRED)
+set(Python_ADDITIONAL_VERSIONS "${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}")
if (NOT boost-python-module-name)
# use active python
- if (PYTHON_VERSION_STRING VERSION_GREATER_EQUAL "3")
- set(_boost-python-module-name "python${PYTHON_VERSION_MAJOR}")
- else()
- set(_boost-python-module-name "python") # to overwrite possible value from a previous run
- endif()
+ set(_boost-python-module-name "python${Python3_VERSION_MAJOR}")
endif()
set(boost-python-module-name ${_boost-python-module-name} CACHE STRING "Boost:python module name, e.g. 'pythom-3.6'")
find_package(Boost REQUIRED COMPONENTS ${boost-python-module-name})
-python_add_module(python-libtorrent
+Python3_add_library(python-libtorrent STATIC
src/module.cpp
src/sha1_hash.cpp
src/converters.cpp
@@ -80,12 +71,12 @@ python_add_module(python-libtorrent
set_target_properties(python-libtorrent
PROPERTIES
- OUTPUT_NAME libtorrent
+ OUTPUT_NAME torrent
)
target_include_directories(python-libtorrent
PRIVATE
- ${PYTHON_INCLUDE_DIRS}
+ ${Python3_INCLUDE_DIRS}
)
string(TOUPPER "${boost-python-module-name}" boost_python_module_name_uppercase)
@@ -96,7 +87,7 @@ target_link_libraries(python-libtorrent
# Boost::python adds that but without a path to the library. Therefore we have to either
# provide the path (but, unfortunately, FindPythonLibs.cmake does not return the library dir),
# or give the full file name here (this FindPythonLibs.cmake provides to us).
- ${PYTHON_LIBRARIES}
+ ${Python3_LIBRARIES}
)
# Bindings module uses deprecated libtorrent features, thus we disable these warnings
@@ -108,7 +99,7 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
endif()
execute_process(COMMAND
- ${PYTHON_EXECUTABLE} -c "import distutils.sysconfig;
+ ${Python3_EXECUTABLE} -c "import distutils.sysconfig;
print(';'.join(map(str, [
distutils.sysconfig.get_python_lib(plat_specific=True, prefix=''),
distutils.sysconfig.get_config_var('EXT_SUFFIX')
@@ -119,13 +110,11 @@ list(GET _python_sysconfig_vars 0 PYTHON_SITE_PACKAGES)
list(GET _python_sysconfig_vars 1 PYTHON_EXT_SUFFIX)
message(STATUS "Python site packages: ${PYTHON_SITE_PACKAGES}")
-# python 2 does not provide the 'EXT_SUFFIX' sysconfig variable, so we use cmake default then
-if (NOT "${PYTHON_EXT_SUFFIX}" STREQUAL "None")
- message(STATUS "Python extension suffix: ${PYTHON_EXT_SUFFIX}")
- # we mimic the name, created by setuptools
- # example: libtorrent.cpython-36m-x86_64-linux-gnu.so
- set_target_properties(python-libtorrent PROPERTIES SUFFIX ${PYTHON_EXT_SUFFIX})
-endif()
+
+message(STATUS "Python extension suffix: ${PYTHON_EXT_SUFFIX}")
+# we mimic the name, created by setuptools
+# example: libtorrent.cpython-36m-x86_64-linux-gnu.so
+set_target_properties(python-libtorrent PROPERTIES SUFFIX ${PYTHON_EXT_SUFFIX})
set(SETUP_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/setup.py.cmake.in")
set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py")
@@ -135,8 +124,8 @@ set(DEPS python-libtorrent "${SETUP_PY}")
configure_file(${SETUP_PY_IN} ${SETUP_PY} @ONLY)
add_custom_command(OUTPUT ${OUTPUT}
- COMMAND ${PYTHON_EXECUTABLE} ${SETUP_PY} build -b "${CMAKE_CURRENT_SOURCE_DIR}"
- COMMAND ${PYTHON_EXECUTABLE} ${SETUP_PY} egg_info -b "${CMAKE_CURRENT_SOURCE_DIR}"
+ COMMAND ${Python3_EXECUTABLE} ${SETUP_PY} build -b "${CMAKE_CURRENT_SOURCE_DIR}"
+ COMMAND ${Python3_EXECUTABLE} ${SETUP_PY} egg_info -b "${CMAKE_CURRENT_SOURCE_DIR}"
COMMAND ${CMAKE_COMMAND} -E touch ${OUTPUT}
DEPENDS ${DEPS})
|