[Spice-devel] [RFC PATCH spice-protocol] codegen: Filter not defined messages from protocol

Marc-André Lureau marcandre.lureau at gmail.com
Fri Feb 19 14:43:52 UTC 2016


Hi

On Fri, Feb 19, 2016 at 9:21 AM, Pavel Grunt <pgrunt at redhat.com> wrote:
> Do not create functions for a message which doesn't have a definition
> in the included header file.
>
> Make spice-protocol again compatible with older spice-common.
> ---
> Hi, this is an attemp to make spice-protocol compatible with older releases of spice / spice-gtk
>
> Currently released versions of spice and spice-gtk are failing to build
> using spice-protocol from git master:
>   CC       libspice_common_server_la-generated_server_demarshallers.lo
> generated_server_demarshallers.c: In function 'parse_msgc_display_gl_draw_done':
> generated_server_demarshallers.c:767:23: error: 'SpiceMsgcDisplayGlDrawDone' undeclared (first use in this function)
>      mem_size = sizeof(SpiceMsgcDisplayGlDrawDone);
>                        ^
> It is due to the fact that spice-common calls spice_codegen.py from spice-protocol
> to generated marshallers from spice.proto (which is included in spice-protocol).
> However structures defining messages from spice.proto are in "common/messages.h"
> which is in spice-common. So generated code contains new messages but the header doesn't.
>
> To fix the issue I took advantage of spice-common calling the codegen with the header file,
> see spice-common/common/Makefile.am:
>
>         spice_codegen.py --generate-demarshallers --client --include common/messages.h
>
> Codegen then opens the header, gets its content and checks if messages defined in spice.proto
> are also defined in the header. If not the message is discarded.
>
> The code needs some improvements (the find_file() function), but what do you think about the approach?

This is a hack. But the problem exists and is fairly urgent imho. So I
think we should apply it asap, and add FIXME/TODO.

>
> Thanks for any comments,
> Pavel
>
> ---
>  spice_codegen.py | 25 +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
>
> diff --git a/spice_codegen.py b/spice_codegen.py
> index 569cccc..06f8fe1 100755
> --- a/spice_codegen.py
> +++ b/spice_codegen.py
> @@ -105,6 +105,30 @@ def write_enums(writer, describe=False):
>
>      writer.writeln("#endif /* _H_SPICE_ENUMS */")
>
> +def filter_protocol_messages(proto, headers):
> +    """ Remove messages which don't have the definition in a header"""
> +    def find_file(name):
> +        fname = os.path.basename(name)
> +        for root, dirs, files in os.walk(os.getcwd()):
> +            if fname in files:
> +                return os.path.join(root, fname)
> +        return None
> +
> +    if headers == None:
> +        return
> +
> +    filesstr = ""
> +    for f in headers:
> +        path_to_file = find_file(f)
> +        if path_to_file != None:
> +            with open(path_to_file) as content_file:
> +                filesstr += content_file.read()
> +
> +    filter_func = lambda msg : msg.message_type.c_type().replace("Temp","Spice") in filesstr
> +    for channel in proto.channels:
> +        channel.channel_type.client_messages = filter(filter_func, channel.channel_type.client_messages)
> +        channel.channel_type.server_messages = filter(filter_func, channel.channel_type.server_messages)
> +
>  parser = OptionParser(usage="usage: %prog [options] <protocol_file> <destination file>")
>  parser.add_option("-e", "--generate-enums",
>                    action="store_true", dest="generate_enums", default=False,
> @@ -209,6 +233,7 @@ if options.print_error:
>      writer.set_option("print_error")
>
>  if options.includes:
> +    filter_protocol_messages(proto, options.includes)
>      for i in options.includes:
>          writer.header.writeln('#include <%s>' % i)
>          writer.writeln('#include <%s>' % i)
> --
> 2.5.0
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel



-- 
Marc-André Lureau


More information about the Spice-devel mailing list