summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Elder <paul.elder@ideasonboard.com>2020-12-05 19:30:51 +0900
committerPaul Elder <paul.elder@ideasonboard.com>2021-02-16 19:21:39 +0900
commite6722b86eef7c88358d4b4535d75ac3415c12004 (patch)
tree325d27622294e78fb4af99d174e473aad72eb903
parent4000ed4d8d9ec6bcf9177872604b6b6e23bc22ee (diff)
meson: ipa, proxy: Generate headers and proxy with mojo
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@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
-rw-r--r--include/libcamera/ipa/meson.build120
-rw-r--r--src/libcamera/meson.build1
-rw-r--r--src/libcamera/proxy/meson.build18
-rw-r--r--src/libcamera/proxy/worker/meson.build19
-rw-r--r--utils/ipc/generators/meson.build3
-rw-r--r--utils/ipc/meson.build13
6 files changed, 172 insertions, 2 deletions
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()