[{"id":12862,"web_url":"https://patchwork.libcamera.org/comment/12862/","msgid":"<20200929042033.GB14614@pendragon.ideasonboard.com>","date":"2020-09-29T04:20:33","subject":"Re: [libcamera-devel] [PATCH 11/38] meson: ipa,\n\tproxy: Generate headers and proxy with mojo","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Paul,\n\nThank you for the patch.\n\nOn Tue, Sep 22, 2020 at 10:35:10PM +0900, Paul Elder wrote:\n> Run mojo from meson to generate the header, serializer, and proxy files\n> for every pipeline's mojom data definition file.\n> \n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> \n> ---\n> This patch depends on the patch series \"Unify utils locations\".\n\nThis has now been merged :-)\n\n> Changes in v2:\n> - clean up loops\n> - remove non-literal keys in maps\n> - move loading the mojom scripts to utils/\n> - declare the template files in meson\n> - add the generated headers into libcamera_generated_headers instead of\n>   libcamera_internal_headers\n> - add libcamera_generated_headers to libcamera_sources\n> ---\n>  include/libcamera/ipa/meson.build             | 74 +++++++++++++++++++\n>  src/libcamera/meson.build                     |  1 +\n>  src/libcamera/proxy/meson.build               | 16 ++++\n>  src/libcamera/proxy/worker/meson.build        | 18 ++++-\n>  .../libcamera_templates/meson.build           | 11 +++\n>  utils/ipc/generators/meson.build              |  3 +\n>  utils/ipc/meson.build                         | 14 ++++\n>  utils/meson.build                             |  1 +\n>  8 files changed, 136 insertions(+), 2 deletions(-)\n>  create mode 100644 utils/ipc/generators/libcamera_templates/meson.build\n>  create mode 100644 utils/ipc/generators/meson.build\n>  create mode 100644 utils/ipc/meson.build\n> \n> diff --git a/include/libcamera/ipa/meson.build b/include/libcamera/ipa/meson.build\n> index 508c6bd1..c6231f2c 100644\n> --- a/include/libcamera/ipa/meson.build\n> +++ b/include/libcamera/ipa/meson.build\n> @@ -8,3 +8,77 @@ libcamera_ipa_headers = files([\n>  \n>  install_headers(libcamera_ipa_headers,\n>                  subdir: join_paths(libcamera_include_dir, 'ipa'))\n> +\n> +#\n> +# Prepare IPA/IPC generation components\n> +#\n> +\n> +ipa_mojom_files = []\n> +\n> +ipa_mojoms = []\n> +\n> +#\n> +# Generate headers from templates.\n> +#\n> +\n> +libcamera_generated_headers = []\n> +\n> +foreach file : ipa_mojom_files\n> +    name = file.split('.')[0]\n> +\n> +    # {pipeline}.mojom-module\n> +    mojom = custom_target(file.split('.')[0] + '_mojom_module',\n> +                          input : file,\n> +                          output : file + '-module',\n> +                          command : [mojom_parser,\n> +                                     '--output-root', meson.build_root(),\n> +                                     '--input-root', meson.source_root(),\n> +                                     '--mojoms', '@INPUT@'\n> +                          ])\n\nI wonder if this would be a bit more readable.\n\n                          command : [\n\t\t\t      mojom_parser,\n                              '--output-root', meson.build_root(),\n                              '--input-root', meson.source_root(),\n                              '--mojoms', '@INPUT@'\n                          ])\n\nUp to you (and if you like it, the comment applies to multiple locations\nbelow).\n\n> +\n> +    # {pipeline}_generated.h\n> +    header = custom_target(name + '_generated_h',\n> +                           input : mojom,\n> +                           output : name + '_generated.h',\n> +                           depends : mojom_template,\n> +                           command : [mojom_generator, 'generate',\n> +                                      '-g', 'libcamera',\n> +                                      '--bytecode_path', mojom_templates_dir,\n> +                                      '--libcamera_generate_header',\n> +                                      '--libcamera_output_path=@OUTPUT@',\n> +                                      './' +'@INPUT@'\n> +                           ])\n> +\n> +    # {pipeline}_serializer.h\n> +    serializer = custom_target(name + '_serializer_h',\n> +                               input : mojom,\n> +                               output : name + '_serializer.h',\n> +                               depends : mojom_template,\n> +                               command : [mojom_generator, 'generate',\n> +                                          '-g', 'libcamera',\n> +                                          '--bytecode_path', mojom_templates_dir,\n> +                                          '--libcamera_generate_serializer',\n> +                                          '--libcamera_output_path=@OUTPUT@',\n> +                                          './' +'@INPUT@'\n> +                               ])\n> +\n> +    # ipa_proxy_{pipeline}.h\n> +    proxy_header = custom_target(name + '_proxy_h',\n> +                                 input : mojom,\n> +                                 output : 'ipa_proxy_' + name + '.h',\n> +                                 depends : mojom_template,\n> +                                 command : [mojom_generator, 'generate',\n> +                                            '-g', 'libcamera',\n> +                                            '--bytecode_path', mojom_templates_dir,\n> +                                            '--libcamera_generate_proxy_h',\n> +                                            '--libcamera_output_path=@OUTPUT@',\n> +                                            './' +'@INPUT@'\n> +                                 ])\n> +\n> +    ipa_mojoms += {\n> +        'name': name,\n> +        'mojom': mojom,\n> +    }\n> +\n> +    libcamera_generated_headers += [header, serializer, proxy_header]\n> +endforeach\n> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build\n> index 27182bfc..9d7442fa 100644\n> --- a/src/libcamera/meson.build\n> +++ b/src/libcamera/meson.build\n> @@ -54,6 +54,7 @@ libcamera_sources = files([\n>  \n>  libcamera_sources += libcamera_public_headers\n>  libcamera_sources += libcamera_internal_headers\n> +libcamera_sources += libcamera_generated_headers\n>  \n>  includes = [\n>      libcamera_includes,\n> diff --git a/src/libcamera/proxy/meson.build b/src/libcamera/proxy/meson.build\n> index bd804750..bacf800f 100644\n> --- a/src/libcamera/proxy/meson.build\n> +++ b/src/libcamera/proxy/meson.build\n> @@ -4,3 +4,19 @@ libcamera_sources += files([\n>      'ipa_proxy_linux.cpp',\n>      'ipa_proxy_thread.cpp',\n>  ])\n> +\n> +# generate ipa_proxy_{pipeline}.cpp\n> +foreach mojom : ipa_mojoms\n> +    proxy = custom_target(mojom['name'] + '_proxy_cpp',\n> +                          input : mojom['mojom'],\n> +                          output : 'ipa_proxy_' + mojom['name'] + '.cpp',\n> +                          depends : [mojom_template],\n> +                          command : [mojom_generator, 'generate',\n> +                                     '-g', 'libcamera',\n> +                                     '--bytecode_path', mojom_templates_dir,\n> +                                     '--libcamera_generate_proxy_cpp',\n> +                                     '--libcamera_output_path=@OUTPUT@',\n> +                                     './' + '@INPUT@'])\n> +\n> +    libcamera_sources += proxy\n> +endforeach\n> diff --git a/src/libcamera/proxy/worker/meson.build b/src/libcamera/proxy/worker/meson.build\n> index ac0310a7..836d1759 100644\n> --- a/src/libcamera/proxy/worker/meson.build\n> +++ b/src/libcamera/proxy/worker/meson.build\n> @@ -6,8 +6,22 @@ ipa_proxy_sources = [\n>  \n>  proxy_install_dir = join_paths(get_option('libexecdir'), 'libcamera')\n>  \n> -foreach t : ipa_proxy_sources\n> -    proxy = executable(t[0], t[1],\n> +# generate ipa_proxy_{pipeline}_worker.cpp\n> +foreach mojom : ipa_mojoms\n> +    worker = custom_target(mojom['name'] + '_proxy_worker',\n> +                           input : mojom['mojom'],\n> +                           output : 'ipa_proxy_' + mojom['name'] + '_worker.cpp',\n> +                           depends : [mojom_template],\n> +                           command : [mojom_generator, 'generate',\n> +                                      '-g', 'libcamera',\n> +                                      '--bytecode_path', mojom_templates_dir,\n> +                                      '--libcamera_generate_proxy_worker',\n> +                                      '--libcamera_output_path=@OUTPUT@',\n> +                                      './' + '@INPUT@'\n> +                           ])\n> +\n> +    proxy = executable('ipa_proxy_' + mojom['name'],\n> +                       [worker, libcamera_generated_headers],\n>                         install : true,\n>                         install_dir : proxy_install_dir,\n>                         dependencies : libcamera_dep)\n> diff --git a/utils/ipc/generators/libcamera_templates/meson.build b/utils/ipc/generators/libcamera_templates/meson.build\n> new file mode 100644\n> index 00000000..d0a7449f\n> --- /dev/null\n> +++ b/utils/ipc/generators/libcamera_templates/meson.build\n> @@ -0,0 +1,11 @@\n> +# SPDX-License-Identifier: CC0-1.0\n> +\n> +mojom_template_files = files([\n> +    'module_generated.h.tmpl',\n> +    'module_ipa_proxy.cpp.tmpl',\n> +    'module_ipa_proxy.h.tmpl',\n> +    'module_ipa_proxy_worker.cpp.tmpl',\n> +    'module_serializer.h.tmpl',\n> +    'proxy_functions.tmpl',\n> +    'serializer.tmpl',\n> +])\n> diff --git a/utils/ipc/generators/meson.build b/utils/ipc/generators/meson.build\n> new file mode 100644\n> index 00000000..504f1a46\n> --- /dev/null\n> +++ b/utils/ipc/generators/meson.build\n> @@ -0,0 +1,3 @@\n> +# SPDX-License-Identifier: CC0-1.0\n> +\n> +subdir('libcamera_templates')\n> diff --git a/utils/ipc/meson.build b/utils/ipc/meson.build\n> new file mode 100644\n> index 00000000..9f7b7cc0\n> --- /dev/null\n> +++ b/utils/ipc/meson.build\n> @@ -0,0 +1,14 @@\n> +# SPDX-License-Identifier: CC0-1.0\n> +\n> +subdir('generators')\n> +\n> +mojom_parser = find_program('./mojo/public/tools/mojom/mojom_parser.py')\n\nI'm afraid you will need to add a parser.py wrapper to set\nsys.dont_write_bytecode.\n\n> +\n> +mojom_generator = find_program('./generate.py')\n> +\n> +mojom_template = custom_target('mojom_template',\n\nMaybe mojom_templates, as it contains all templates ?\n\nI remember when you told me you had to fight against meson. It seems the\ntwo of you have not only reached a truce, but became friends. Nice :-)\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +                               input : mojom_template_files,\n> +                               output : 'libcamera_templates.zip',\n> +                               command : [mojom_generator, '-o', '@OUTDIR@', 'precompile'])\n> +\n> +mojom_templates_dir = meson.current_build_dir()\n> diff --git a/utils/meson.build b/utils/meson.build\n> index a069e1ca..5dfb0741 100644\n> --- a/utils/meson.build\n> +++ b/utils/meson.build\n> @@ -1,5 +1,6 @@\n>  # SPDX-License-Identifier: CC0-1.0\n>  \n> +subdir('ipc')\n>  subdir('ipu3')\n>  \n>  ## Generates control_ids.h and property_ids.h","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id C5139C3B5C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 29 Sep 2020 04:21:15 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3401D620BC;\n\tTue, 29 Sep 2020 06:21:15 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B78696035E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 29 Sep 2020 06:21:13 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E7D93540;\n\tTue, 29 Sep 2020 06:21:08 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"Tj56RSjO\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1601353269;\n\tbh=6nXn4tKdP6PUq5oMZxozWicCwV9bqexMh4Jw7ix01IE=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Tj56RSjO5Qi+Y2aAIi2fgpiehYDulkh7B0+TDUqirRS2XTgf7wNSQ7fnTrzGpSh2j\n\tGP/YClH3QMKCDpl8ElV+6DeDME2VAY7f78u8R5uGEtgmQytrLE0rXhlxKchRN8PCQl\n\t6X+pt6UfzSGR3ZkYLa6wtoJ+F0wT1qoKIHqtfSJ8=","Date":"Tue, 29 Sep 2020 07:20:33 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Paul Elder <paul.elder@ideasonboard.com>","Message-ID":"<20200929042033.GB14614@pendragon.ideasonboard.com>","References":"<20200922133537.258098-1-paul.elder@ideasonboard.com>\n\t<20200922133537.258098-12-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20200922133537.258098-12-paul.elder@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 11/38] meson: ipa,\n\tproxy: Generate headers and proxy with mojo","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]