From 16ae822c0d019dabcade3c55b0f1edbab9ca58f3 Mon Sep 17 00:00:00 2001 From: "Benjamin A. Beasley" Date: Mon, 13 Dec 2021 20:26:45 -0500 Subject: [PATCH] Add Python bindings --- zxing-cpp-1.2.0-system-pybind11.patch | 18 +++++++++ zxing-cpp.spec | 57 ++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 zxing-cpp-1.2.0-system-pybind11.patch diff --git a/zxing-cpp-1.2.0-system-pybind11.patch b/zxing-cpp-1.2.0-system-pybind11.patch new file mode 100644 index 0000000..849b13d --- /dev/null +++ b/zxing-cpp-1.2.0-system-pybind11.patch @@ -0,0 +1,18 @@ +diff -Naur zxing-cpp-1.2.0-original/wrappers/python/CMakeLists.txt zxing-cpp-1.2.0/wrappers/python/CMakeLists.txt +--- zxing-cpp-1.2.0-original/wrappers/python/CMakeLists.txt 2021-05-28 06:47:09.000000000 -0400 ++++ zxing-cpp-1.2.0/wrappers/python/CMakeLists.txt 2021-12-13 20:31:22.286170793 -0500 +@@ -1,13 +1,7 @@ + cmake_minimum_required(VERSION 3.14) + project(ZXingPython) + +-# get pybind11 +-include(FetchContent) +-#set(FETCHCONTENT_QUIET Off) +-FetchContent_Declare (pybind11 +- GIT_REPOSITORY https://github.com/pybind/pybind11.git +- GIT_TAG v2.6.2) +-FetchContent_MakeAvailable (pybind11) ++find_package(pybind11) + + # check if we are called from the top-level ZXing project + get_directory_property(hasParent PARENT_DIRECTORY) diff --git a/zxing-cpp.spec b/zxing-cpp.spec index aac107e..3da7def 100644 --- a/zxing-cpp.spec +++ b/zxing-cpp.spec @@ -35,6 +35,9 @@ Patch0: 0001-Add-a-mode-to-build-against-system-versions-of-depen.patch # Fixes CVE-2021-28021, CVE-2021-42715, and CVE-2021-42716, and adds a patch # file for zxing-cpp-specific changes Patch1: %{url}/pull/269.patch +# Use the system copy of pybind11 rather than trying to download a copy. This +# patch is unconditional, so it is not, as-is, suitable for sending upstream. +Patch2: zxing-cpp-1.2.0-system-pybind11.patch %description ZXing-C++ ("zebra crossing") is an open-source, multi-format 1D/2D barcode @@ -56,6 +59,18 @@ Requires: %{name}%{?_isa} = %{version}-%{release} The %{name}-devel package contains libraries and header files for developing applications that use %{name}. +%package -n python3-%{name} +Summary: Python bindings for the %{name} barcode library + +BuildRequires: python3-devel +BuildRequires: pybind11-devel +BuildRequires: chrpath + +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description -n python3-%{name} +%{summary}. + %prep %autosetup -p1 # remove bundled stb libraries: @@ -67,12 +82,50 @@ pushd thirdparty/stb patch -p1 < stb_image.patch popd +# don’t use unversioned “python” interpreter in tests +sed -r -i 's@(COMMAND )python@\1%{python3}@' wrappers/python/CMakeLists.txt +# we don’t need cmake as a python dependency +sed -r -i '/cmake/d' wrappers/python/pyproject.toml +# build verbosely: + +%generate_buildrequires +pushd wrappers/python &>/dev/null +%pyproject_buildrequires -r +popd &>/dev/null + %build -%cmake -DBUILD_EXAMPLES=OFF +# Setting BUILD_PYTHON_MODULE builds a Python extension shared library module, +# but we don’t get any metadata (dist-info), so it’s not terribly useful for +# packaging purposes. Instead, it seems we must re-build the whole library +# through setuptools to get that. +%cmake -DBUILD_EXAMPLES=OFF -DBUILD_PYTHON_MODULE=ON %cmake_build +pushd wrappers/python +# CMake respects this environment variable. We need to see the compiler +# invocations to verify the distro build flags are respected. Unfortunately, +# pybind11 does add -O3, and there doesn’t seem to be a way to turn that off. +# It’s a global pybind11 decision, not something in this package’s sources. +export VERBOSE=1 +%pyproject_wheel +popd %install %cmake_install +pushd wrappers/python +%pyproject_install +# Now we do something sneaky: we substitute the Python extension that was built +# in the original CMake invocation, replacing the one built with setuptools. It +# is dynamically linked against the main libZXing.so, which makes it smaller, +# and it was not built with that pesky -O3 that was added by pybind11, so it +# better complies with packaging guidelines. The only problem is it contains an +# rpath that we need to remove. +popd +install -t '%{buildroot}%{python3_sitearch}' -p \ + %{_vpath_builddir}/wrappers/python/zxingcpp.*.so +chrpath --delete %{buildroot}%{python3_sitearch}/zxingcpp.*.so +pushd wrappers/python +%pyproject_save_files zxingcpp +popd %check %ctest @@ -89,6 +142,8 @@ popd %{_libdir}/cmake/ZXing/ %{_libdir}/pkgconfig/zxing.pc +%files -n python3-%{name} -f %{pyproject_files} + %changelog * Fri Dec 10 2021 Caolán McNamara 1.2.0-1 - initial import