[libcamera-devel] [PATCH v8 01/12] meson: ipa, proxy: Generate headers and proxy with mojo

Paul Elder paul.elder at ideasonboard.com
Sat Feb 13 05:22:14 CET 2021


Run mojo from meson to generate the header, serializer, and proxy files
for every pipeline's mojom data definition file.

Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>

---
No change in v8

No change in v7

Changes in v6:
- do the renaming from v4 in the comments, and in the proxy worker
  binary name
- expand meson to generate core_ipa_interface.h and
  core_ipa_serializer.h

No change in v5

Changes in v4:
- rename module_generated.h.tmpl to module_ipa_interface.h.tmpl
- rename module_serializer.h.tmpl to module_ipa_serializer.h.tmpl
- rename libcamera_generated headers to libcamera_generated_ipa_headers
  in meson

Changes in v3:
- change parser path to our wrapper parser script, instead of running
  mojo's directly

Changes in v2:
- clean up loops
- remove non-literal keys in maps
- move loading the mojom scripts to utils/
- declare the template files in meson
- add the generated headers into libcamera_generated_headers instead of
  libcamera_internal_headers
- add libcamera_generated_headers to libcamera_sources
---
 include/libcamera/ipa/meson.build      | 120 +++++++++++++++++++++++++
 src/libcamera/meson.build              |   1 +
 src/libcamera/proxy/meson.build        |  18 ++++
 src/libcamera/proxy/worker/meson.build |  19 +++-
 utils/ipc/generators/meson.build       |   3 +
 utils/ipc/meson.build                  |  13 +++
 6 files changed, 172 insertions(+), 2 deletions(-)
 create mode 100644 utils/ipc/generators/meson.build

