[libcamera-devel] [PATCH] py: libcamera: Improve python binding installation

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed Oct 25 13:04:02 CEST 2023


Hi William,

(CC'ing Tomi)

Thank you for the patch.

On Wed, Oct 25, 2023 at 10:36:49AM +0100, William Vinnicombe via libcamera-devel wrote:
> The existing meson.build file installs the bindings to an architecture
> specific libdir (eg /usr/local/lib/aarch64-linux-gnu/), which is not
> picked up by default python which only looks in the non architecture
> specific libdir (eg /usr/local/lib/python3.11/). It also will always
> build using the system python, rather than building using the same
> python as meson is using. This prevents a user being able to build the
> bindings for a different version of python, without changing their
> system python to that version.
> 
> 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, and builds them for the version of python that meson is
> running with.
> 
> Signed-off-by: William Vinnicombe <william.vinnicombe at raspberrypi.com>
> ---
>  src/py/libcamera/meson.build | 23 ++++++++++++-----------
>  1 file changed, 12 insertions(+), 11 deletions(-)
> 
> diff --git a/src/py/libcamera/meson.build b/src/py/libcamera/meson.build
> index f58c7198..e9e3f915 100644
> --- a/src/py/libcamera/meson.build
> +++ b/src/py/libcamera/meson.build
> @@ -1,6 +1,8 @@
>  # SPDX-License-Identifier: CC0-1.0
>  
> -py3_dep = dependency('python3', required : get_option('pycamera'))
> +
> +py = import('python').find_installation('python3', required : get_option('pycamera'))
> +py3_dep = py.dependency(required : get_option('pycamera'))

Does this still work when cross-compiling ? I recall we tried the meson
python module, and it had problems with cross-compilation. Tomi may know
more.

>  
>  if not py3_dep.found()
>      pycamera_enabled = false
> @@ -78,15 +80,12 @@ pycamera_args = [
>      '-DPYBIND11_USE_SMART_HOLDER_AS_DEFAULT',
>  ]
>  
> -destdir = get_option('libdir') / ('python' + py3_dep.version()) / 'site-packages' / 'libcamera'
> -
> -pycamera = shared_module('_libcamera',
> -                         pycamera_sources,
> -                         install : true,
> -                         install_dir : destdir,
> -                         name_prefix : '',
> -                         dependencies : pycamera_deps,
> -                         cpp_args : pycamera_args)
> +pycamera = py.extension_module('_libcamera',
> +                               pycamera_sources,
> +                               install : true,
> +                               subdir : 'libcamera',
> +                               dependencies : pycamera_deps,
> +                               cpp_args : pycamera_args)
>  
>  # Create symlinks from the build dir to the source dir so that we can use the
>  # Python module directly from the build dir.
> @@ -99,7 +98,9 @@ run_command('ln', '-fsrT', meson.current_source_dir() / 'utils',
>              meson.current_build_dir() / 'utils',
>              check : true)
>  
> -install_data(['__init__.py'], install_dir : destdir)
> +py.install_sources(['__init__.py'],
> +                   subdir : 'libcamera',
> +                   pure : false)
>  
>  # \todo Generate stubs when building. See https://peps.python.org/pep-0484/#stub-files
>  # Note: Depends on pybind11-stubgen. To generate pylibcamera stubs:

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list