generalize scripts for usage outside the PX4 Firmware dir and with other templates/packages

This commit is contained in:
TSC21
2018-08-30 22:32:14 +01:00
committed by Beat Küng
parent 7f016b5fd4
commit 943bfbf93f
2 changed files with 60 additions and 39 deletions
+37 -19
View File
@@ -57,13 +57,21 @@ def get_absolute_path(arg_parse_dir):
default_client_out = get_absolute_path("src/modules/micrortps_bridge/micrortps_client") default_client_out = get_absolute_path("src/modules/micrortps_bridge/micrortps_client")
default_agent_out = get_absolute_path("src/modules/micrortps_bridge/micrortps_agent") default_agent_out = get_absolute_path("src/modules/micrortps_bridge/micrortps_agent")
default_uorb_templates_dir = "/templates/uorb_microcdr"
default_urtps_templates_dir = "/templates/urtps"
default_package_name = px_generate_uorb_topic_files.PACKAGE
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("-s", "--send", dest='send', metavar='*.msg', type=str, nargs='+', help="Topics to be sended") parser.add_argument("-s", "--send", dest='send', metavar='*.msg', type=str, nargs='+', help="Topics to be sended")
parser.add_argument("-r", "--receive", dest='receive', metavar='*.msg', type=str, nargs='+', help="Topics to be received") parser.add_argument("-r", "--receive", dest='receive', metavar='*.msg', type=str, nargs='+', help="Topics to be received")
parser.add_argument("-a", "--agent", dest='agent', action="store_true", help="Flag for generate the agent, by default is true if -c is not specified") parser.add_argument("-a", "--agent", dest='agent', action="store_true", help="Flag for generate the agent, by default is true if -c is not specified")
parser.add_argument("-c", "--client", dest='client', action="store_true", help="Flag for generate the client, by default is true if -a is not specified") parser.add_argument("-c", "--client", dest='client', action="store_true", help="Flag for generate the client, by default is true if -a is not specified")
parser.add_argument("-i", "--no-idl", dest='idl', action="store_false", help="Flag for generate idl files for each msg, by default is true if -i is not specified")
parser.add_argument("-t", "--topic-msg-dir", dest='msgdir', type=str, nargs=1, help="Topics message dir, by default msg/", default="msg") parser.add_argument("-t", "--topic-msg-dir", dest='msgdir', type=str, nargs=1, help="Topics message dir, by default msg/", default="msg")
parser.add_argument("-b", "--uorb-templates-dir", dest='uorb_templates', type=str, nargs=1, help="uORB templates dir, by default msg_dir/templates/uorb_microcdr", default=default_uorb_templates_dir)
parser.add_argument("-q", "--urtps-templates-dir", dest='urtps_templates', type=str, nargs=1, help="uRTPS templates dir, by default msg_dir/templates/urtps", default=default_urtps_templates_dir)
parser.add_argument("-p", "--package", dest='package', type=str, nargs=1, help="Msg package naming, by default px4", default=default_package_name)
parser.add_argument("-o", "--agent-outdir", dest='agentdir', type=str, nargs=1, help="Agent output dir, by default src/modules/micrortps_bridge/micrortps_agent", default=default_agent_out) parser.add_argument("-o", "--agent-outdir", dest='agentdir', type=str, nargs=1, help="Agent output dir, by default src/modules/micrortps_bridge/micrortps_agent", default=default_agent_out)
parser.add_argument("-u", "--client-outdir", dest='clientdir', type=str, nargs=1, help="Client output dir, by default src/modules/micrortps_bridge/micrortps_client", default=default_client_out) parser.add_argument("-u", "--client-outdir", dest='clientdir', type=str, nargs=1, help="Client output dir, by default src/modules/micrortps_bridge/micrortps_client", default=default_client_out)
parser.add_argument("-f", "--fastrtpsgen-dir", dest='fastrtpsgen', type=str, nargs='?', help="fastrtpsgen installation dir, only needed if fastrtpsgen is not in PATH, by default empty", default="") parser.add_argument("-f", "--fastrtpsgen-dir", dest='fastrtpsgen', type=str, nargs='?', help="fastrtpsgen installation dir, only needed if fastrtpsgen is not in PATH, by default empty", default="")
@@ -77,18 +85,26 @@ if len(sys.argv) <= 1:
args = parser.parse_args() args = parser.parse_args()
msg_folder = get_absolute_path(args.msgdir) msg_folder = get_absolute_path(args.msgdir)
msg_files_send = [] msg_files_send = []
msg_files_receive = []
if args.send: if args.send:
msg_files_send = [get_absolute_path(msg) for msg in args.send] msg_files_send = [get_absolute_path(msg) for msg in args.send]
else:
msg_files_send = []
if args.receive: if args.receive:
msg_files_receive = [get_absolute_path(msg) for msg in args.receive] msg_files_receive = [get_absolute_path(msg) for msg in args.receive]
if args.package[0] != px_generate_uorb_topic_files.PACKAGE:
package = args.package[0]
else: else:
msg_files_receive = [] package = px_generate_uorb_topic_files.PACKAGE
agent = args.agent agent = args.agent
client = args.client client = args.client
# If not specified, auto generate the idl filename_send_msgs
if args.idl is None or args.idl == "":
idl = True
else:
idl = args.idl
del_tree = args.del_tree del_tree = args.del_tree
px_generate_uorb_topic_files.append_to_include_path({msg_folder}, px_generate_uorb_topic_files.INCL_DEFAULT) px_generate_uorb_topic_files.append_to_include_path({msg_folder}, px_generate_uorb_topic_files.INCL_DEFAULT, package)
agent_out_dir = get_absolute_path(args.agentdir) agent_out_dir = get_absolute_path(args.agentdir)
client_out_dir = get_absolute_path(args.clientdir) client_out_dir = get_absolute_path(args.clientdir)
@@ -126,8 +142,8 @@ if del_tree:
if agent and os.path.isdir(agent_out_dir + "/idl"): if agent and os.path.isdir(agent_out_dir + "/idl"):
shutil.rmtree(agent_out_dir + "/idl") shutil.rmtree(agent_out_dir + "/idl")
uorb_templates_dir = msg_folder + "/templates/uorb_microcdr" uorb_templates_dir = msg_folder + get_absolute_path(args.uorb_templates)
urtps_templates_dir = msg_folder + "/templates/urtps" urtps_templates_dir = msg_folder + get_absolute_path(args.urtps_templates)
uRTPS_CLIENT_TEMPL_FILE = 'microRTPS_client.cpp.template' uRTPS_CLIENT_TEMPL_FILE = 'microRTPS_client.cpp.template'
uRTPS_AGENT_TOPICS_H_TEMPL_FILE = 'RtpsTopics.h.template' uRTPS_AGENT_TOPICS_H_TEMPL_FILE = 'RtpsTopics.h.template'
@@ -143,30 +159,32 @@ def generate_agent(out_dir):
if msg_files_send: if msg_files_send:
for msg_file in msg_files_send: for msg_file in msg_files_send:
px_generate_uorb_topic_files.generate_idl_file(msg_file, out_dir + "/idl", urtps_templates_dir, if idl:
px_generate_uorb_topic_files.INCL_DEFAULT) px_generate_uorb_topic_files.generate_idl_file(msg_file, out_dir + "/idl", urtps_templates_dir,
package, px_generate_uorb_topic_files.INCL_DEFAULT)
px_generate_uorb_topic_files.generate_topic_file(msg_file, out_dir, urtps_templates_dir, px_generate_uorb_topic_files.generate_topic_file(msg_file, out_dir, urtps_templates_dir,
px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_PUBLISHER_SRC_TEMPL_FILE) package, px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_PUBLISHER_SRC_TEMPL_FILE)
px_generate_uorb_topic_files.generate_topic_file(msg_file, out_dir, urtps_templates_dir, px_generate_uorb_topic_files.generate_topic_file(msg_file, out_dir, urtps_templates_dir,
px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_PUBLISHER_H_TEMPL_FILE) package, px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_PUBLISHER_H_TEMPL_FILE)
if msg_files_receive: if msg_files_receive:
for msg_file in msg_files_receive: for msg_file in msg_files_receive:
px_generate_uorb_topic_files.generate_idl_file(msg_file, out_dir + "/idl", urtps_templates_dir, if idl:
px_generate_uorb_topic_files.INCL_DEFAULT) px_generate_uorb_topic_files.generate_idl_file(msg_file, out_dir + "/idl", urtps_templates_dir,
package, px_generate_uorb_topic_files.INCL_DEFAULT)
px_generate_uorb_topic_files.generate_topic_file(msg_file, out_dir, urtps_templates_dir, px_generate_uorb_topic_files.generate_topic_file(msg_file, out_dir, urtps_templates_dir,
px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_SUBSCRIBER_SRC_TEMPL_FILE) package, px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_SUBSCRIBER_SRC_TEMPL_FILE)
px_generate_uorb_topic_files.generate_topic_file(msg_file, out_dir, urtps_templates_dir, px_generate_uorb_topic_files.generate_topic_file(msg_file, out_dir, urtps_templates_dir,
px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_SUBSCRIBER_H_TEMPL_FILE) package, px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_SUBSCRIBER_H_TEMPL_FILE)
px_generate_uorb_topic_files.generate_uRTPS_general(msg_files_send, msg_files_receive, out_dir, urtps_templates_dir, px_generate_uorb_topic_files.generate_uRTPS_general(msg_files_send, msg_files_receive, out_dir, urtps_templates_dir,
px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_AGENT_TEMPL_FILE) package, px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_AGENT_TEMPL_FILE)
px_generate_uorb_topic_files.generate_uRTPS_general(msg_files_send, msg_files_receive, out_dir, urtps_templates_dir, px_generate_uorb_topic_files.generate_uRTPS_general(msg_files_send, msg_files_receive, out_dir, urtps_templates_dir,
px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_AGENT_TOPICS_H_TEMPL_FILE) package, px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_AGENT_TOPICS_H_TEMPL_FILE)
px_generate_uorb_topic_files.generate_uRTPS_general(msg_files_send, msg_files_receive, out_dir, urtps_templates_dir, px_generate_uorb_topic_files.generate_uRTPS_general(msg_files_send, msg_files_receive, out_dir, urtps_templates_dir,
px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_AGENT_TOPICS_SRC_TEMPL_FILE) package, px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_AGENT_TOPICS_SRC_TEMPL_FILE)
px_generate_uorb_topic_files.generate_uRTPS_general(msg_files_send, msg_files_receive, out_dir, urtps_templates_dir, px_generate_uorb_topic_files.generate_uRTPS_general(msg_files_send, msg_files_receive, out_dir, urtps_templates_dir,
px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_AGENT_CMAKELIST_TEMPL_FILE) package, px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_AGENT_CMAKELIST_TEMPL_FILE)
# Final steps to install agent # Final steps to install agent
mkdir_p(agent_out_dir + "/fastrtpsgen") mkdir_p(agent_out_dir + "/fastrtpsgen")
@@ -221,7 +239,7 @@ def generate_client(out_dir):
os.rename(def_file, def_file.replace(".h", ".h_")) os.rename(def_file, def_file.replace(".h", ".h_"))
px_generate_uorb_topic_files.generate_uRTPS_general(msg_files_send, msg_files_receive, out_dir, uorb_templates_dir, px_generate_uorb_topic_files.generate_uRTPS_general(msg_files_send, msg_files_receive, out_dir, uorb_templates_dir,
px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_CLIENT_TEMPL_FILE) package, px_generate_uorb_topic_files.INCL_DEFAULT, uRTPS_CLIENT_TEMPL_FILE)
# Final steps to install client # Final steps to install client
cp_wildcard(urtps_templates_dir + "/microRTPS_transport.*", out_dir) cp_wildcard(urtps_templates_dir + "/microRTPS_transport.*", out_dir)
+23 -20
View File
@@ -111,12 +111,12 @@ def get_msgs_list(msgdir):
return [fn for fn in os.listdir(msgdir) if fn.endswith(".msg")] return [fn for fn in os.listdir(msgdir) if fn.endswith(".msg")]
def generate_output_from_file(format_idx, filename, outputdir, templatedir, includepath): def generate_output_from_file(format_idx, filename, outputdir, package, templatedir, includepath):
""" """
Converts a single .msg file to an uorb header/source file Converts a single .msg file to an uorb header/source file
""" """
msg_context = genmsg.msg_loader.MsgContext.create_default() msg_context = genmsg.msg_loader.MsgContext.create_default()
full_type_name = genmsg.gentools.compute_full_type_name(PACKAGE, os.path.basename(filename)) full_type_name = genmsg.gentools.compute_full_type_name(package, os.path.basename(filename))
spec = genmsg.msg_loader.load_msg_from_file(msg_context, filename, full_type_name) spec = genmsg.msg_loader.load_msg_from_file(msg_context, filename, full_type_name)
field_name_and_type = {} field_name_and_type = {}
for field in spec.parsed_fields(): for field in spec.parsed_fields():
@@ -161,11 +161,11 @@ def generate_output_from_file(format_idx, filename, outputdir, templatedir, incl
return generate_by_template(output_file, template_file, em_globals) return generate_by_template(output_file, template_file, em_globals)
def generate_idl_file(filename_msg, outputdir, templatedir, includepath): def generate_idl_file(filename_msg, outputdir, templatedir, package, includepath):
""" """
Generates an .idl from .msg file Generates an .idl from .msg file
""" """
em_globals = get_em_globals(filename_msg, includepath, MsgScope.NONE) em_globals = get_em_globals(filename_msg, package, includepath, MsgScope.NONE)
spec_short_name = em_globals["spec"].short_name spec_short_name = em_globals["spec"].short_name
# Make sure output directory exists: # Make sure output directory exists:
@@ -178,16 +178,16 @@ def generate_idl_file(filename_msg, outputdir, templatedir, includepath):
return generate_by_template(output_file, template_file, em_globals) return generate_by_template(output_file, template_file, em_globals)
def generate_uRTPS_general(filename_send_msgs, filename_received_msgs, def generate_uRTPS_general(filename_send_msgs, filename_received_msgs,
outputdir, templatedir, includepath, template_name): outputdir, templatedir, package, includepath, template_name):
""" """
Generates source file by msg content Generates source file by msg content
""" """
em_globals_list = [] em_globals_list = []
if filename_send_msgs: if filename_send_msgs:
em_globals_list.extend([get_em_globals(f, includepath, MsgScope.SEND) for f in filename_send_msgs]) em_globals_list.extend([get_em_globals(f, package, includepath, MsgScope.SEND) for f in filename_send_msgs])
if filename_received_msgs: if filename_received_msgs:
em_globals_list.extend([get_em_globals(f, includepath, MsgScope.RECEIVE) for f in filename_received_msgs]) em_globals_list.extend([get_em_globals(f, package, includepath, MsgScope.RECEIVE) for f in filename_received_msgs])
merged_em_globals = merge_em_globals_list(em_globals_list) merged_em_globals = merge_em_globals_list(em_globals_list)
# Make sure output directory exists: # Make sure output directory exists:
@@ -199,11 +199,11 @@ def generate_uRTPS_general(filename_send_msgs, filename_received_msgs,
return generate_by_template(output_file, template_file, merged_em_globals) return generate_by_template(output_file, template_file, merged_em_globals)
def generate_topic_file(filename_msg, outputdir, templatedir, includepath, template_name): def generate_topic_file(filename_msg, outputdir, templatedir, package, includepath, template_name):
""" """
Generates an .idl from .msg file Generates an .idl from .msg file
""" """
em_globals = get_em_globals(filename_msg, includepath, MsgScope.NONE) em_globals = get_em_globals(filename_msg, package, includepath, MsgScope.NONE)
spec_short_name = em_globals["spec"].short_name spec_short_name = em_globals["spec"].short_name
# Make sure output directory exists: # Make sure output directory exists:
@@ -215,12 +215,12 @@ def generate_topic_file(filename_msg, outputdir, templatedir, includepath, templ
return generate_by_template(output_file, template_file, em_globals) return generate_by_template(output_file, template_file, em_globals)
def get_em_globals(filename_msg, includepath, scope): def get_em_globals(filename_msg, package, includepath, scope):
""" """
Generates em globals dictionary Generates em globals dictionary
""" """
msg_context = genmsg.msg_loader.MsgContext.create_default() msg_context = genmsg.msg_loader.MsgContext.create_default()
full_type_name = genmsg.gentools.compute_full_type_name(PACKAGE, os.path.basename(filename_msg)) full_type_name = genmsg.gentools.compute_full_type_name(package, os.path.basename(filename_msg))
spec = genmsg.msg_loader.load_msg_from_file(msg_context, filename_msg, full_type_name) spec = genmsg.msg_loader.load_msg_from_file(msg_context, filename_msg, full_type_name)
topics = get_multi_topics(filename_msg) topics = get_multi_topics(filename_msg)
if includepath: if includepath:
@@ -281,7 +281,7 @@ def generate_by_template(output_file, template_file, em_globals):
return True return True
def convert_dir(format_idx, inputdir, outputdir, templatedir): def convert_dir(format_idx, inputdir, outputdir, package, templatedir):
""" """
Converts all .msg files in inputdir to uORB header/source files Converts all .msg files in inputdir to uORB header/source files
""" """
@@ -309,7 +309,7 @@ def convert_dir(format_idx, inputdir, outputdir, templatedir):
if (maxinputtime != 0 and maxouttime != 0 and maxinputtime < maxouttime): if (maxinputtime != 0 and maxouttime != 0 and maxinputtime < maxouttime):
return False return False
includepath = INCL_DEFAULT + [':'.join([PACKAGE, inputdir])] includepath = INCL_DEFAULT + [':'.join([package, inputdir])]
for f in os.listdir(inputdir): for f in os.listdir(inputdir):
# Ignore hidden files # Ignore hidden files
if f.startswith("."): if f.startswith("."):
@@ -323,7 +323,7 @@ def convert_dir(format_idx, inputdir, outputdir, templatedir):
if fn[-4:].lower() != '.msg': if fn[-4:].lower() != '.msg':
continue continue
generate_output_from_file(format_idx, fn, outputdir, templatedir, includepath) generate_output_from_file(format_idx, fn, outputdir, package, templatedir, includepath)
return True return True
@@ -361,13 +361,13 @@ def copy_changed(inputdir, outputdir, prefix='', quiet=False):
print("{0}: unchanged".format(input_file)) print("{0}: unchanged".format(input_file))
def convert_dir_save(format_idx, inputdir, outputdir, templatedir, temporarydir, prefix, quiet=False): def convert_dir_save(format_idx, inputdir, outputdir, package, templatedir, temporarydir, prefix, quiet=False):
""" """
Converts all .msg files in inputdir to uORB header files Converts all .msg files in inputdir to uORB header files
Unchanged existing files are not overwritten. Unchanged existing files are not overwritten.
""" """
# Create new headers in temporary output directory # Create new headers in temporary output directory
convert_dir(format_idx, inputdir, temporarydir, templatedir) convert_dir(format_idx, inputdir, temporarydir, package, templatedir)
if generate_idx == 1: if generate_idx == 1:
generate_topics_list_file(inputdir, temporarydir, templatedir) generate_topics_list_file(inputdir, temporarydir, templatedir)
# Copy changed headers from temporary dir to output dir # Copy changed headers from temporary dir to output dir
@@ -396,9 +396,9 @@ def generate_topics_list_file_from_files(files, outputdir, templatedir):
tl_out_file = os.path.join(outputdir, TOPICS_LIST_TEMPLATE_FILE.replace(".template", "")) tl_out_file = os.path.join(outputdir, TOPICS_LIST_TEMPLATE_FILE.replace(".template", ""))
generate_by_template(tl_out_file, tl_template_file, tl_globals) generate_by_template(tl_out_file, tl_template_file, tl_globals)
def append_to_include_path(path_to_append, curr_include): def append_to_include_path(path_to_append, curr_include, package):
for p in path_to_append: for p in path_to_append:
curr_include.append("%s:%s" % (PACKAGE, p)) curr_include.append('%s:%s' % (package, p))
if __name__ == "__main__": if __name__ == "__main__":
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
@@ -416,6 +416,8 @@ if __name__ == "__main__":
default=None) default=None)
parser.add_argument('-e', dest='templatedir', parser.add_argument('-e', dest='templatedir',
help='directory with template files',) help='directory with template files',)
parser.add_argument('-k', dest='package', default=PACKAGE,
help='package name')
parser.add_argument('-o', dest='outputdir', parser.add_argument('-o', dest='outputdir',
help='output directory for header files') help='output directory for header files')
parser.add_argument('-t', dest='temporarydir', parser.add_argument('-t', dest='temporarydir',
@@ -429,7 +431,7 @@ if __name__ == "__main__":
args = parser.parse_args() args = parser.parse_args()
if args.include_paths: if args.include_paths:
append_to_include_path(args.include_paths, INCL_DEFAULT) append_to_include_path(args.include_paths, INCL_DEFAULT, args.package)
if args.headers: if args.headers:
generate_idx = 0 generate_idx = 0
@@ -440,7 +442,7 @@ if __name__ == "__main__":
exit(-1) exit(-1)
if args.file is not None: if args.file is not None:
for f in args.file: for f in args.file:
generate_output_from_file(generate_idx, f, args.temporarydir, args.templatedir, INCL_DEFAULT) generate_output_from_file(generate_idx, f, args.temporarydir, args.package, args.templatedir, INCL_DEFAULT)
if generate_idx == 1: if generate_idx == 1:
generate_topics_list_file_from_files(args.file, args.outputdir, args.templatedir) generate_topics_list_file_from_files(args.file, args.outputdir, args.templatedir)
copy_changed(args.temporarydir, args.outputdir, args.prefix, args.quiet) copy_changed(args.temporarydir, args.outputdir, args.prefix, args.quiet)
@@ -449,6 +451,7 @@ if __name__ == "__main__":
generate_idx, generate_idx,
args.dir, args.dir,
args.outputdir, args.outputdir,
args.package,
args.templatedir, args.templatedir,
args.temporarydir, args.temporarydir,
args.prefix, args.prefix,