From ad3c3b282bad7d7421aecc33e4d8b1e2b676773a Mon Sep 17 00:00:00 2001 From: Daniel Stonier <d.stonier@gmail.com> Date: Wed, 18 Feb 2015 23:54:05 +0900 Subject: [PATCH] command line message artifact generator. --- scripts/genjava_gradle_project.py | 2 +- scripts/genjava_message_artifacts | 15 +++++++++++ setup.py | 3 ++- src/genjava/__init__.py | 2 +- src/genjava/genjava_main.py | 44 ++++++++++++++++++++++++++----- src/genjava/gradle_project.py | 20 +++++++++++++- 6 files changed, 75 insertions(+), 11 deletions(-) create mode 100755 scripts/genjava_message_artifacts diff --git a/scripts/genjava_gradle_project.py b/scripts/genjava_gradle_project.py index 3039c43..57fc504 100755 --- a/scripts/genjava_gradle_project.py +++ b/scripts/genjava_gradle_project.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ -ROS message source code generation for Java +ROS message source code generation for Java, integration with ros' message_generation. Converts ROS .msg files in a package into Java source code implementations. """ diff --git a/scripts/genjava_message_artifacts b/scripts/genjava_message_artifacts new file mode 100755 index 0000000..4453283 --- /dev/null +++ b/scripts/genjava_message_artifacts @@ -0,0 +1,15 @@ +#!/usr/bin/env python + +""" +ROS message source code generation for Java, from the command line. + +Converts ROS .msg files in a package into Java source code implementations. +""" +import os +import sys + +import genjava + +if __name__ == "__main__": + genjava.standalone_main(sys.argv) + diff --git a/setup.py b/setup.py index 0b8ce61..626884d 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,8 @@ from catkin_pkg.python_setup import generate_distutils_setup d = generate_distutils_setup( packages=['genjava'], package_dir={'': 'src'}, - requires=['genmsg'] + requires=['genmsg'], + scripts=['scripts/genjava_message_artifacts'], ) setup(**d) \ No newline at end of file diff --git a/src/genjava/__init__.py b/src/genjava/__init__.py index f79a649..088b0a0 100644 --- a/src/genjava/__init__.py +++ b/src/genjava/__init__.py @@ -36,4 +36,4 @@ #__all__ = ['Time', 'Duration', 'TVal', # 'Message', 'SerializationError', 'DeserializationError', 'MessageException', 'struct_I'] -from .genjava_main import main +from .genjava_main import main, standalone_main diff --git a/src/genjava/genjava_main.py b/src/genjava/genjava_main.py index 4305805..c228ab0 100644 --- a/src/genjava/genjava_main.py +++ b/src/genjava/genjava_main.py @@ -36,14 +36,14 @@ from __future__ import print_function import argparse -#import os +import os #import sys #import traceback #import genmsg #import genmsg.command_line -#from genmsg import MsgGenerationException -#from . generate_initpy import write_modules +import rosjava_build_tools +import catkin_pkg.packages from . import gradle_project ############################################################################## @@ -52,16 +52,14 @@ from . import gradle_project def parse_arguments(argv): - ''' - The include path has a special format, e.g. - -Ifoo_msgs:/mnt/zaphod/ros/rosjava/hydro/src/foo_msgs/msg;-Istd_msgs:/opt/ros/hydro/share/std_msgs/cmake/../msg - ''' parser = argparse.ArgumentParser(description='Generate java code for a single ros message.') #parser.add_argument('-m', '--message', action='store', help='the message file') parser.add_argument('-p', '--package', action='store', help='package to find the message file') parser.add_argument('-o', '--output-dir', action='store', help='output directory for the java code (e.g. build/foo_msgs)') parser.add_argument('-c', '--compile', default=False, action='store_true', help='switch to compile mode (default is generating mode)') parser.add_argument('-v', '--verbosity', default=False, action='store_true', help='enable verbosity in debugging (false)') + # The include path has a special format, e.g. + # -Ifoo_msgs:/mnt/zaphod/ros/rosjava/hydro/src/foo_msgs/msg;-Istd_msgs:/opt/ros/hydro/share/std_msgs/cmake/../msg #parser.add_argument('-I', '--include-path', action='append', help="include paths to the package and deps msg files") #myargs = rospy.myargv(argv=sys.argv) #return parser.parse_args(args=myargs[1:]) @@ -73,9 +71,41 @@ def parse_arguments(argv): def main(argv): + ''' + Used as the builder for genjava on the fly as other message language interfaces + are built. There is a bit of smarts inside this to work out when msgs have + changed and so forth. + ''' args = parse_arguments(argv[1:]) #print("genjava %s/%s" % (args.package, args.message)) if not args.compile: gradle_project.create(args.package, args.output_dir) else: gradle_project.build(args.package, args.output_dir, args.verbosity) + + +def standalone_parse_arguments(argv): + parser = argparse.ArgumentParser(description='Generate artifacts for any/all discoverable message packages.') + parser.add_argument('-p', '--package', action='store', default=None, help='package to generate (if not specified, all will be built)') + parser.add_argument('-o', '--output-dir', action='store', default='build', help='output directory for the java code (e.g. build/foo_msgs)') + parser.add_argument('-v', '--verbose', default=False, action='store_true', help='enable verbosity in debugging (false)') + return parser.parse_args(argv) + + +def standalone_main(argv): + ''' + This guy is a brute force standalone message artifact generator. It parses + the environment looking for the package (or just all) you wish to + generate artifacts for. + ''' + args = standalone_parse_arguments(argv[1:]) + #print("genjava %s/%s/%s" % (args.package, args.output_dir, args.verbose)) + + if args.package is not None: + sorted_package_tuples = rosjava_build_tools.catkin.index_message_package_dependencies_from_local_environment(package_name=args.package) + else: + sorted_package_tuples = rosjava_build_tools.catkin.index_message_package_dependencies_from_local_environment() + + print("Generating message artifacts for: \n%s" % [p.name for (unused_relative_path, p) in sorted_package_tuples]) + for unused_relative_path, p in sorted_package_tuples: + gradle_project.standalone_create_and_build(p.name, args.output_dir, args.verbose) diff --git a/src/genjava/gradle_project.py b/src/genjava/gradle_project.py index 80b4dbd..cee85d3 100644 --- a/src/genjava/gradle_project.py +++ b/src/genjava/gradle_project.py @@ -157,9 +157,11 @@ def create(msg_pkg_name, output_dir): def build(msg_pkg_name, output_dir, verbosity): + # Are there droppings? If yes, then this genjava has marked this package as + # needing a compile (it's new, or some msg file changed). droppings_file = os.path.join(output_dir, msg_pkg_name, 'droppings') if not os.path.isfile(droppings_file): - #print("Someone already left droppings here! %s" % droppings_file) + #print("Nobody left any droppings - nothing to do! %s" % droppings_file) return #print("Scooping the droppings! [%s]" % droppings_file) os.remove(droppings_file) @@ -168,3 +170,19 @@ def build(msg_pkg_name, output_dir, verbosity): cmd.append('--quiet') #print("COMMAND........................%s" % cmd) subprocess.call(cmd, stderr=subprocess.STDOUT,) + + +def standalone_create_and_build(msg_pkg_name, output_dir, verbosity): + ''' + Brute force create and build the message artifact distregarding any smarts + such as whether message files changed or not. For use with the standalone + package builder. + ''' + create(msg_pkg_name, output_dir) + working_directory = os.path.join(os.path.abspath(output_dir), msg_pkg_name) + gradle_wrapper = os.path.join(os.path.abspath(output_dir), msg_pkg_name, 'gradlew') + cmd = [gradle_wrapper, '-p', working_directory] + if not verbosity: + cmd.append('--quiet') + #print("COMMAND........................%s" % cmd) + subprocess.call(cmd, stderr=subprocess.STDOUT,) -- GitLab