X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvpp-api%2Fvapi%2Fvapi_c_gen.py;h=445790d10599475df3bff5e7f6b917511feae02c;hb=4c64b6edc86f7732f4a160b948b3386e4021a265;hp=d7a7272adff999e3d3466b4eeddef82a7d5a0ba2;hpb=958b750ceaf6c20466bc4e5605da39b4490847d9;p=vpp.git diff --git a/src/vpp-api/vapi/vapi_c_gen.py b/src/vpp-api/vapi/vapi_c_gen.py index d7a7272adff..445790d1059 100755 --- a/src/vpp-api/vapi/vapi_c_gen.py +++ b/src/vpp-api/vapi/vapi_c_gen.py @@ -9,15 +9,6 @@ from vapi_json_parser import Field, Struct, Message, JsonParser,\ class CField(Field): - def __init__( - self, - field_name, - field_type, - array_len=None, - nelem_field=None): - super(CField, self).__init__( - field_name, field_type, array_len, nelem_field) - def get_c_def(self): if self.len is not None: return "%s %s[%d]" % (self.type.get_c_name(), self.name, self.len) @@ -67,9 +58,13 @@ class CField(Field): class CStruct(Struct): - def __init__(self, name, fields): - super(CStruct, self).__init__(name, fields) + def duplicate_barrier(func): + def func_wrapper(self): + name = self.get_c_name() + return "#ifndef defined_{}\n#define defined_{}\n{}\n#endif".format(name, name, func(self)) + return func_wrapper + @duplicate_barrier def get_c_def(self): return "\n".join([ "typedef struct __attribute__((__packed__)) {", @@ -92,9 +87,6 @@ class CSimpleType (SimpleType): 'i64': 'be64toh', 'u64': 'be64toh', } - def __init__(self, name): - super(CSimpleType, self).__init__(name) - def get_c_name(self): return self.name @@ -122,9 +114,6 @@ class CSimpleType (SimpleType): class CStructType (StructType, CStruct): - def __init__(self, definition, typedict, field_class): - super(CStructType, self).__init__(definition, typedict, field_class) - def get_c_name(self): return "vapi_type_%s" % self.name @@ -271,6 +260,13 @@ class CMessage (Message): "}", ]) + def duplicate_barrier(func): + def func_wrapper(self): + name = self.get_payload_struct_name() + return "#ifndef defined_{}\n#define defined_{}\n{}\n#endif".format(name, name, func(self)) + return func_wrapper + + @duplicate_barrier def get_c_def(self): if self.has_payload(): return "\n".join([ @@ -504,11 +500,11 @@ class CMessage (Message): ' offsetof(%s, context),' % self.header.get_c_name() if has_context else ' 0,', (' offsetof(%s, payload),' % self.get_c_name()) - if self.has_payload() else ' ~0,', + if self.has_payload() else ' VAPI_INVALID_MSG_ID,', ' sizeof(%s),' % self.get_c_name(), ' (generic_swap_fn_t)%s,' % self.get_swap_to_be_func_name(), ' (generic_swap_fn_t)%s,' % self.get_swap_to_host_func_name(), - ' ~0,', + ' VAPI_INVALID_MSG_ID,', ' };', '', ' %s = vapi_register_msg(&%s);' % @@ -536,6 +532,7 @@ vapi_send_with_control_ping (vapi_ctx_t ctx, void *msg, u32 context) def gen_json_unified_header(parser, logger, j, io, name): + d, f = os.path.split(j) logger.info("Generating header `%s'" % name) orig_stdout = sys.stdout sys.stdout = io @@ -565,14 +562,14 @@ def gen_json_unified_header(parser, logger, j, io, name): print("extern vapi_msg_id_t %s;" % m.get_msg_id_name()) print("") print("#define DEFINE_VAPI_MSG_IDS_%s\\" % - j.replace(".", "_").replace("/", "_").replace("-", "_").upper()) + f.replace(".", "_").replace("/", "_").replace("-", "_").upper()) print("\\\n".join([ " vapi_msg_id_t %s;" % m.get_msg_id_name() for m in parser.messages_by_json[j].values() ])) print("") print("") - for t in parser.types_by_json[j].values(): + for t in parser.types_by_json[j]: try: print("%s" % t.get_c_def()) print("") @@ -584,10 +581,13 @@ def gen_json_unified_header(parser, logger, j, io, name): print("") function_attrs = "static inline " - for t in parser.types_by_json[j].values(): + for t in parser.types_by_json[j]: + print("#ifndef defined_inline_%s" % t.get_c_name()) + print("#define defined_inline_%s" % t.get_c_name()) print("%s%s" % (function_attrs, t.get_swap_to_be_func_def())) print("") print("%s%s" % (function_attrs, t.get_swap_to_host_func_def())) + print("#endif") print("") for m in parser.messages_by_json[j].values(): if m.has_payload(): @@ -640,15 +640,19 @@ def json_to_c_header_name(json_name): raise Exception("Unexpected json name `%s'!" % json_name) -def gen_c_unified_headers(parser, logger, prefix): +def gen_c_unified_headers(parser, logger, prefix, remove_path): if prefix == "" or prefix is None: prefix = "" else: prefix = "%s/" % prefix for j in parser.json_files: - with open('%s%s' % (prefix, json_to_c_header_name(j)), "w") as io: + if remove_path: + d, f = os.path.split(j) + else: + f = j + with open('%s%s' % (prefix, json_to_c_header_name(f)), "w") as io: gen_json_unified_header( - parser, logger, j, io, json_to_c_header_name(j)) + parser, logger, j, io, json_to_c_header_name(f)) if __name__ == '__main__': @@ -674,6 +678,8 @@ if __name__ == '__main__': '(may be specified multiple times)') argparser.add_argument('--prefix', action='store', default=None, help='path prefix') + argparser.add_argument('--remove-path', action='store_true', + help='remove path from filename') args = argparser.parse_args() jsonparser = JsonParser(logger, args.files, @@ -687,7 +693,7 @@ if __name__ == '__main__': # Damjan), to avoid symbol version issues in .so # gen_c_headers_and_code(jsonparser, logger, args.prefix) - gen_c_unified_headers(jsonparser, logger, args.prefix) + gen_c_unified_headers(jsonparser, logger, args.prefix, args.remove_path) for e in jsonparser.exceptions: - logger.error(e) + logger.warning(e)