diff --git a/.gitignore b/.gitignore index 0f182a0349c4925c57f4ffbd5802b536a3e2588b..fb620eab8991bf386870c7e6a184072794d7577f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.class +*.pyc # Package Files # *.jar diff --git a/scripts/catkin_create_android_library_pkg b/scripts/catkin_create_android_library_pkg new file mode 100755 index 0000000000000000000000000000000000000000..df162f82303644cc9530321ec5ba3f5b1438de9d --- /dev/null +++ b/scripts/catkin_create_android_library_pkg @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +"""This script creates the skeleton of an android library package""" + +############################################################################## +# Imports +############################################################################## + +from __future__ import print_function +import argparse +import os +import sys + +from rosjava_tools import create_android_package +import rosjava_tools.console as console + +############################################################################## +# Main +############################################################################## + +if __name__ == "__main__": + try: + sys.exit(create_android_package(is_library=True)) + except Exception as e: + console.logerror("%s : %s" % (str(e), type(e))) + sys.exit(1) diff --git a/scripts/catkin_create_android_pkg b/scripts/catkin_create_android_pkg new file mode 100755 index 0000000000000000000000000000000000000000..e6b27c9efa5e3c301131e2e20c82fb4725fa4bda --- /dev/null +++ b/scripts/catkin_create_android_pkg @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +"""This script creates the skeleton of an android library package""" + +############################################################################## +# Imports +############################################################################## + +from __future__ import print_function +import argparse +import os +import sys + +from rosjava_tools import create_android_package +import rosjava_tools.console as console + +############################################################################## +# Main +############################################################################## + +if __name__ == "__main__": + try: + sys.exit(create_android_package(is_library=False)) + except Exception as e: + console.logerror("%s : %s" % (str(e), type(e))) + sys.exit(1) diff --git a/scripts/catkin_init_android_repo b/scripts/catkin_init_android_repo new file mode 100755 index 0000000000000000000000000000000000000000..e92767c0762f8fc7fa8868c9614d046aa6f046a1 --- /dev/null +++ b/scripts/catkin_init_android_repo @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +"""This script creates the skeleton of an android repo""" + +############################################################################## +# Imports +############################################################################## + +from __future__ import print_function +import argparse +import os +import sys + +from rosjava_tools import init_android_repo +import rosjava_tools.console as console + +############################################################################## +# Main +############################################################################## + +if __name__ == "__main__": + try: + sys.exit(init_android_repo()) + except Exception as e: + console.logerror("%s : %s" % (str(e), type(e))) + sys.exit(1) diff --git a/setup.py b/setup.py index e134ddeface3e851bc057bd259327e615bf9809f..f32166b70329f81746d319b2faed6616cc87827f 100644 --- a/setup.py +++ b/setup.py @@ -6,17 +6,16 @@ from catkin_pkg.python_setup import generate_distutils_setup d = generate_distutils_setup( packages=['rosjava_tools'], package_dir={'': 'src'}, - #scripts=['scripts/android_generate_project_properties', - # 'scripts/catkin_init_android_repo', - # 'scripts/catkin_create_android_pkg', - # 'scripts/catkin_create_android_library_pkg' - # ], - #package_data = {'rosjava_tools': [ - # 'gradle/*', - # 'gradle/gradle/wrapper/*' - # 'templates/android_package/*', - # 'templates/init_repo/*', - # ]}, + scripts=['scripts/catkin_init_android_repo', + 'scripts/catkin_create_android_pkg', + 'scripts/catkin_create_android_library_pkg' + ], + package_data = {'rosjava_tools': [ + 'gradle/*', + 'gradle/gradle/wrapper/*' + 'templates/android_package/*', + 'templates/init_repo/*', + ]}, requires=['rospy' 'rospkg'] ) diff --git a/src/rosjava_tools/__init__.py b/src/rosjava_tools/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..c625d3a15624a1b390483d7bb9d30e7eb9332cea --- /dev/null +++ b/src/rosjava_tools/__init__.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python +# +# License: Apache 2.0 +# https://raw.github.com/ros-java/rosjava_core/hydro-devel/rocon_tools/LICENSE +# + +############################################################################## +# Imports +############################################################################## + +import console +from init_repo import init_android_repo +from create_package import create_android_package +from utils import which diff --git a/src/rosjava_tools/console.py b/src/rosjava_tools/console.py new file mode 100644 index 0000000000000000000000000000000000000000..e7d8f772dad17aaaee2ceb44bd4aa4ce913b5347 --- /dev/null +++ b/src/rosjava_tools/console.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python +# +# License: Apache 2.0 +# https://raw.github.com/ros-java/rosjava_core/hydro-devel/rocon_tools/LICENSE +# + +############################################################################## +# Imports +############################################################################## + +import sys + +############################################################################## +# Methods +############################################################################## + + +def console_has_colours(stream): + if not hasattr(stream, "isatty"): + return False + if not stream.isatty(): + return False # auto color only on TTYs + try: + import curses + curses.setupterm() + return curses.tigetnum("colors") > 2 + except: + # guess false in case of error + return False + +has_colours = console_has_colours(sys.stdout) +#reset = "\x1b[0;0m" +reset = "\x1b[0m" + +bold = '1' +black, red, green, yellow, blue, magenta, cyan, white = [str(i) for i in range(30, 38)] +bold_black, bold_red, bold_green, bold_yellow, bold_blue, bold_magenta, bold_cyan, bold_white = ['1;' + str(i) for i in range(30, 38)] +colours = [ + bold, + black, red, green, yellow, blue, magenta, cyan, white, + bold_black, bold_red, bold_green, bold_yellow, bold_blue, bold_magenta, bold_cyan, bold_white + ] + + +def pretty_print(msg, colour=white): + if has_colours: + seq = "\x1b[%sm" % (colour) + msg + reset + sys.stdout.write(seq) + else: + sys.stdout.write(msg) + + +def pretty_println(msg, colour=white): + if has_colours: + seq = "\x1b[%sm" % (colour) + msg + reset + sys.stdout.write(seq) + sys.stdout.write("\n") + else: + sys.stdout.write(msg) + + +############################################################################## +# Console +############################################################################## + + +def debug(msg): + pretty_print("%s\n" % msg, green) + + +def warning(msg): + pretty_print("%s\n" % msg, yellow) + + +def error(msg): + pretty_print("%s\n" % msg, red) + + +def logdebug(message): + pretty_print("[debug] " + message + "\n", green) + + +def logwarn(message): + pretty_print("[warning] " + message + "\n", yellow) + + +def logerror(message): + pretty_print("[error] " + message + "\n", red) + + +def logfatal(message): + pretty_print("[error] " + message + "\n", bold_red) + + +############################################################################## +# Main +############################################################################## + +if __name__ == '__main__': + for colour in colours: + pretty_print("dude\n", colour) + logdebug("info message") + logwarn("warning message") + logerror("error message") + logfatal("fatal message") + pretty_print("red\n", red) + print("some normal text") diff --git a/src/rosjava_tools/create_package.py b/src/rosjava_tools/create_package.py new file mode 100644 index 0000000000000000000000000000000000000000..43986e0819574b6961cb6663691bb132729bc47a --- /dev/null +++ b/src/rosjava_tools/create_package.py @@ -0,0 +1,311 @@ +#!/usr/bin/env python +# +# License: Apache 2.0 +# https://raw.github.com/ros-java/rosjava_core/hydro-devel/rocon_tools/LICENSE +# + +############################################################################## +# Imports +############################################################################## + +from __future__ import print_function + +import os +import sys +import argparse +import subprocess +import shutil + +# local imports +import utils +import console +import catkin_pkg +from catkin_pkg.package_templates import create_package_xml, PackageTemplate + +############################################################################## +# Methods +############################################################################## + + +def parse_arguments(): + argv = sys.argv[1:] + parser = argparse.ArgumentParser( + description='Creates a new android package based on catkin and gradle. \n') + parser.add_argument('name', + nargs=1, + help='The name for the package') + parser.add_argument('dependencies', + nargs='*', + help='Android library dependencies') + parser.add_argument('-l', '--license', + action='append', + default=["Apache 2.0"], + help='Name for License, (e.g. BSD, MIT, GPLv3...)[BSD]') + parser.add_argument('-a', '--author', + action='append', + default=[utils.author_name()], + help='A single author, may be used multiple times') + parser.add_argument('-m', '--maintainer', + action='append', + help='A single maintainer, may be used multiple times') + parser.add_argument('-V', '--pkg_version', + action='store', + default="0.1.0", + help='Initial Package version [0.1.0]') + parser.add_argument('-D', '--description', + action='store', + help='Description') + parser.add_argument('-s', '--sdk-version', + action='store', + default='17', + help='Android sdk version [17]') + parser.add_argument('-p', '--android-package-name', + action='store', + default='com.github.rosjava.android.pkg_name', + help='Android package name (e.g. com.github.rosjava.android.pkg_name)') + args = parser.parse_args(argv) + if args.android_package_name == "com.github.rosjava.android.pkg_name": + args.android_package_name = "com.github.rosjava.android.%s" % args.name[0].lower() + if "rosjava_tools" not in args.dependencies: + args.dependencies.append('rosjava_tools') + return args + + +def create_android_project(package_name, sdk_version, java_package_name, is_library): + path = os.path.join(os.getcwd(), package_name.lower()) + console.pretty_println("\nCreating android project ", console.bold) + console.pretty_print(" Name : ", console.cyan) + console.pretty_println("%s" % package_name, console.yellow) + console.pretty_print(" Sdk Ver : ", console.cyan) + console.pretty_println("%s" % sdk_version, console.yellow) + console.pretty_print(" Java Name : ", console.cyan) + console.pretty_println("%s" % java_package_name, console.yellow) + if is_library: + console.pretty_print(" Library : ", console.cyan) + console.pretty_println("yes\n", console.yellow) + cmd = ['android', 'create', 'lib-project', '-n', package_name, '-p', path, '-k', java_package_name, '-t', 'android-' + sdk_version, ] + else: + activity_name = utils.camel_case(package_name) + console.pretty_print(" Activity : ", console.cyan) + console.pretty_println("%s\n" % activity_name, console.yellow) + cmd = ['android', 'create', 'project', '-n', package_name, '-p', path, '-k', java_package_name, '-t', 'android-' + sdk_version, '-a', activity_name] + try: + subprocess.check_call(cmd) + except subprocess.CalledProcessError: + raise subprocess.CalledProcessError("failed to create android project.") + # This is in the old form, let's shovel the shit around to the new form + utils.mkdir_p(os.path.join(path, 'src', 'main', 'java')) + os.remove(os.path.join(path, 'local.properties')) + os.remove(os.path.join(path, 'project.properties')) + os.remove(os.path.join(path, 'ant.properties')) + os.remove(os.path.join(path, 'proguard-project.txt')) + os.remove(os.path.join(path, 'build.xml')) + os.rmdir(os.path.join(path, 'bin')) + os.rmdir(os.path.join(path, 'libs')) + shutil.move(os.path.join(path, 'AndroidManifest.xml'), os.path.join(path, 'src', 'main')) + shutil.move(os.path.join(path, 'res'), os.path.join(path, 'src', 'main')) + if not is_library: + shutil.move(os.path.join(path, 'src', java_package_name.split('.')[0]), os.path.join(path, 'src', 'main', 'java')) + +############################################################################## +# Methods acting on classes +############################################################################## + + +# This inserts the labelled variables into the template wherever the corresponding +# %package, %brief, %description and %depends is found. +def instantiate_template(template, package_name, author, plugin_name, sdk_version): + return template % locals() + + +def create_catkin_package_files(args, is_library, sdk_version): + ''' + This is almost a direct copy from catkin_create_pkg. + ''' + plugin_name = "android-library" if is_library else "android" + try: + package_name = args.name[0].lower() + parent_path = os.getcwd() + target_path = utils.validate_path(os.path.join(parent_path, package_name)) + build_depends = [] + if 'rosjava_tools' not in args.dependencies: + build_depends.append('rosjava_tools') + for depend_name in args.dependencies: + build_depends.append(catkin_pkg.package.Dependency(depend_name)) + package_template = PackageTemplate._create_package_template( + package_name=package_name, + description=args.description, + licenses=args.license or [], + maintainer_names=args.maintainer, + author_names=args.author, + version=args.pkg_version, + catkin_deps=[], + system_deps=[], + boost_comps=None) + package_template.exports = [] + package_template.build_depends = build_depends + package_xml = create_package_xml(package_template=package_template, rosdistro='groovy') + package_path = os.path.abspath(os.path.join(os.getcwd(), package_name)) + filename = os.path.join(package_path, 'package.xml') + console.pretty_println("\nCreating catkin/gradle files", console.bold) + try: + f = open(filename, 'w') + f.write(package_xml) + console.pretty_print(' File: ', console.cyan) + console.pretty_println('package.xml', console.yellow) + finally: + f.close() + # Other files + for template_name in ['build.gradle', 'CMakeLists.txt']: + filename = os.path.join(package_path, template_name) + template = read_template_file(template_name) + contents = instantiate_template(template, package_name, args.author[0], plugin_name, sdk_version) + try: + f = open(filename, 'w') + f.write(contents) + console.pretty_print(' File: ', console.cyan) + console.pretty_println(template_name, console.yellow) + finally: + f.close() + except Exception: + raise + + +def add_to_root_gradle_settings(name): + ''' + Adds project name to the root level settings.gradle file. + ''' + for rel_path in ['.', '..']: + settings_gradle_path = os.path.join(os.getcwd(), rel_path, 'settings.gradle') + if os.path.isfile(settings_gradle_path): + break + else: + settings_gradle_path = None + if settings_gradle_path is None: + console.pretty_println("\nCouldn't find the root level settings.gradle file - not adding to the superproject.") + return + with open(settings_gradle_path, 'a') as settings_gradle: + console.pretty_println("\nIncluding '%s' in the root gradle project configuration (settings.gradle).\n" % name, console.bold) + settings_gradle.write("include '%s'\n" % name) + + +def create_android_package(is_library=False): + args = parse_arguments() + create_android_project(args.name[0], args.sdk_version, args.android_package_name, is_library) + create_catkin_package_files(args, is_library, args.sdk_version) + add_to_root_gradle_settings(args.name[0]) + +############################################################################## +# Borrowed from catkin_pkg.package_templates +############################################################################## + +from catkin_pkg.package_templates import _create_depend_tag, \ + PACKAGE_MANIFEST_FILENAME, CatkinTemplate + + +def read_template_file(filename): + template_dir = os.path.join(os.path.dirname(__file__), 'templates', 'android_package') + template = os.path.join(template_dir, '%s.in' % filename) + if not os.path.isfile(template): + raise IOError( + "Could not read template [%s]" % template + ) + with open(template, 'r') as fhand: + template_contents = fhand.read() + return template_contents + + +def create_package_xml(package_template, rosdistro): + """ + :param package_template: contains the required information + :returns: file contents as string + """ + package_xml_template = read_template_file(PACKAGE_MANIFEST_FILENAME) + ctemp = CatkinTemplate(package_xml_template) + temp_dict = {} + for key in package_template.__slots__: + temp_dict[key] = getattr(package_template, key) + + if package_template.version_abi: + temp_dict['version_abi'] = ' abi="%s"' % package_template.version_abi + else: + temp_dict['version_abi'] = '' + + if not package_template.description: + temp_dict['description'] = 'The %s package ...' % package_template.name + + licenses = [] + for plicense in package_template.licenses: + licenses.append(' <license>%s</license>\n' % plicense) + temp_dict['licenses'] = ''.join(licenses) + + def get_person_tag(tagname, person): + email_string = ( + "" if person.email is None else 'email="%s"' % person.email + ) + return ' <%s %s>%s</%s>\n' % (tagname, email_string, + person.name, tagname) + + maintainers = [] + for maintainer in package_template.maintainers: + maintainers.append(get_person_tag('maintainer', maintainer)) + temp_dict['maintainers'] = ''.join(maintainers) + + urls = [] + for url in package_template.urls: + type_string = ("" if url.type is None + else 'type="%s"' % url.type) + urls.append(' <url %s >%s</url>\n' % (type_string, url.url)) + temp_dict['urls'] = ''.join(urls) + + authors = [] + for author in package_template.authors: + authors.append(get_person_tag('author', author)) + temp_dict['authors'] = ''.join(authors) + + dependencies = [] + dep_map = { + 'build_depend': package_template.build_depends, + 'buildtool_depend': package_template.buildtool_depends, + 'run_depend': package_template.run_depends, + 'test_depend': package_template.test_depends, + 'conflict': package_template.conflicts, + 'replace': package_template.replaces + } + for dep_type in ['buildtool_depend', 'build_depend', 'run_depend', + 'test_depend', 'conflict', 'replace']: + for dep in sorted(dep_map[dep_type], key=lambda x: x.name): + if 'depend' in dep_type: + dep_tag = _create_depend_tag( + dep_type, + dep.name, + dep.version_eq, + dep.version_lt, + dep.version_lte, + dep.version_gt, + dep.version_gte + ) + dependencies.append(dep_tag) + else: + dependencies.append(_create_depend_tag(dep_type, + dep.name)) + temp_dict['dependencies'] = ''.join(dependencies) + + exports = [] + if package_template.exports is not None: + for export in package_template.exports: + if export.content is not None: + print('WARNING: Create package does not know how to ' + 'serialize exports with content: ' + '%s, %s, ' % (export.tagname, export.attributes) + + '%s' % (export.content), + file=sys.stderr) + else: + attribs = [' %s="%s"' % (k, v) for (k, v) in export.attributes.items()] + line = ' <%s%s/>\n' % (export.tagname, ''.join(attribs)) + exports.append(line) + temp_dict['exports'] = ''.join(exports) + + temp_dict['components'] = package_template.catkin_deps + + return ctemp.substitute(temp_dict) \ No newline at end of file diff --git a/src/rosjava_tools/gradle/Readme.md b/src/rosjava_tools/gradle/Readme.md new file mode 100644 index 0000000000000000000000000000000000000000..78d553d97818786005b31f71b95a67d96c7ad6ac --- /dev/null +++ b/src/rosjava_tools/gradle/Readme.md @@ -0,0 +1,3 @@ +This is not installed, but it gets used to generate the gradle wrapper for a project. + +It is currently the gradle wrapper supporting gradle 1.6. \ No newline at end of file diff --git a/src/rosjava_tools/gradle/gradle/wrapper/gradle-wrapper.properties b/src/rosjava_tools/gradle/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000000000000000000000000000000000..e4073d7b78b7c35ff59d0a9450bc6068e2fc1241 --- /dev/null +++ b/src/rosjava_tools/gradle/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sun May 26 11:09:41 KST 2013 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=http\://services.gradle.org/distributions/gradle-1.6-bin.zip diff --git a/src/rosjava_tools/gradle/gradlew b/src/rosjava_tools/gradle/gradlew new file mode 100755 index 0000000000000000000000000000000000000000..91a7e269e19dfc62e27137a0b57ef3e430cee4fd --- /dev/null +++ b/src/rosjava_tools/gradle/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/src/rosjava_tools/init_repo.py b/src/rosjava_tools/init_repo.py new file mode 100644 index 0000000000000000000000000000000000000000..12af10616b0698d785f3c6e5935869b6f083e1d0 --- /dev/null +++ b/src/rosjava_tools/init_repo.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python +# +# License: Apache 2.0 +# https://raw.github.com/ros-java/rosjava_core/hydro-devel/rocon_tools/LICENSE +# + +############################################################################## +# Imports +############################################################################## + +import os +import sys +import argparse +import subprocess + +# local imports +import utils +import console + +############################################################################## +# Methods +############################################################################## + + +def parse_arguments(): + argv = sys.argv[1:] + parser = argparse.ArgumentParser( + description='Creates a new android repository based on catkin and gradle. \n\nNote that the path you provide will become the maven group for your repo.\n') + parser.add_argument('path', nargs='?', default=os.getcwd(), help='path to the repository you wish to create (must not exist beforehand).') + args = parser.parse_args(argv) + return args + + +# Finds and reads one of the templates. +def read_template(tmplf): + f = open(tmplf, 'r') + try: + t = f.read() + finally: + f.close() + return t + + +# This inserts the labelled variables into the template wherever the corresponding +# %package, %brief, %description and %depends is found. +def instantiate_template(template, repo_name, author): + return template % locals() + + +def get_templates(): + template_dir = os.path.join(os.path.dirname(__file__), 'templates', 'init_repo') + templates = {} + templates['build.gradle'] = read_template(os.path.join(template_dir, 'build.gradle.in')) + templates['settings.gradle'] = read_template(os.path.join(template_dir, 'settings.gradle')) + return templates + + +def populate_repo(repo_path): + author = utils.author_name() + repo_name = os.path.basename(repo_path) + templates = get_templates() + for filename, template in templates.iteritems(): + contents = instantiate_template(template, repo_name, author) + try: + p = os.path.abspath(os.path.join(repo_path, filename)) + f = open(p, 'w') + f.write(contents) + console.pretty_print("Created repo file: ", console.cyan) + console.pretty_println("%s" % p, console.yellow) + finally: + f.close() + + +def create_gradle_wrapper(repo_path): + gradle_binary = os.path.join(os.path.dirname(__file__), 'gradle', 'gradlew') + cmd = [gradle_binary, '-p', repo_path, 'wrapper'] + console.pretty_print("Creating gradle wrapper: ", console.cyan) + console.pretty_println("%s" % ' '.join(cmd), console.yellow) + try: + subprocess.check_call(cmd) + except subprocess.CalledProcessError: + raise subprocess.CalledProcessError("failed to create the gradle wrapper.") + +############################################################################## +# Methods acting on classes +############################################################################## + + +def init_android_repo(): + args = parse_arguments() + try: + repo_path = utils.validate_path(args.path) + populate_repo(repo_path) + create_gradle_wrapper(repo_path) + except Exception: + raise diff --git a/src/rosjava_tools/templates/android_package/CMakeLists.txt.in b/src/rosjava_tools/templates/android_package/CMakeLists.txt.in new file mode 100644 index 0000000000000000000000000000000000000000..48ce6af73e4831d13d1c4c9f84943909550016cf --- /dev/null +++ b/src/rosjava_tools/templates/android_package/CMakeLists.txt.in @@ -0,0 +1,14 @@ +############################################################################## +# CMake +############################################################################## + +cmake_minimum_required(VERSION 2.8.3) +project(%(package_name)s) + +############################################################################## +# Catkin +############################################################################## + +find_package(catkin REQUIRED rosjava_tools) +catkin_android_setup() +catkin_package() diff --git a/src/rosjava_tools/templates/android_package/build.gradle.in b/src/rosjava_tools/templates/android_package/build.gradle.in new file mode 100644 index 0000000000000000000000000000000000000000..596f75636a92941b1316b225955515c78edf8a22 --- /dev/null +++ b/src/rosjava_tools/templates/android_package/build.gradle.in @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2013 %(author)s. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +/* + Examples of + 1) dependencies from another project in this gradle stack. + 2) dependency from a maven repository. +*/ +/* +dependencies { + compile project(':android_apps_core_components') + compile 'ros.android_core:android_gingerbread_mr1:0.0.0-SNAPSHOT' +} +*/ + +apply plugin: '%(plugin_name)s' + +android { + compileSdkVersion %(sdk_version)s + buildToolsVersion androidBuildToolsVersion +} + diff --git a/src/rosjava_tools/templates/android_package/package.xml.in b/src/rosjava_tools/templates/android_package/package.xml.in new file mode 100644 index 0000000000000000000000000000000000000000..ae70d8140f364d3956f670bed3a79516fae693e3 --- /dev/null +++ b/src/rosjava_tools/templates/android_package/package.xml.in @@ -0,0 +1,32 @@ +<?xml version="1.0"?> +<package> + <name>@name</name> + <version@version_abi>@version</version> + <description>@description</description> + + <!-- One maintainer tag required, multiple allowed, one person per tag --> + <!-- <maintainer email="jane.doe@@example.com">Jane Doe</maintainer> --> +@maintainers + + <!-- One license tag required, multiple allowed, one license per tag --> + <!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 --> +@licenses + + <!-- Url tags are optional, but mutiple are allowed, one per tag --> + <url type="website">http://ros.org/wiki/@name</url> + <!-- <url type="repository">https://github.com/ros-java/android_honeycomb</url> --> + <!-- <url type="bugtracker">https://github.com/ros-java/android_honeycomb/issues</url> --> +@urls + + <!-- Author tags are optional, multiple are allowed, one per tag --> + <!-- Example: --> + <!-- <author email="jane.doe@@example.com">Jane Doe</author> --> +@authors + + <!-- The rosjava_tool depends is for cmake injection of catkin_android_setup --> + <!-- Other build_depend tags are used to specify android library dependencies --> + <!-- e.g. android_gingerbread, android_honeycomb --> + <!-- No run_depend tags are necessary since we download to the device --> +@dependencies + +</package> diff --git a/src/rosjava_tools/templates/init_repo/build.gradle.in b/src/rosjava_tools/templates/init_repo/build.gradle.in new file mode 100644 index 0000000000000000000000000000000000000000..879f871c5a75d1c287253fe0339c6cee82b963de --- /dev/null +++ b/src/rosjava_tools/templates/init_repo/build.gradle.in @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2013 %(author)s + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +task wrapper(type: Wrapper) { + gradleVersion = '1.6' +} + +allprojects { + group 'ros.%(repo_name)s' + version = '0.1.0' +} + +ext.androidBuildToolsVersion = "17" + +subprojects { + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:0.4.1' + } + } + apply plugin: 'maven' + repositories { + mavenLocal() + maven { + url 'http://robotbrains.hideho.org/nexus/content/groups/ros-public' + } + } + configurations.add('compile') { + exclude group: 'junit' + exclude group: 'xml-apis' + } + + /* + EXPERIMENTAL: Trick to get local maven installs until the plugin supports an + install step for aar's (coming soon). + */ + uploadArchives { + repositories { + mavenDeployer { + repository url: 'file://' + new File(System.getProperty('user.home'), '.m2/repository').absolutePath + } + } + } + task install() << { + description = 'installs .aar files to the local maven repository.' + } + + /* Get the debug versions of the aar's as well. */ + afterEvaluate { Project project -> + if (plugins.findPlugin('android-library')) { + task doDebugArchives() << { + project.artifacts.add("default", bundleDebug) + } + doDebugArchives.dependsOn('bundleDebug') + uploadArchives.dependsOn('doDebugArchives') + install.dependsOn('uploadArchives') + } + } +} diff --git a/src/rosjava_tools/templates/init_repo/settings.gradle b/src/rosjava_tools/templates/init_repo/settings.gradle new file mode 100644 index 0000000000000000000000000000000000000000..00841924d83ea9d3bf07fc35858bdce88e7c4733 --- /dev/null +++ b/src/rosjava_tools/templates/init_repo/settings.gradle @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2013 %(author)s + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +/* Uncomment these and add your own packages to be gradled +include 'my_android_project' +include 'my_android_library_project' +*/ diff --git a/src/rosjava_tools/utils.py b/src/rosjava_tools/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..6df94e3880f7d37c51a86e38c12ea83d83bcda06 --- /dev/null +++ b/src/rosjava_tools/utils.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python +# +# License: Apache 2.0 +# https://raw.github.com/ros-java/rosjava_core/hydro-devel/rosjava_tools/LICENSE +# + +############################################################################## +# Imports +############################################################################## + +import os +import errno +import pwd + +############################################################################## +# Methods +############################################################################## + + +def which(program): + ''' + Looks for program in the environment. + + @param program : string name of the program (e.g. 'ls') + @type str + @return absolute pathname of the program or None + @rtype str or None + ''' + def is_exe(fpath): + return os.path.isfile(fpath) and os.access(fpath, os.X_OK) + + fpath, unused_fname = os.path.split(program) + if fpath: + if is_exe(program): + return program + else: + for path in os.environ["PATH"].split(os.pathsep): + path = path.strip('"') + exe_file = os.path.join(path, program) + if is_exe(exe_file): + return exe_file + return None + + +def camel_case(word): + return ''.join(x.capitalize() or '_' for x in word.split('_')) + + +def author_name(): + """ + Utility to compute logged in user name + + :returns: name of current user, ``str`` + """ + import getpass + name = getpass.getuser() + try: + login = name + name = pwd.getpwnam(login)[4] + name = ''.join(name.split(',')) # strip commas + # in case pwnam is not set + if not name: + name = login + except: + #pwd failed + pass + if type(name) == str: + name = name.decode('utf-8') + return name + + +def mkdir_p(path): + ''' + Enables mkdir -p functionality (until python 3.2 is able to use + the mode argument to do the same). + ''' + try: + os.makedirs(path) + except OSError as e: + if e.errno == errno.EEXIST and os.path.isdir(path): + pass + else: raise os.mkdir(os.path.join(path, 'src', 'main', 'java')) + + +def validate_path(path): + ''' + Validates that there isn't a gradle project in the specified path. + We use this when creating an android repo/package. + + @param path : path where you wish to create the repository/package. + @type str + @raise RuntimeError + @return path : validated (exists) absolute pathname + ''' + if not os.path.isabs(path): + absolute_path = os.path.join(os.getcwd(), path) + else: + absolute_path = path + if not os.path.exists(absolute_path): + os.mkdir(absolute_path) + else: + if os.path.isfile(os.path.join(path, 'build.gradle')): + raise ValueError("Error: a gradle project already resides in this location [%s]" % absolute_path) + return absolute_path