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

William Vinnicombe william.vinnicombe at raspberrypi.com
Thu Nov 23 15:03:02 CET 2023


Could I request some reviews on this V2 of my python patch? It should now
work with cross-compilation, as it still uses the old method for building
the bindings when cross-compiling.

Thanks,
William

On Thu, 26 Oct 2023 at 13:52, William Vinnicombe <
william.vinnicombe at raspberrypi.com> 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. For cross-compiling, still use the previous method to
> build the bindings, as the host machine version of python should be
> used instead.
>
> Signed-off-by: William Vinnicombe <william.vinnicombe at raspberrypi.com>
> ---
>  src/py/libcamera/meson.build | 60 +++++++++++++++++++++++++++---------
>  1 file changed, 45 insertions(+), 15 deletions(-)
>
> diff --git a/src/py/libcamera/meson.build b/src/py/libcamera/meson.build
> index f58c7198..128793aa 100644
> --- a/src/py/libcamera/meson.build
> +++ b/src/py/libcamera/meson.build
> @@ -1,10 +1,25 @@
>  # SPDX-License-Identifier: CC0-1.0
>
> -py3_dep = dependency('python3', required : get_option('pycamera'))
> -
> -if not py3_dep.found()
> -    pycamera_enabled = false
> -    subdir_done()
> +if meson.is_cross_build()
> +    py3_dep = dependency('python3', required : get_option('pycamera'))
> +
> +    if not py3_dep.found()
> +        pycamera_enabled = false
> +        subdir_done()
> +    endif
> +else
> +    py = import('python').find_installation('python3', required :
> get_option('pycamera'))
> +
> +    if not py.found()
> +        pycamera_enabled = false
> +        subdir_done()
> +    else
> +        py3_dep = py.dependency(required : get_option('pycamera'))
> +        if not py3_dep.found()
> +            pycamera_enabled = false
> +            subdir_done()
> +        endif
> +    endif
>  endif
>
>  pybind11_dep = dependency('pybind11', required : get_option('pycamera'))
> @@ -78,15 +93,24 @@ 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)
> +if meson.is_cross_build()
> +    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)
> +else
> +    pycamera = py.extension_module('_libcamera',
> +                                   pycamera_sources,
> +                                   install : true,
> +                                   subdir : 'libcamera',
> +                                   dependencies : pycamera_deps,
> +                                   cpp_args : pycamera_args)
> +endif
>
>  # 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 +123,13 @@ run_command('ln', '-fsrT', meson.current_source_dir()
> / 'utils',
>              meson.current_build_dir() / 'utils',
>              check : true)
>
> -install_data(['__init__.py'], install_dir : destdir)
> +if meson.is_cross_build()
> +    install_data(['__init__.py'], install_dir : destdir)
> +else
> +    py.install_sources(['__init__.py'],
> +                       subdir : 'libcamera',
> +                       pure : false)
> +endif
>
>  # \todo Generate stubs when building. See
> https://peps.python.org/pep-0484/#stub-files
>  # Note: Depends on pybind11-stubgen. To generate pylibcamera stubs:
> --
> 2.39.2
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20231123/f4e0fb4b/attachment.htm>


More information about the libcamera-devel mailing list