[libvirt PATCH 1/3] esx: separate header and source file generation

Pavel Hrdina phrdina at redhat.com
Wed Sep 23 09:40:35 UTC 2020


On Wed, Sep 23, 2020 at 11:17:43AM +0200, Ján Tomko wrote:
> Invoke the generator twice and introduce separate
> meson targets for headers and C sources.
> 
> Signed-off-by: Ján Tomko <jtomko at redhat.com>
> ---
>  scripts/esx_vi_generator.py | 159 ++++++++++++++++++++----------------
>  src/esx/meson.build         |  31 +++++--
>  2 files changed, 114 insertions(+), 76 deletions(-)
> 
> diff --git a/scripts/esx_vi_generator.py b/scripts/esx_vi_generator.py
> index 7929e1e682..2fac5152e5 100755
> --- a/scripts/esx_vi_generator.py
> +++ b/scripts/esx_vi_generator.py
> @@ -1331,24 +1331,27 @@ additional_object_features = {
>  
>  removed_object_features = {}
>  
> -if len(sys.argv) != 3:
> -    report_error("usage: %s srcdir builddir" % sys.argv[0])
> +if len(sys.argv) != 4:
> +    report_error("usage: %s srcdir builddir header" % sys.argv[0])
>  
>  input_filename = os.path.join(sys.argv[1], "esx/esx_vi_generator.input")
>  output_dirname = os.path.join(sys.argv[2], "esx")
> +header = sys.argv[3] == "header"

It would be nice to use argparse here but that's for a different series.

> -types_typedef = open_file(os.path.join(output_dirname, "esx_vi_types.generated.typedef"))
> -types_typeenum = open_file(os.path.join(output_dirname, "esx_vi_types.generated.typeenum"))
> -types_typetostring = open_file(os.path.join(output_dirname, "esx_vi_types.generated.typetostring"))
> -types_typefromstring = open_file(os.path.join(output_dirname, "esx_vi_types.generated.typefromstring"))
> -types_header = open_file(os.path.join(output_dirname, "esx_vi_types.generated.h"))
> -types_source = open_file(os.path.join(output_dirname, "esx_vi_types.generated.c"))
> -methods_header = open_file(os.path.join(output_dirname, "esx_vi_methods.generated.h"))
> -methods_source = open_file(os.path.join(output_dirname, "esx_vi_methods.generated.c"))
> -methods_macro = open_file(os.path.join(output_dirname, "esx_vi_methods.generated.macro"))
> -helpers_header = open_file(os.path.join(output_dirname, "esx_vi.generated.h"))
> -helpers_source = open_file(os.path.join(output_dirname, "esx_vi.generated.c"))
> +if header:
> +    types_typedef = open_file(os.path.join(output_dirname, "esx_vi_types.generated.typedef"))
> +    types_typeenum = open_file(os.path.join(output_dirname, "esx_vi_types.generated.typeenum"))
> +    types_typetostring = open_file(os.path.join(output_dirname, "esx_vi_types.generated.typetostring"))

This file is included by `src/esx/esx_vi_types.c` as part of a switch
so we might consider it as source.

> +    types_typefromstring = open_file(os.path.join(output_dirname, "esx_vi_types.generated.typefromstring"))

Similarly this file contains a lot of ifs and is included by
`src/esx/esx_vi_types.c` as source as well.

> +    types_header = open_file(os.path.join(output_dirname, "esx_vi_types.generated.h"))
> +    methods_header = open_file(os.path.join(output_dirname, "esx_vi_methods.generated.h"))
> +    helpers_header = open_file(os.path.join(output_dirname, "esx_vi.generated.h"))
> +else:
> +    types_source = open_file(os.path.join(output_dirname, "esx_vi_types.generated.c"))
> +    methods_macro = open_file(os.path.join(output_dirname, "esx_vi_methods.generated.macro"))
> +    methods_source = open_file(os.path.join(output_dirname, "esx_vi_methods.generated.c"))
> +    helpers_source = open_file(os.path.join(output_dirname, "esx_vi.generated.c"))
>  
>  
>  number = 0
> @@ -1604,96 +1607,112 @@ for obj in managed_objects_by_name.values():
>  
>  notice = "/* Generated by esx_vi_generator.py */\n\n\n\n"
>  
> -types_typedef.write(notice)
> -types_typeenum.write(notice)
> -types_typetostring.write(notice)
> -types_typefromstring.write(notice)
> -types_header.write(notice)
> -types_source.write(notice)
> -methods_header.write(notice)
> -methods_source.write(notice)
> -methods_macro.write(notice)
> -helpers_header.write(notice)
> -helpers_source.write(notice)
> +if (header):
> +    types_typedef.write(notice)
> +    types_typeenum.write(notice)
> +    types_typetostring.write(notice)
> +    types_typefromstring.write(notice)
> +    types_header.write(notice)
> +    methods_header.write(notice)
> +    helpers_header.write(notice)
> +else:
> +    types_source.write(notice)
> +    methods_macro.write(notice)
> +    methods_source.write(notice)
> +    helpers_source.write(notice)
>  
>  
>  # output enums
> -types_typedef.write(separator +
> -                    " * VI Enums\n" +
> -                    " */\n\n")
> +if header:
> +    types_typedef.write(separator +
> +                        " * VI Enums\n" +
> +                        " */\n\n")
>  
>  names = sorted(enums_by_name.keys())
>  
>  for name in names:
> -    types_typedef.write(enums_by_name[name].generate_typedef())
> -    types_typeenum.write(enums_by_name[name].generate_typeenum())
> -    types_typetostring.write(enums_by_name[name].generate_typetostring())
> -    types_typefromstring.write(enums_by_name[name].generate_typefromstring())
> -    types_header.write(enums_by_name[name].generate_header())
> -    types_source.write(enums_by_name[name].generate_source())
> +    if header:
> +        types_typedef.write(enums_by_name[name].generate_typedef())
> +        types_typeenum.write(enums_by_name[name].generate_typeenum())
> +        types_typetostring.write(enums_by_name[name].generate_typetostring())
> +        types_typefromstring.write(enums_by_name[name].generate_typefromstring())
> +        types_header.write(enums_by_name[name].generate_header())
> +    else:
> +        types_source.write(enums_by_name[name].generate_source())
>  
>  
>  # output objects
> -types_typedef.write("\n\n\n" +
> -                    separator +
> -                    " * VI Objects\n" +
> -                    " */\n\n")
> -types_typeenum.write("\n")
> -types_typetostring.write("\n")
> -types_typefromstring.write("\n")
> +if header:
> +    types_typedef.write("\n\n\n" +
> +                        separator +
> +                        " * VI Objects\n" +
> +                        " */\n\n")
> +    types_typeenum.write("\n")
> +    types_typetostring.write("\n")
> +    types_typefromstring.write("\n")
>  
>  names = sorted(objects_by_name.keys())
>  
>  for name in names:
> -    types_typedef.write(objects_by_name[name].generate_typedef())
> -    types_typeenum.write(objects_by_name[name].generate_typeenum())
> -    types_typetostring.write(objects_by_name[name].generate_typetostring())
> -    types_typefromstring.write(objects_by_name[name].generate_typefromstring())
> -    types_header.write(objects_by_name[name].generate_header())
> -    types_source.write(objects_by_name[name].generate_source())
> +    if header:
> +        types_typedef.write(objects_by_name[name].generate_typedef())
> +        types_typeenum.write(objects_by_name[name].generate_typeenum())
> +        types_typetostring.write(objects_by_name[name].generate_typetostring())
> +        types_typefromstring.write(objects_by_name[name].generate_typefromstring())
> +        types_header.write(objects_by_name[name].generate_header())
> +    else:
> +        types_source.write(objects_by_name[name].generate_source())
>  
>  
>  # output managed objects
> -types_typedef.write("\n\n\n" +
> -                    separator +
> -                    " * VI Managed Objects\n" +
> -                    " */\n\n")
> -types_typeenum.write("\n")
> -types_typetostring.write("\n")
> -types_typefromstring.write("\n")
> +if header:
> +    types_typedef.write("\n\n\n" +
> +                        separator +
> +                        " * VI Managed Objects\n" +
> +                        " */\n\n")
> +    types_typeenum.write("\n")
> +    types_typetostring.write("\n")
> +    types_typefromstring.write("\n")
>  
>  names = sorted(managed_objects_by_name.keys())
>  
>  for name in names:
> -    types_typedef.write(managed_objects_by_name[name].generate_typedef())
> -    types_typeenum.write(managed_objects_by_name[name].generate_typeenum())
> -    types_typetostring.write(managed_objects_by_name[name].generate_typetostring())
> -    types_typefromstring.write(managed_objects_by_name[name].generate_typefromstring())
> -    types_header.write(managed_objects_by_name[name].generate_header())
> -    types_source.write(managed_objects_by_name[name].generate_source())
> +    if header:
> +        types_typedef.write(managed_objects_by_name[name].generate_typedef())
> +        types_typeenum.write(managed_objects_by_name[name].generate_typeenum())
> +        types_typetostring.write(managed_objects_by_name[name].generate_typetostring())
> +        types_typefromstring.write(managed_objects_by_name[name].generate_typefromstring())
> +        types_header.write(managed_objects_by_name[name].generate_header())
> +    else:
> +        types_source.write(managed_objects_by_name[name].generate_source())
>  
>  
>  # output methods
>  names = sorted(methods_by_name.keys())
>  
>  for name in names:
> -    methods_header.write(methods_by_name[name].generate_header())
> -    methods_source.write(methods_by_name[name].generate_source())
> +    if header:
> +        methods_header.write(methods_by_name[name].generate_header())
> +    else:
> +        methods_source.write(methods_by_name[name].generate_source())
>  
> -names = list(autobind_names)
> -names.sort()
> +if not header:
> +    names = list(autobind_names)
> +    names.sort()
>  
> -for name in names:
> -    string = aligned("#define ESX_VI__METHOD__PARAMETER__THIS__%s " % name, "\\\n", 78)
> -    string += "    ESX_VI__METHOD__PARAMETER__THIS_FROM_SERVICE(ManagedObjectReference,      \\\n"
> -    string += aligned("", "%s)\n\n\n\n" % name, 49)
> +    for name in names:
> +        string = aligned("#define ESX_VI__METHOD__PARAMETER__THIS__%s " % name, "\\\n", 78)
> +        string += "    ESX_VI__METHOD__PARAMETER__THIS_FROM_SERVICE(ManagedObjectReference,      \\\n"
> +        string += aligned("", "%s)\n\n\n\n" % name, 49)
>  
> -    methods_macro.write(string)
> +        methods_macro.write(string)
>  
>  
>  # output helpers
>  names = sorted(managed_objects_by_name.keys())
>  
>  for name in names:
> -    helpers_header.write(managed_objects_by_name[name].generate_helper_header())
> -    helpers_source.write(managed_objects_by_name[name].generate_helper_source())
> +    if header:
> +        helpers_header.write(managed_objects_by_name[name].generate_helper_header())
> +    else:
> +        helpers_source.write(managed_objects_by_name[name].generate_helper_source())
> diff --git a/src/esx/meson.build b/src/esx/meson.build
> index f2d59462fe..b7a55f6b54 100644
> --- a/src/esx/meson.build
> +++ b/src/esx/meson.build
> @@ -12,18 +12,15 @@ esx_sources = [
>    'esx_vi_types.c',
>  ]
>  
> -esx_gen_sources = custom_target(
> -  'virtesxgen',
> +
> +esx_gen_headers = custom_target(
> +  'virtesxgenheaders',
>    input: [
>      'esx_vi_generator.input',
>    ],
>    output: [
> -    'esx_vi.generated.c',
>      'esx_vi.generated.h',
> -    'esx_vi_methods.generated.c',
>      'esx_vi_methods.generated.h',
> -    'esx_vi_methods.generated.macro',
> -    'esx_vi_types.generated.c',
>      'esx_vi_types.generated.h',
>      'esx_vi_types.generated.typedef',
>      'esx_vi_types.generated.typeenum',
> @@ -34,6 +31,27 @@ esx_gen_sources = custom_target(
>      meson_python_prog, python3_prog.path(), esx_vi_generator_prog.path(),
>      meson.source_root() / 'src',
>      meson.build_root() / 'src',
> +    'header',
> +  ],
> +)
> +
> +

No need for two empty lines as the rest of the file uses only one.

> +esx_gen_sources = custom_target(
> +  'virtesxgensources',
> +  input: [
> +    'esx_vi_generator.input',
> +  ],
> +  output: [
> +    'esx_vi.generated.c',
> +    'esx_vi_methods.generated.macro',
> +    'esx_vi_methods.generated.c',
> +    'esx_vi_types.generated.c',
> +  ],
> +  command: [
> +    meson_python_prog, python3_prog.path(), esx_vi_generator_prog.path(),
> +    meson.source_root() / 'src',
> +    meson.build_root() / 'src',
> +    'source',
>    ],
>  )
>  
> @@ -42,6 +60,7 @@ if conf.has('WITH_ESX')
>      'virt_driver_esx',
>      [
>        esx_sources,
> +      esx_gen_headers[1],
>        esx_gen_sources[1],
>      ],
>      dependencies: [
> -- 
> 2.26.2
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20200923/f8b7d51a/attachment-0001.sig>


More information about the libvir-list mailing list