[PATCH 05/10] meson: utils: Provide environment for Python scripts
Dan Scally
dan.scally at ideasonboard.com
Thu Aug 15 00:09:37 CEST 2024
Hi Laurent
On 09/08/2024 01:59, Laurent Pinchart wrote:
> Python scripts run as part of the build process need to take a few
> actions specific to the environment in which they operate. One of those
> is disabling the Python bytecode cache, to avoid writing file to the
s/file/.pyc files, perhaps?
> source tree. This is done manually in the IPC generate.py and parser.py
> scripts.
>
> The current implementation is not ideal because it hardcodes in the
> scripts information related to the environment in which they operate. As
> those scripts are part of libcamera this is more of a theoretical issue
> than a practical one. A second issue is that future Python scripts will
> need to duplicate similar mechanisms, resulting in a higher maintenance
> burden.
>
> Address the issue with a different approach, by creating a meson
> environment for the Python scripts, and passing it to the
> custom_target() functions. The environment only disables the bytecode
> cache for now.
>
> The diffstat shows an increase in code size. This is expected to be
> offset by usage of the environment for more Python scripts, as well as
> support of more variables in the environment.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
Reviewed-by: Daniel Scally <dan.scally at ideasonboard.com>
> include/libcamera/ipa/meson.build | 21 ++++++++++++-------
> src/libcamera/proxy/meson.build | 3 ++-
> src/libcamera/proxy/worker/meson.build | 3 ++-
> .../include/libcamera/ipa/meson.build | 9 +++++---
> utils/codegen/ipc/generate.py | 3 ---
> utils/codegen/ipc/meson.build | 3 ++-
> utils/codegen/ipc/parser.py | 3 ---
> utils/codegen/meson.build | 4 ++++
> 8 files changed, 30 insertions(+), 19 deletions(-)
>
> diff --git a/include/libcamera/ipa/meson.build b/include/libcamera/ipa/meson.build
> index 96fca42cc0b8..bf55e124e97e 100644
> --- a/include/libcamera/ipa/meson.build
> +++ b/include/libcamera/ipa/meson.build
> @@ -26,7 +26,8 @@ ipa_mojom_core = custom_target(core_mojom_file.split('.')[0] + '_mojom_module',
> '--output-root', meson.project_build_root(),
> '--input-root', meson.project_source_root(),
> '--mojoms', '@INPUT@'
> - ])
> + ],
> + env : py_build_env)
>
> # core_ipa_interface.h
> libcamera_ipa_headers += custom_target('core_ipa_interface_h',
> @@ -42,7 +43,8 @@ libcamera_ipa_headers += custom_target('core_ipa_interface_h',
> '--libcamera_generate_core_header',
> '--libcamera_output_path=@OUTPUT@',
> './' +'@INPUT@'
> - ])
> + ],
> + env : py_build_env)
>
> # core_ipa_serializer.h
> libcamera_ipa_headers += custom_target('core_ipa_serializer_h',
> @@ -56,7 +58,8 @@ libcamera_ipa_headers += custom_target('core_ipa_serializer_h',
> '--libcamera_generate_core_serializer',
> '--libcamera_output_path=@OUTPUT@',
> './' +'@INPUT@'
> - ])
> + ],
> + env : py_build_env)
>
> # Mapping from pipeline handler name to mojom file
> pipeline_ipa_mojom_mapping = {
> @@ -99,7 +102,8 @@ foreach pipeline, file : pipeline_ipa_mojom_mapping
> '--output-root', meson.project_build_root(),
> '--input-root', meson.project_source_root(),
> '--mojoms', '@INPUT@'
> - ])
> + ],
> + env : py_build_env)
>
> # {interface}_ipa_interface.h
> header = custom_target(name + '_ipa_interface_h',
> @@ -115,7 +119,8 @@ foreach pipeline, file : pipeline_ipa_mojom_mapping
> '--libcamera_generate_header',
> '--libcamera_output_path=@OUTPUT@',
> './' +'@INPUT@'
> - ])
> + ],
> + env : py_build_env)
>
> # {interface}_ipa_serializer.h
> serializer = custom_target(name + '_ipa_serializer_h',
> @@ -129,7 +134,8 @@ foreach pipeline, file : pipeline_ipa_mojom_mapping
> '--libcamera_generate_serializer',
> '--libcamera_output_path=@OUTPUT@',
> './' +'@INPUT@'
> - ])
> + ],
> + env : py_build_env)
>
> # {interface}_ipa_proxy.h
> proxy_header = custom_target(name + '_proxy_h',
> @@ -143,7 +149,8 @@ foreach pipeline, file : pipeline_ipa_mojom_mapping
> '--libcamera_generate_proxy_h',
> '--libcamera_output_path=@OUTPUT@',
> './' +'@INPUT@'
> - ])
> + ],
> + env : py_build_env)
>
> ipa_mojoms += {
> 'name': name,
> diff --git a/src/libcamera/proxy/meson.build b/src/libcamera/proxy/meson.build
> index d7de518a0549..8bd1b135d0f5 100644
> --- a/src/libcamera/proxy/meson.build
> +++ b/src/libcamera/proxy/meson.build
> @@ -13,7 +13,8 @@ foreach mojom : ipa_mojoms
> '--libcamera_generate_proxy_cpp',
> '--libcamera_output_path=@OUTPUT@',
> './' + '@INPUT@'
> - ])
> + ],
> + env : py_build_env)
>
> libcamera_internal_sources += proxy
> endforeach
> diff --git a/src/libcamera/proxy/worker/meson.build b/src/libcamera/proxy/worker/meson.build
> index b5ab9794c622..8c54a2e206a5 100644
> --- a/src/libcamera/proxy/worker/meson.build
> +++ b/src/libcamera/proxy/worker/meson.build
> @@ -15,7 +15,8 @@ foreach mojom : ipa_mojoms
> '--libcamera_generate_proxy_worker',
> '--libcamera_output_path=@OUTPUT@',
> './' + '@INPUT@'
> - ])
> + ],
> + env : py_build_env)
>
> proxy = executable(mojom['name'] + '_ipa_proxy', worker,
> install : true,
> diff --git a/test/serialization/generated_serializer/include/libcamera/ipa/meson.build b/test/serialization/generated_serializer/include/libcamera/ipa/meson.build
> index 6f8794c188a3..ae08e9bee6b9 100644
> --- a/test/serialization/generated_serializer/include/libcamera/ipa/meson.build
> +++ b/test/serialization/generated_serializer/include/libcamera/ipa/meson.build
> @@ -9,7 +9,8 @@ mojom = custom_target('test_mojom_module',
> '--output-root', meson.project_build_root(),
> '--input-root', meson.project_source_root(),
> '--mojoms', '@INPUT@'
> - ])
> + ],
> + env : py_build_env)
>
> # test_ipa_interface.h
> generated_test_header = custom_target('test_ipa_interface_h',
> @@ -23,7 +24,8 @@ generated_test_header = custom_target('test_ipa_interface_h',
> '--libcamera_generate_header',
> '--libcamera_output_path=@OUTPUT@',
> './' +'@INPUT@'
> - ])
> + ],
> + env : py_build_env)
>
> # test_ipa_serializer.h
> generated_test_serializer = custom_target('test_ipa_serializer_h',
> @@ -37,4 +39,5 @@ generated_test_serializer = custom_target('test_ipa_serializer_h',
> '--libcamera_generate_serializer',
> '--libcamera_output_path=@OUTPUT@',
> './' +'@INPUT@'
> - ])
> + ],
> + env : py_build_env)
> diff --git a/utils/codegen/ipc/generate.py b/utils/codegen/ipc/generate.py
> index c2b3fcb72e1f..dfbe659bc0ca 100755
> --- a/utils/codegen/ipc/generate.py
> +++ b/utils/codegen/ipc/generate.py
> @@ -9,9 +9,6 @@
> import os
> import sys
>
> -# TODO set sys.pycache_prefix for >= python3.8
> -sys.dont_write_bytecode = True
> -
> sys.path.insert(0, f'{os.path.dirname(__file__)}/mojo/public/tools/bindings')
>
> import mojo.public.tools.bindings.mojom_bindings_generator as generator
> diff --git a/utils/codegen/ipc/meson.build b/utils/codegen/ipc/meson.build
> index 973a5417dc99..f77bf32497ba 100644
> --- a/utils/codegen/ipc/meson.build
> +++ b/utils/codegen/ipc/meson.build
> @@ -13,6 +13,7 @@ mojom_docs_extractor = find_program('./extract-docs.py')
> mojom_templates = custom_target('mojom_templates',
> input : mojom_template_files,
> output : 'libcamera_templates.zip',
> - command : [mojom_generator, '-o', '@OUTDIR@', 'precompile'])
> + command : [mojom_generator, '-o', '@OUTDIR@', 'precompile'],
> + env : py_build_env)
>
> mojom_templates_dir = meson.current_build_dir()
> diff --git a/utils/codegen/ipc/parser.py b/utils/codegen/ipc/parser.py
> index cb5608b7c165..8e70322d1bdb 100755
> --- a/utils/codegen/ipc/parser.py
> +++ b/utils/codegen/ipc/parser.py
> @@ -9,9 +9,6 @@
> import os
> import sys
>
> -# TODO set sys.pycache_prefix for >= python3.8
> -sys.dont_write_bytecode = True
> -
> # Make sure that mojom_parser.py can import mojom
> sys.path.insert(0, f'{os.path.dirname(__file__)}/mojo/public/tools/mojom')
>
> diff --git a/utils/codegen/meson.build b/utils/codegen/meson.build
> index 7dd312e16559..fb2196ee0d20 100644
> --- a/utils/codegen/meson.build
> +++ b/utils/codegen/meson.build
> @@ -2,6 +2,10 @@
>
> ## Code generation
>
> +py_build_env = environment()
> +# \todo Investigate usage of PYTHONPYCACHEPREFIX for Python >= 3.8
> +py_build_env.set('PYTHONDONTWRITEBYTECODE', '1')
> +
> py_modules += ['jinja2', 'yaml']
>
> gen_controls = files('gen-controls.py')
More information about the libcamera-devel
mailing list