From patchwork Tue Aug 19 01:23:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 24160 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 3142BBDCC1 for ; Tue, 19 Aug 2025 01:24:30 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7AA516926D; Tue, 19 Aug 2025 03:24:29 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Ps00IPT3"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id F1C53613C5 for ; Tue, 19 Aug 2025 03:24:25 +0200 (CEST) Received: from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi [81.175.209.231]) by perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 5D2FBC6D; Tue, 19 Aug 2025 03:23:28 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1755566608; bh=HFVJ7KHekzH6I2S+XJMkq2TsCTyNeUVcVZws6ggkezg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ps00IPT3c372dgCpHP3yk9lTEVkJeF0Q6EsREMaa4UHHQOg6g3Ab3k9Ig0hzCANd9 3BircFuXuE86PoerqotBOgwTUVqFU2b8zStC+UqnsK/JMqI8ftvYiN8CAKI8GOkH5q Aa4WQrNBI1R4xZJQX7qmLKc5H+bPO51Hj6Wrau/g= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Cc: William Vinnicombe , Tomi Valkeinen Subject: [PATCH v3 1/3] py: libcamera: Improve python binding installation Date: Tue, 19 Aug 2025 04:23:59 +0300 Message-ID: <20250819012402.8395-2-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.49.1 In-Reply-To: <20250819012402.8395-1-laurent.pinchart@ideasonboard.com> References: <20250819012402.8395-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" From: William Vinnicombe The existing meson.build file installs the bindings to a manually constructed directory that is not included in the Python path in most distributions. For instance, on a Debian 12 system, the modules is intalled in /usr/lib/x86_64-linux-gnu/python3.11/site-packages/, while the Python interpreter looks for site packages in /usr/lib/python3/dist-packages/. It also always builds the bindings using the system Python, as it searches for the Python library using the standard dependency() function. This prevents build the Python bindings for a different interpreter version without changing the system default interpreter. Modify the build process to use the meson python module to build the Python bindings targets, so it installs them to the correct directories for Python. This also allows specifying a different target Python interpreter through the '[binaries]' section of a meson native file. The behaviour is not changed for cross-compilation, as the meson python module has known issues in that case. Signed-off-by: William Vinnicombe Co-developed-by: Laurent Pinchart Signed-off-by: Laurent Pinchart --- src/py/libcamera/meson.build | 41 ++++++++++++++++++++++++------------ src/py/meson.build | 13 +++++++++++- test/py/meson.build | 3 --- 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/py/libcamera/meson.build b/src/py/libcamera/meson.build index 33ab65798559..fe22ffd2f70b 100644 --- a/src/py/libcamera/meson.build +++ b/src/py/libcamera/meson.build @@ -57,16 +57,35 @@ pycamera_args = [ '-DPYBIND11_USE_SMART_HOLDER_AS_DEFAULT', ] -destdir = get_option('libdir') / ('python' + py3_dep.version()) / 'site-packages' / 'libcamera' +if meson.is_cross_build() + # Meson doesn't correctly support cross-compilation through the python + # module. There's work in progress to fix this, based on PEP 739 + # (https://github.com/mesonbuild/meson/pull/14657). While waiting for this + # to become available, work around the issue by using shared_module(). + destdir = get_option('libdir') / ('python' + py3_dep.version()) / 'site-packages' / 'libcamera' -pycamera = shared_module('_libcamera', - pycamera_sources, - install : true, - install_dir : destdir, - install_tag : 'python-runtime', - name_prefix : '', - dependencies : pycamera_deps, - cpp_args : pycamera_args) + pycamera = shared_module('_libcamera', + pycamera_sources, + install : true, + install_dir : destdir, + install_tag : 'python-runtime', + name_prefix : '', + dependencies : pycamera_deps, + cpp_args : pycamera_args) + install_data(['__init__.py'], + install_dir : destdir, + install_tag : 'python-runtime') +else + pycamera = py3.extension_module('_libcamera', + pycamera_sources, + install : true, + subdir : 'libcamera', + dependencies : pycamera_deps, + cpp_args : pycamera_args) + py3.install_sources(['__init__.py'], + subdir : 'libcamera', + pure : false) +endif # Create symlinks from the build dir to the source dir so that we can use the # Python module directly from the build dir. @@ -79,10 +98,6 @@ run_command('ln', '-fsrT', meson.current_source_dir() / 'utils', meson.current_build_dir() / 'utils', check : true) -install_data(['__init__.py'], - install_dir : destdir, - install_tag : 'python-runtime') - # \todo Generate stubs when building. See https://peps.python.org/pep-0484/#stub-files # Note: Depends on pybind11-stubgen. To generate pylibcamera stubs: # $ PYTHONPATH=build/src/py pybind11-stubgen --no-setup-py -o build/src/py libcamera diff --git a/src/py/meson.build b/src/py/meson.build index 9228069711be..24102f83d2e1 100644 --- a/src/py/meson.build +++ b/src/py/meson.build @@ -1,6 +1,17 @@ # SPDX-License-Identifier: CC0-1.0 -py3_dep = dependency('python3', required : get_option('pycamera')) +if meson.is_cross_build() + py3_dep = dependency('python3', required : get_option('pycamera')) +else + py3 = import('python').find_installation('python3', required : get_option('pycamera')) + if not py3.found() + pycamera_enabled = false + subdir_done() + endif + + py3_dep = py3.dependency(required : get_option('pycamera')) +endif + pybind11_dep = dependency('pybind11', required : get_option('pycamera')) pycamera_enabled = py3_dep.found() and pybind11_dep.found() diff --git a/test/py/meson.build b/test/py/meson.build index b922e8578c29..d014aac4573e 100644 --- a/test/py/meson.build +++ b/test/py/meson.build @@ -15,9 +15,6 @@ endif py_env = environment() -pymod = import('python') -py3 = pymod.find_installation('python3') - pypathdir = meson.project_build_root() / 'src' / 'py' py_env.append('PYTHONPATH', pypathdir)