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

Frediano Ziglio fziglio at redhat.com
Fri Feb 19 17:20:32 UTC 2016


> 
> 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?
> 

It's quite hacky. I would prefer temporarily to get back the submodule.

It adds other constrains to spice-common, for instance the header cannot be split
in multiple files one including others or you cannot use macro in some structure
generation. Also there is another file which generated marshallers depends on
(common/client_marshallers.h, used by spice-gtk).

Frediano


> 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
> 


More information about the Spice-devel mailing list