diff --git a/include/libcamera/ipa/meson.build b/include/libcamera/ipa/meson.build
index 508c6bd1..499d1bc0 100644
--- a/include/libcamera/ipa/meson.build
+++ b/include/libcamera/ipa/meson.build
@@ -8,3 +8,123 @@ libcamera_ipa_headers = files([
 
 install_headers(libcamera_ipa_headers,
                 subdir: join_paths(libcamera_include_dir, 'ipa'))
+
+libcamera_generated_ipa_headers = []
+
+#
+# Prepare IPA/IPC generation components
+#
+
+core_mojom_file = 'core.mojom'
+ipa_mojom_core = custom_target(core_mojom_file.split('.')[0] + '_mojom_module',
+                               input : core_mojom_file,
+                               output : core_mojom_file + '-module',
+                               command : [
+                                   mojom_parser,
+                                   '--output-root', meson.build_root(),
+                                   '--input-root', meson.source_root(),
+                                   '--mojoms', '@INPUT@'
+                               ])
+
+# core_ipa_interface.h
+libcamera_generated_ipa_headers += custom_target('core_ipa_interface_h',
+                  input : ipa_mojom_core,
+                  output : 'core_ipa_interface.h',
+                  depends : mojom_templates,
+                  command : [
+                      mojom_generator, 'generate',
+                      '-g', 'libcamera',
+                      '--bytecode_path', mojom_templates_dir,
+                      '--libcamera_generate_core_header',
+                      '--libcamera_output_path=@OUTPUT@',
+                      './' +'@INPUT@'
+                  ])
+
+# core_ipa_serializer.h
+libcamera_generated_ipa_headers += custom_target('core_ipa_serializer_h',
+                  input : ipa_mojom_core,
+                  output : 'core_ipa_serializer.h',
+                  depends : mojom_templates,
+                  command : [
+                      mojom_generator, 'generate',
+                      '-g', 'libcamera',
+                      '--bytecode_path', mojom_templates_dir,
+                      '--libcamera_generate_core_serializer',
+                      '--libcamera_output_path=@OUTPUT@',
+                      './' +'@INPUT@'
+                  ])
+
+ipa_mojom_files = []
+
+ipa_mojoms = []
+
+#
+# Generate headers from templates.
+#
+
+# TODO Define per-pipeline ControlInfoMap with yaml?
+
+foreach file : ipa_mojom_files
+    name = file.split('.')[0]
+
+    # {pipeline}.mojom-module
+    mojom = custom_target(file.split('.')[0] + '_mojom_module',
+                          input : file,
+                          output : file + '-module',
+                          depends : ipa_mojom_core,
+                          command : [
+                              mojom_parser,
+                              '--output-root', meson.build_root(),
+                              '--input-root', meson.source_root(),
+                              '--mojoms', '@INPUT@'
+                          ])
+
+    # {pipeline}_ipa_interface.h
+    header = custom_target(name + '_ipa_interface_h',
+                           input : mojom,
+                           output : name + '_ipa_interface.h',
+                           depends : mojom_templates,
+                           command : [
+                               mojom_generator, 'generate',
+                               '-g', 'libcamera',
+                               '--bytecode_path', mojom_templates_dir,
+                               '--libcamera_generate_header',
+                               '--libcamera_output_path=@OUTPUT@',
+                               './' +'@INPUT@'
+                           ])
+
+    # {pipeline}_ipa_serializer.h
+    serializer = custom_target(name + '_ipa_serializer_h',
+                               input : mojom,
+                               output : name + '_ipa_serializer.h',
+                               depends : mojom_templates,
+                               command : [
+                                   mojom_generator, 'generate',
+                                   '-g', 'libcamera',
+                                   '--bytecode_path', mojom_templates_dir,
+                                   '--libcamera_generate_serializer',
+                                   '--libcamera_output_path=@OUTPUT@',
+                                   './' +'@INPUT@'
+                               ])
+
+    # {pipeline}_ipa_proxy.h
+    proxy_header = custom_target(name + '_proxy_h',
+                                 input : mojom,
+                                 output : name + '_ipa_proxy.h',
+                                 depends : mojom_templates,
+                                 command : [
+                                     mojom_generator, 'generate',
+                                     '-g', 'libcamera',
+                                     '--bytecode_path', mojom_templates_dir,
+                                     '--libcamera_generate_proxy_h',
+                                     '--libcamera_output_path=@OUTPUT@',
+                                     './' +'@INPUT@'
+                                 ])
+
+    ipa_mojoms += {
+        'name': name,
+        'mojom': mojom,
+    }
+
+    libcamera_generated_ipa_headers += [header, serializer, proxy_header]
+endforeach
diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
index f5d3931c..6b5d126b 100644
--- a/src/libcamera/meson.build
+++ b/src/libcamera/meson.build
@@ -60,6 +60,7 @@ libcamera_sources = files([
 ])
 
 libcamera_sources += libcamera_public_headers
+libcamera_sources += libcamera_generated_ipa_headers
 libcamera_sources += libcamera_tracepoint_header
 
 includes = [
diff --git a/src/libcamera/proxy/meson.build b/src/libcamera/proxy/meson.build
index bd804750..5c4365e7 100644
--- a/src/libcamera/proxy/meson.build
+++ b/src/libcamera/proxy/meson.build
@@ -4,3 +4,21 @@ libcamera_sources += files([
     'ipa_proxy_linux.cpp',
     'ipa_proxy_thread.cpp',
 ])
+
+# generate {pipeline}_ipa_proxy.cpp
+foreach mojom : ipa_mojoms
+    proxy = custom_target(mojom['name'] + '_proxy_cpp',
+                          input : mojom['mojom'],
+                          output : mojom['name'] + '_ipa_proxy.cpp',
+                          depends : mojom_templates,
+                          command : [
+                              mojom_generator, 'generate',
+                              '-g', 'libcamera',
+                              '--bytecode_path', mojom_templates_dir,
+                              '--libcamera_generate_proxy_cpp',
+                              '--libcamera_output_path=@OUTPUT@',
+                              './' + '@INPUT@'
+                          ])
+
+    libcamera_sources += proxy
+endforeach
diff --git a/src/libcamera/proxy/worker/meson.build b/src/libcamera/proxy/worker/meson.build
index ac0310a7..0fd26fd8 100644
--- a/src/libcamera/proxy/worker/meson.build
+++ b/src/libcamera/proxy/worker/meson.build
@@ -6,8 +6,23 @@ ipa_proxy_sources = [
 
 proxy_install_dir = join_paths(get_option('libexecdir'), 'libcamera')
 
-foreach t : ipa_proxy_sources
-    proxy = executable(t[0], t[1],
+# generate {pipeline}_ipa_proxy_worker.cpp
+foreach mojom : ipa_mojoms
+    worker = custom_target(mojom['name'] + '_proxy_worker',
+                           input : mojom['mojom'],
+                           output : mojom['name'] + '_ipa_proxy_worker.cpp',
+                           depends : mojom_templates,
+                           command : [
+                               mojom_generator, 'generate',
+                               '-g', 'libcamera',
+                               '--bytecode_path', mojom_templates_dir,
+                               '--libcamera_generate_proxy_worker',
+                               '--libcamera_output_path=@OUTPUT@',
+                               './' + '@INPUT@'
+                           ])
+
+    proxy = executable(mojom['name'] + '_ipa_proxy',
+                       [worker, libcamera_generated_ipa_headers],
                        install : true,
                        install_dir : proxy_install_dir,
                        dependencies : libcamera_dep)
diff --git a/utils/ipc/generators/meson.build b/utils/ipc/generators/meson.build
new file mode 100644
index 00000000..504f1a46
--- /dev/null
+++ b/utils/ipc/generators/meson.build
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: CC0-1.0
+
+subdir('libcamera_templates')
diff --git a/utils/ipc/meson.build b/utils/ipc/meson.build
index 59f097f0..4a41b9c1 100644
--- a/utils/ipc/meson.build
+++ b/utils/ipc/meson.build
@@ -1,3 +1,16 @@
 # SPDX-License-Identifier: CC0-1.0
 
+subdir('generators')
+
 py_modules += ['jinja2', 'ply']
+
+mojom_parser = find_program('./parser.py')
+
+mojom_generator = find_program('./generate.py')
+
+mojom_templates = custom_target('mojom_templates',
+                                input : mojom_template_files,
+                                output : 'libcamera_templates.zip',
+                                command : [mojom_generator, '-o', '@OUTDIR@', 'precompile'])
+
+mojom_templates_dir = meson.current_build_dir()
-- 
2.27.0



More information about the libcamera-devel mailing list