Brad Smith writes:
> On 5/16/2022 11:21 PM, Nam Nguyen wrote:
>> This diff additionally:
>> - removes ${FILESDIR}/setup.py and uses boost-build. This depends on a
>> diff for devel/boost to install b2 and bjam. I will send this after this
>> e-mail.
>>
>> The motivation is to lower maintenance of carrying a local copy of
>> setup.py with an upside of easier transition to 2.0 in the future.
>>
>> - minor bump to 5.1 instead of major bump
>>
>> check_sym shows added symbols.
>> see:
>> https://github.com/arvidn/libtorrent/commit/175c20a897ce29a6ba42b564d015d90d7dceefb1
>> https://github.com/arvidn/libtorrent/commit/9a73ab76233fecd4948a32169d07086d871fc939
>>
>> Diffing reveals that a function in a public header was
>> removed. Specifically, libtorrent::dh_key_exchange::good() in
>> include/libtorrent/pe_crypto.hpp was removed.
>> see:
>> https://github.com/arvidn/libtorrent/commit/175c20a897ce29a6ba42b564d015d90d7dceefb1
>>
>> Is my understanding correct? good() has its definition in a header so it
>> is inline and never shows up in the shared object
>> (libtorrent-rasterbar.so.5.0).
>>
>> Even right above it in the same link,
>> include/libtorrent/bt_peer_connection.hpp removes init_bt_handshake from
>> enum class state_t. This enum class has changed.
>>
>> In these two cases, because they affect headers, consumers could include
>> the header, but it never shows up in the shared object. Thus, no need to
>> major bump?
>
> Ya, I was not 100% sure of this part so I thought it's better to be on
> the safe side.
ping now that boost-build is back in devel/boost and is in the mirrors.
There is a major bump, as Brad had suggested, due to removal of
libtorrent::dh_key_exchange::good() in pe_crypto.hpp.
Should I use `ONLY_FOR_ARCHS = ${CLANG_ARCHS}'?
Inside the patch for bindings/python/setup.py, I have added
`toolset=clang cxxstd=17...'. Usage of `toolset=gcc' instead, according to
${WRKSRC}/bindings/python/Jamfile, adds:
result += <lt-visibility>hidden ;
result += <linkflags>-Wl,-Bsymbolic
<toolset>gcc:<cxxflags>-Wno-deprecated-declarations
which is not too drastic of a difference from clang.
There has not really been testing on non-clang arches. It is no worse
off than before, so I propose omitting ONLY_FOR_ARCHS for now.
>
>> Testing
>> =======
>> I was able to download a linux iso torrent with qbittorrent and deluge.
>>
>> Testers will need to apply the b2/bjam diff to devel/boost I will be
>> sending shortly.
>>
>> Feedback and tests are welcome. OK?
To test, upgrade to boost-1.79.0p0v0 so boost-build is available.
OK?
Index: Makefile
===================================================================
RCS file: /cvs/ports/net/libtorrent-rasterbar/Makefile,v
retrieving revision 1.21
diff -u -p -u -p -r1.21 Makefile
--- Makefile 11 Mar 2022 19:46:17 -0000 1.21
+++ Makefile 21 Jun 2022 02:15:04 -0000
@@ -1,10 +1,9 @@
COMMENT = C++ library implementing a BitTorrent client
-MODPY_EGG_VERSION = 1.2.15
+MODPY_EGG_VERSION = 1.2.16
DISTNAME = libtorrent-rasterbar-${MODPY_EGG_VERSION}
-REVISION = 0
-SHARED_LIBS += torrent-rasterbar 5.0 # 10.0.0
+SHARED_LIBS += torrent-rasterbar 6.0 # 10.0.0
CATEGORIES = net devel
@@ -13,13 +12,15 @@ HOMEPAGE = https://libtorrent.org/
# BSD3
PERMIT_PACKAGE = Yes
-WANTLIB += ${COMPILER_LIBCXX} boost_python${MODPY_VERSION:C/\.//g}-mt
-WANTLIB += boost_system-mt crypto iconv m ssl
+WANTLIB += ${COMPILER_LIBCXX} boost_python${MODPY_VERSION:C/\.//g}
+WANTLIB += boost_system boost_system-mt crypto iconv m ssl
MASTER_SITES =
https://github.com/arvidn/libtorrent/releases/download/v${MODPY_EGG_VERSION}/
MODULES = lang/python
+MODPY_SETUPTOOLS = Yes
+
BUILD_DEPENDS = devel/libtool
LIB_DEPENDS = converters/libiconv \
@@ -47,13 +48,18 @@ MAKE_ENV = CC="${CC}" CXX="${CXX}"
CONFIGURE_ARGS += --enable-debug
.endif
+post-patch:
+ ${SUBST_CMD} ${WRKSRC}/Jamfile
+
pre-configure:
sed -i 's,-Os,,g' ${WRKSRC}/configure
-# use setup.py from 1.2.11 because >=1.2.12 introduced dependency on
boost-build
- ${SUBST_CMD} -m 644 -c ${FILESDIR}/setup.py \
- ${WRKSRC}/bindings/python/setup.py
pre-test:
ln -sf ${MODPY_BIN} ${WRKDIR}/bin/python
+
+EGG = ${PREFIX}/lib/python${MODPY_VERSION}/site-packages/libtorrent-*.egg
+post-install:
+ mv ${EGG}/libtorrent.cpython-${MODPY_VERSION:C/\.//g}.so ${EGG}/..
+ rm -rf ${EGG}
.include <bsd.port.mk>
Index: distinfo
===================================================================
RCS file: /cvs/ports/net/libtorrent-rasterbar/distinfo,v
retrieving revision 1.10
diff -u -p -u -p -r1.10 distinfo
--- distinfo 31 Dec 2021 00:31:16 -0000 1.10
+++ distinfo 21 Jun 2022 02:15:04 -0000
@@ -1,2 +1,2 @@
-SHA256 (libtorrent-rasterbar-1.2.15.tar.gz) =
yK2GOGhMCpA+urwwSQB54xsaamONoq3sWovvag5iIUs=
-SIZE (libtorrent-rasterbar-1.2.15.tar.gz) = 4163049
+SHA256 (libtorrent-rasterbar-1.2.16.tar.gz) =
W9wiFmJUGr3DJN7Qp0tc0/MOYmCHEIC0pLMpX7CfAuA=
+SIZE (libtorrent-rasterbar-1.2.16.tar.gz) = 4163867
Index: files/setup.py
===================================================================
RCS file: files/setup.py
diff -N files/setup.py
--- files/setup.py 22 May 2021 21:47:28 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,196 +0,0 @@
-#!${MODPY_BIN}
-
-
-from distutils.core import setup, Extension
-from distutils.sysconfig import get_config_vars
-import os
-import platform
-import sys
-import shutil
-import multiprocessing
-
-
-class flags_parser:
- def __init__(self):
- self.include_dirs = []
- self.library_dirs = []
- self.libraries = []
-
- def parse(self, args):
- """Parse out the -I -L -l directives
-
- Returns:
- list: All other arguments
- """
- ret = []
- for token in args.split():
- prefix = token[:2]
- if prefix == '-I':
- self.include_dirs.append(token[2:])
- elif prefix == '-L':
- self.library_dirs.append(token[2:])
- elif prefix == '-l':
- self.libraries.append(token[2:])
- else:
- ret.append(token)
- return ret
-
-
-def arch():
- if platform.system() == 'Darwin':
- __, __, machine = platform.mac_ver()
- if machine.startswith('ppc'):
- return ['-arch', machine]
- return []
-
-
-def target_specific():
- if platform.system() == 'Darwin':
- # On mavericks, clang will fail when unknown arguments are passed in.
- # python distutils will pass in arguments it doesn't know about.
- return ['-Wno-error=unused-command-line-argument-hard-error-in-future']
- return []
-
-
-try:
- with open('compile_flags') as _file:
- extra_cmd = _file.read()
-except Exception:
- extra_cmd = None
-
-try:
- with open('link_flags') as _file:
- ldflags = _file.read()
-except Exception:
- ldflags = None
-
-# this is to pull out compiler arguments from the CXX flags set up by the
-# configure script. Specifically, the -std=c++11 flag is added to CXX and here
-# we pull out everything starting from the first flag (i.e. something starting
-# with a '-'). The actual command to call the compiler may be more than one
-# word, for instance "ccache g++".
-try:
- with open('compile_cmd') as _file:
- cmd = _file.read().split(' ')
- while len(cmd) > 0 and not cmd[0].startswith('-'):
- cmd = cmd[1:]
- extra_cmd += ' '.join(cmd)
-except Exception:
- pass
-
-ext = None
-packages = None
-
-if '--bjam' in sys.argv:
- del sys.argv[sys.argv.index('--bjam')]
-
- if '--help' not in sys.argv \
- and '--help-commands' not in sys.argv:
-
- toolset = ''
- file_ext = '.so'
-
- if platform.system() == 'Windows':
- file_ext = '.pyd'
- # See https://wiki.python.org/moin/WindowsCompilers for a table of
msvc versions
- # used for each python version
- # Specify the full version number for 9.0 and 10.0 because
apparently
- # older versions of boost don't support only specifying the major
number and
- # there was only one version of msvc with those majors.
- # Only specify the major for msvc-14 so that 14.1, 14.11, etc can
be used.
- # Hopefully people building with msvc-14 are using a new enough
version of boost
- # for this to work.
- if sys.version_info[0:2] in ((2, 6), (2, 7), (3, 0), (3, 1), (3,
2)):
- toolset = ' toolset=msvc-9.0'
- elif sys.version_info[0:2] in ((3, 3), (3, 4)):
- toolset = ' toolset=msvc-10.0'
- elif sys.version_info[0:2] in ((3, 5), (3, 6)):
- toolset = ' toolset=msvc-14'
- else:
- # unknown python version, lets hope the user has the right
version of msvc configured
- toolset = ' toolset=msvc'
-
- parallel_builds = ' -j%d' % multiprocessing.cpu_count()
- if sys.maxsize > 2**32:
- address_model = ' address-model=64'
- else:
- address_model = ' address-model=32'
-
- # add extra quoting around the path to prevent bjam from parsing it as
a list
- # if the path has spaces
- os.environ['LIBTORRENT_PYTHON_INTERPRETER'] = '"' + sys.executable +
'"'
-
- # build libtorrent using bjam and build the installer with distutils
- cmdline = ('b2 libtorrent-link=static boost-link=static release '
- 'optimization=space stage_module --abbreviate-paths' +
- address_model + toolset + parallel_builds)
- print(cmdline)
- if os.system(cmdline) != 0:
- print('build failed')
- sys.exit(1)
-
- try:
- os.mkdir('build')
- except Exception:
- pass
- try:
- shutil.rmtree('build/lib')
- except Exception:
- pass
- try:
- os.mkdir('build/lib')
- except Exception:
- pass
- try:
- os.mkdir('libtorrent')
- except Exception:
- pass
- shutil.copyfile('libtorrent' + file_ext,
- 'build/lib/libtorrent' + file_ext)
-
- packages = ['libtorrent']
-
-else:
- # Remove '-Wstrict-prototypes' compiler option, which isn't valid for C++.
- cfg_vars = get_config_vars()
- for key, value in list(cfg_vars.items()):
- if isinstance(value, str):
- cfg_vars[key] = value.replace('-Wstrict-prototypes', '')
- cfg_vars[key] = value.replace('-L${LOCALBASE}/lib/', '')
-
- src_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "src"))
- source_list = [os.path.join(src_dir, s) for s in os.listdir(src_dir) if
s.endswith(".cpp")]
-
- flags = flags_parser()
- ext_extra = {}
-
- if ldflags:
- # ldflags parsed first to ensure the correct library search path order
- ext_extra["extra_link_args"] = flags.parse(ldflags) + arch()
-
- if extra_cmd:
- ext_extra["extra_compile_args"] = flags.parse(extra_cmd) + arch() +
target_specific()
-
- ext = [Extension(
- 'libtorrent',
- sources=sorted(source_list),
- language='c++',
- include_dirs=flags.include_dirs,
- library_dirs=flags.library_dirs,
- libraries=['torrent-rasterbar'] + flags.libraries,
- **ext_extra)
- ]
-
-setup(
- name='python-libtorrent',
- version='${MODPY_EGG_VERSION}',
- author='Arvid Norberg',
- author_email='[email protected]',
- description='Python bindings for libtorrent-rasterbar',
- long_description='Python bindings for libtorrent-rasterbar',
- url='http://libtorrent.org',
- platforms=[platform.system() + '-' + platform.machine()],
- license='BSD',
- packages=packages,
- ext_modules=ext
-)
Index: patches/patch-Jamfile
===================================================================
RCS file: patches/patch-Jamfile
diff -N patches/patch-Jamfile
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-Jamfile 21 Jun 2022 02:15:04 -0000
@@ -0,0 +1,25 @@
+libtorrent.cpython-*.so fails to load libtorrent-rasterbar.so.10.0.0.
+Give it the proper SHARED_LIB.
+
+Add include path to find boost headers.
+
+Index: Jamfile
+--- Jamfile.orig
++++ Jamfile
+@@ -46,7 +46,7 @@ else
+
+ # we need version numbers in the form X.Y.Z in order to trigger the built-in
+ # support for generating symlinks to the installed library
+-VERSION = 10.0.0 ;
++VERSION = ${LIBtorrent-rasterbar_VERSION} ;
+
+ rule linking ( properties * )
+ {
+@@ -756,6 +756,7 @@ ED25519_SOURCES =
+ local usage-requirements =
+ <include>./include
+ <include>./include/libtorrent
++ <include>${LOCALBASE}/include
+ <include>/usr/sfw/include
+ <variant>release:<define>NDEBUG
+ <define>_FILE_OFFSET_BITS=64
Index: patches/patch-bindings_python_setup_py
===================================================================
RCS file: patches/patch-bindings_python_setup_py
diff -N patches/patch-bindings_python_setup_py
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-bindings_python_setup_py 21 Jun 2022 02:15:04 -0000
@@ -0,0 +1,23 @@
+Index: bindings/python/setup.py
+--- bindings/python/setup.py.orig
++++ bindings/python/setup.py
+@@ -207,7 +207,7 @@ class LibtorrentBuildExt(BuildExtBase):
+ def initialize_options(self):
+
+ self.config_mode = self.CONFIG_MODE_DISTUTILS
+- self.b2_args = ""
++ self.b2_args = "toolset=clang cxxstd=17 libtorrent-python-pic=on"
+ self.no_autoconf = ""
+
+ self.cxxflags = None
+@@ -365,8 +365,8 @@ class LibtorrentBuildExt(BuildExtBase):
+ if os.name == "nt":
+ self._maybe_add_arg("--abbreviate-paths")
+
+- self._maybe_add_arg("boost-link=static")
+- self._maybe_add_arg("libtorrent-link=static")
++ self._maybe_add_arg("boost-link=shared")
++ self._maybe_add_arg("libtorrent-link=shared")
+
+ self._maybe_add_arg("crypto=openssl")
+
Index: patches/patch-include_libtorrent_config_hpp
===================================================================
RCS file:
/cvs/ports/net/libtorrent-rasterbar/patches/patch-include_libtorrent_config_hpp,v
retrieving revision 1.7
diff -u -p -u -p -r1.7 patch-include_libtorrent_config_hpp
--- patches/patch-include_libtorrent_config_hpp 11 Mar 2022 19:46:17 -0000
1.7
+++ patches/patch-include_libtorrent_config_hpp 21 Jun 2022 02:15:04 -0000
@@ -1,7 +1,7 @@
Index: include/libtorrent/config.hpp
--- include/libtorrent/config.hpp.orig
+++ include/libtorrent/config.hpp
-@@ -429,6 +429,10 @@ POSSIBILITY OF SUCH DAMAGE.
+@@ -443,6 +443,10 @@ POSSIBILITY OF SUCH DAMAGE.
#define TORRENT_USE_UNC_PATHS 0
#endif
Index: pkg/PLIST
===================================================================
RCS file: /cvs/ports/net/libtorrent-rasterbar/pkg/PLIST,v
retrieving revision 1.8
diff -u -p -u -p -r1.8 PLIST
--- pkg/PLIST 11 Mar 2022 19:46:17 -0000 1.8
+++ pkg/PLIST 21 Jun 2022 02:15:04 -0000
@@ -54,6 +54,7 @@ include/libtorrent/aux_/session_interfac
include/libtorrent/aux_/session_settings.hpp
include/libtorrent/aux_/session_udp_sockets.hpp
include/libtorrent/aux_/set_socket_buffer.hpp
+include/libtorrent/aux_/set_traffic_class.hpp
include/libtorrent/aux_/socket_type.hpp
include/libtorrent/aux_/storage_piece_set.hpp
include/libtorrent/aux_/storage_utils.hpp
@@ -253,7 +254,6 @@ lib/libtorrent-rasterbar.la
@lib lib/libtorrent-rasterbar.so.${LIBtorrent-rasterbar_VERSION}
lib/pkgconfig/libtorrent-rasterbar.pc
@so
lib/python${MODPY_VERSION}/site-packages/libtorrent.${MODPY_PYC_MAGIC_TAG}so
-lib/python${MODPY_VERSION}/site-packages/python_libtorrent-${MODPY_EGG_VERSION}-py${MODPY_VERSION}.egg-info
share/cmake/
share/cmake/Modules/
share/cmake/Modules/FindLibtorrentRasterbar.cmake