diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 9719d598632171ce31c6b9bc51df40496a2823f3..ab66da242c77949596804decaeb75cc733cf8c7c 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,12 +2,83 @@ Changelog ^^^^^^^^^ +0.3.0 (2016-12-14) +------------------ +* Updates for Kinetic release. + +0.2.4 (2015-06-03) +------------------ +* bugfix environment hooks for workspaces with spaces. + +0.2.3 (2015-03-01) +------------------ +* publically expose the rosjava environment setup (for genjava). +* Contributors: Daniel Stonier + +0.2.2 (2015-02-25) +------------------ +* support for finding broken message packages. +* Contributors: Daniel Stonier + +0.2.1 (2015-02-25) +------------------ +* upgrade catkin create scripts for indigo +* support modules for genjava +* deprecated create msg package scripts +* minor bugfixes and improvements. +* Contributors: Benjamin Chrétien, Daniel Stonier, Martin Pecka + 0.2.0 [2013-10-25] ================== * official maven style open range dependencies in templates * gradle 1.7->1.8 * android build tools 18.1.1 +0.1.34 (2014-06-12) +=================== +* assist rospack to speedup by ignoring the installed maven directories. + +0.1.33 [2014-03-19] +=================== +* gradle 1.9->1.11 + +0.1.32 [2014-02-20] +=================== +* bugfix catkin_make on empty catkin_created gradle projects. + +0.1.31 [2014-02-03] +=================== +* separate app and library catkin_create_rosjava_xxx_project scripts. +* app rosjava project integration with catkin_make (i.e. cmake-gradle targets). + +0.1.30 [2013-12-26] +=================== +* rosdistro scraping more intelligent : now checks for message_generation dependant packages +* gradle 1.8->1.9 upgrade in templates + +0.1.29 [2013-11-08] +=================== +* fix single artifact message generation when there is dependencies. + +0.1.28 [2013-10-30] +=================== +* seed ROS_MAVEN_REPOSITORY when necessary. + +0.1.27 [2013-10-30] +=================== +* use ROS_MAVEN_REPOSITORY to configure the external repository. + +0.1.26 [2013-10-26] +=================== +* embedded gradle 1.7->1.8 +* templates updated for official maven style open ranged dependencies + +0.1.25 [2013-10-26] +=================== + +* gradle 1.7->1.8 +* android tools 17->18.1.1 + 0.1.24 [2013-10-04] =================== diff --git a/CMakeLists.txt b/CMakeLists.txt index d9803703bafb26f84ad30b886180ad6294b8f2a1..9eb125511c751e3edb702d91568ad6a8f23b1082 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,3 +42,10 @@ install( DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} ) +set(ROS_MAVEN_DEPLOYMENT_REPOSITORY $ENV{ROS_MAVEN_DEPLOYMENT_REPOSITORY}) +if(NOT ROS_MAVEN_DEPLOYMENT_REPOSITORY) + set(ROS_MAVEN_DEPLOYMENT_REPOSITORY "${CATKIN_DEVEL_PREFIX}/${CATKIN_GLOBAL_SHARE_DESTINATION}/maven") +endif() +file(WRITE ${ROS_MAVEN_DEPLOYMENT_REPOSITORY}/rospack_nosubdirs "") +install(FILES ${ROS_MAVEN_DEPLOYMENT_REPOSITORY}/rospack_nosubdirs + DESTINATION ${CATKIN_GLOBAL_SHARE_DESTINATION}/maven) diff --git a/README.md b/README.md index 89df68889d6f586f17203ee9aaa3daac7b2a1b60..07a3ee86b745a94cb08cd280d80ec3c442b8aa46 100644 --- a/README.md +++ b/README.md @@ -1,54 +1,9 @@ -# RosJava Tools +See [rosjava_core](https://github.com/rosjava/rosjava_core) readme. -Build tools for rosjava and android repositories. Currently includes some cmake macros and python creation -scripts. +## Moving ## +This documentation will eventually merge with the rosjava_core and android_core documentation. -## RosJava Build Demo - - -``` -> mkdir -p ~/rosjava/src -> cd ~/rosjava/src -> catkin_init_workspace . -> wstool init . -> wstool set rosjava_build_tools --git https://github.com/rosjava/rosjava_build_tools -v hydro-devel -> wstool set rosjava_core --git https://github.com/rosjava/rosjava_core -v hydro-devel -> wstool update -> cd ~/rosjava -> catkin_make -``` - -The only changes made to the `rosjava_core` repo was to add a `package.xml` with a depends on `rosjava_build_tools` and a -changes to the `CMakeLists.txt` as follows: - -``` -... -find_package(catkin REQUIRED rosjava_build_tools) - -catkin_rosjava_setup() -``` - -This cmake makro sets up dummy targets in the cmake configuration which call out to gradle in the actual make step. -It also parses the `package.xml` to add target dependencies from each `build_depends` tag (subsequently letting you -sequence builds across repositories). - -It also adds a global and package `gradle-clean` target. - -``` -> catkin_make -# Clean a single gradle package -> cd ~/rosjava/build/rosjava_core -> make gradle-clean-rosjava_core -# Clean all gradle packages -> cd ~/rosjava/build -> make gradle-clean -``` - -## Android Build Demo +## Usage ## Refer to http://ros.org/wiki/rosjava_build_tools. - -## Moving - -This documentation will eventually merge with the rosjava_core and android_core documentation. diff --git a/cmake/rosjava.cmake.em b/cmake/rosjava.cmake.em index b7a3c8081417d3a24befccc48211e26461e284a6..b867f5b6af87b2fb6f93d341cd9d0ef694d8cbbb 100644 --- a/cmake/rosjava.cmake.em +++ b/cmake/rosjava.cmake.em @@ -43,7 +43,8 @@ endmacro() # CATKIN_ENV won't have any configuration, so we need some incoming here. # Note that we check for the variable existence as well so we don't # override a user setting. -macro(_rosjava_env) +macro(catkin_rosjava_env_setup) + set(ROS_GRADLE_VERBOSE $ENV{ROS_GRADLE_VERBOSE}) set(ROS_MAVEN_DEPLOYMENT_REPOSITORY $ENV{ROS_MAVEN_DEPLOYMENT_REPOSITORY}) set(ROS_MAVEN_REPOSITORY $ENV{ROS_MAVEN_REPOSITORY}) if(NOT ROS_MAVEN_DEPLOYMENT_REPOSITORY) @@ -68,27 +69,41 @@ endmacro() # Calls the gradle wrapper to compile just the package # that it is called in with install and installApp targets. macro(catkin_rosjava_setup) - _rosjava_env() + catkin_rosjava_env_setup() find_gradle() if( ${ARGC} EQUAL 0 ) - # Note : COMMAND is a list of variables (semi-colon separated) - set(gradle_tasks "uploadArchives") # old targets "install;installApp;uploadArchives" + return() # Nothing to do (typically no subprojects created yet) else() set(gradle_tasks ${ARGV}) endif() - add_custom_target(gradle-${PROJECT_NAME} - ALL - COMMAND ${ROSJAVA_ENV} ${CATKIN_ENV} "env" "|" "grep" "ROS" - COMMAND ${ROSJAVA_ENV} ${CATKIN_ENV} ${${PROJECT_NAME}_gradle_BINARY} ${gradle_tasks} + if(ROS_GRADLE_VERBOSE) + set(gradle_options "") + else() + set(gradle_options "-q") + endif() + ################################### + # Execution + ################################### + add_custom_target(gradle-${PROJECT_NAME} ALL + #COMMAND ${ROSJAVA_ENV} ${CATKIN_ENV} "env" "|" "grep" "ROS" + COMMAND ${ROSJAVA_ENV} ${CATKIN_ENV} ${${PROJECT_NAME}_gradle_BINARY} ${gradle_options} ${gradle_tasks} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} VERBATIM + COMMENT "Gradling tasks for ${PROJECT_NAME}" ) + ################################### + # Target Management + ################################### catkin_package_xml() - foreach(depends in ${${PROJECT_NAME}_BUILD_DEPENDS}) + foreach(depends ${${PROJECT_NAME}_BUILD_DEPENDS}) if(TARGET gradle-${depends}) - #message(STATUS "Adding dependency gradle-${depends}") + #message(STATUS "Adding dependency.....gradle-${PROJECT_NAME} <- gradle-${depends}") add_dependencies(gradle-${PROJECT_NAME} gradle-${depends}) endif() + if(TARGET ${depends}_generate_messages) + #message(STATUS "Adding dependency.....gradle-${PROJECT_NAME} <- ${depends}_generate_messages") + add_dependencies(gradle-${PROJECT_NAME} ${depends}_generate_messages) + endif() endforeach() if(NOT TARGET gradle-clean) add_custom_target(gradle-clean) @@ -96,6 +111,7 @@ macro(catkin_rosjava_setup) add_custom_target(gradle-clean-${PROJECT_NAME} COMMAND ${CATKIN_ENV} ${${PROJECT_NAME}_gradle_BINARY} clean WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Cleaning gradle project for ${PROJECT_NAME}" ) add_dependencies(gradle-clean gradle-clean-${PROJECT_NAME}) endmacro() @@ -107,14 +123,10 @@ endmacro() # It checks the build type and determines whether it should run # assembleDebug or assembleRelease macro(catkin_android_setup) - _rosjava_env() + catkin_rosjava_env_setup() find_gradle() if( ${ARGC} EQUAL 0 ) - if(CMAKE_BUILD_TYPE STREQUAL "Release") - set(gradle_tasks "assembleRelase") - else() - set(gradle_tasks "assembleDebug") - endif() + return() # Nothing to do (typically no subprojects created yet) else() set(gradle_tasks ${ARGV}) endif() diff --git a/env-hooks/15.rosjava.bash.em b/env-hooks/15.rosjava.bash.em index 0a8cd588e0477d2218ca5f7b4d8eb2968aa98d22..9da9f00b39bcbe904349eb7c182f9eeaabf934c0 100644 --- a/env-hooks/15.rosjava.bash.em +++ b/env-hooks/15.rosjava.bash.em @@ -6,7 +6,6 @@ SCRIPT=@(CMAKE_CURRENT_SOURCE_DIR)/generate_environment_variables.py SCRIPT=@(CMAKE_INSTALL_PREFIX)/share/rosjava_build_tools/generate_environment_variables.py @[end if]@ -export ROS_MAVEN_PATH=`python ${SCRIPT} --maven-path` -export ROS_MAVEN_DEPLOYMENT_REPOSITORY=`python ${SCRIPT} --maven-deployment-repository` -export ROS_MAVEN_REPOSITORY=`python ${SCRIPT} --maven-repository` - +export ROS_MAVEN_PATH="`python ${SCRIPT} --maven-path`" +export ROS_MAVEN_DEPLOYMENT_REPOSITORY="`python ${SCRIPT} --maven-deployment-repository`" +export ROS_MAVEN_REPOSITORY="`python ${SCRIPT} --maven-repository`" diff --git a/env-hooks/15.rosjava.sh.em b/env-hooks/15.rosjava.sh.em index 62cc858023426f66458e44b0fdef7c1f4eda3d2f..36f796e5f06d8ca41c0d43a6b69da0eb2b821825 100644 --- a/env-hooks/15.rosjava.sh.em +++ b/env-hooks/15.rosjava.sh.em @@ -6,6 +6,6 @@ SCRIPT=@(CMAKE_CURRENT_SOURCE_DIR)/generate_environment_variables.py SCRIPT=@(CMAKE_INSTALL_PREFIX)/share/rosjava_build_tools/generate_environment_variables.py @[end if]@ -export ROS_MAVEN_PATH=`python ${SCRIPT} --maven-path` -export ROS_MAVEN_DEPLOYMENT_REPOSITORY=`python ${SCRIPT} --maven-deployment-repository` -export ROS_MAVEN_REPOSITORY=`python ${SCRIPT} --maven-repository` +export ROS_MAVEN_PATH="`python ${SCRIPT} --maven-path`" +export ROS_MAVEN_DEPLOYMENT_REPOSITORY="`python ${SCRIPT} --maven-deployment-repository`" +export ROS_MAVEN_REPOSITORY="`python ${SCRIPT} --maven-repository`" diff --git a/generate_environment_variables.py b/generate_environment_variables.py index af7a3f9ffe18767c00682ea573292d648013d29e..5d8f4ce2c1baaeb29766cd7b917df9ce78618a9c 100755 --- a/generate_environment_variables.py +++ b/generate_environment_variables.py @@ -24,7 +24,7 @@ def get_workspaces(environ): value = environ[env_name] if env_name in environ else '' paths = [path for path in value.split(os.pathsep) if path] # remove non-workspace paths - workspaces = [path for path in paths if os.path.isfile(os.path.join(path, CATKIN_MARKER_FILE))] + workspaces = [path.replace(' ', '\ ') for path in paths if os.path.isfile(os.path.join(path, CATKIN_MARKER_FILE))] return workspaces def get_environment_variable(environ, key): diff --git a/package.xml b/package.xml index a0b990f66e6fbca106ba78f94af228907b28d93e..811a7a229efecc620ee2682849ce95e1fccaf969 100644 --- a/package.xml +++ b/package.xml @@ -1,27 +1,21 @@ <package> <name>rosjava_build_tools</name> - <version>0.2.0</version> + <version>0.3.0</version> <description> - Simple tools and catkin modules for rosjava development. + Simple tools and catkin modules for rosjava development. </description> <maintainer email="d.stonier@gmail.com">Daniel Stonier</maintainer> <license>BSD</license> <url type="website">http://ros.org/wiki/rosjava_build_tools</url> <url type="repository">https://github.com/ros-java/rosjava_build_tools</url> <url type="bugtracker">https://github.com/ros-java/rosjava_build_tools/issues</url> - <author email="d.stonier@gmail.com">Daniel Stonier</author> + <author>Daniel Stonier</author> <buildtool_depend>catkin</buildtool_depend> - <build_depend>python-rospkg</build_depend> - <build_depend>rospy</build_depend> <build_depend>java</build_depend> <build_depend>ant</build_depend> - <build_depend>python-rosinstall-generator</build_depend> - <run_depend>python-rospkg</run_depend> - <run_depend>rospy</run_depend> <run_depend>java</run_depend> <run_depend>ant</run_depend> <run_depend>catkin</run_depend> - <run_depend>python-rosinstall-generator</run_depend> </package> diff --git a/scripts/catkin_create_rosjava_msg_project b/scripts/catkin_create_rosjava_library_project similarity index 74% rename from scripts/catkin_create_rosjava_msg_project rename to scripts/catkin_create_rosjava_library_project index afedb840c9ff6c0d9a1b6ef2ba31c20b9046ee43..dcc1d8960a83486269c0e722e495853ed99e2dbb 100755 --- a/scripts/catkin_create_rosjava_msg_project +++ b/scripts/catkin_create_rosjava_library_project @@ -1,17 +1,15 @@ #!/usr/bin/env python -"""This script creates the skeleton of an android library package""" +"""This script creates the skeleton of a rosjava library project""" ############################################################################## # Imports ############################################################################## from __future__ import print_function -import argparse -import os import sys -from rosjava_build_tools import create_rosjava_msg_project +from rosjava_build_tools import create_rosjava_library_project import rosjava_build_tools.console as console ############################################################################## @@ -20,7 +18,7 @@ import rosjava_build_tools.console as console if __name__ == "__main__": try: - sys.exit(create_rosjava_msg_project()) + sys.exit(create_rosjava_library_project()) except Exception as e: console.logerror("%s : %s" % (str(e), type(e))) sys.exit(1) diff --git a/scripts/catkin_create_rosjava_pkg b/scripts/catkin_create_rosjava_pkg index b21eb85e282c42682d2785177897b461bef858e9..fb533b86e3ff776036143832a30865119b026931 100755 --- a/scripts/catkin_create_rosjava_pkg +++ b/scripts/catkin_create_rosjava_pkg @@ -1,6 +1,6 @@ #!/usr/bin/env python -"""This script creates the skeleton of an rosjava repo""" +"""This script creates the skeleton of a rosjava catkin package (typically an entire repo)""" ############################################################################## # Imports diff --git a/scripts/catkin_create_rosjava_project b/scripts/catkin_create_rosjava_project index 9a2a34660f9000acffd19325dc986adf94307ad6..ac9c3545f59484984ab0b8d2e82c82d4905f5497 100755 --- a/scripts/catkin_create_rosjava_project +++ b/scripts/catkin_create_rosjava_project @@ -1,6 +1,6 @@ #!/usr/bin/env python -"""This script creates the skeleton of an android library package""" +"""This script creates the skeleton of a rosjava application project""" ############################################################################## # Imports diff --git a/setup.py b/setup.py index ab25ba3713b39c09a44eed9c2789ba331ced8457..7c823e8601336d906df0bebdb855983f270e790f 100644 --- a/setup.py +++ b/setup.py @@ -11,17 +11,16 @@ d = generate_distutils_setup( 'scripts/catkin_create_android_library_project', 'scripts/catkin_create_rosjava_pkg', 'scripts/catkin_create_rosjava_project', - 'scripts/catkin_create_rosjava_msg_project', + 'scripts/catkin_create_rosjava_library_project', ], package_data = {'rosjava_build_tools': [ 'templates/android_package/*', 'templates/android_project/*', - 'templates/rosjava_msg_project/*', + 'templates/rosjava_library_project/*', 'templates/rosjava_package/*', 'templates/rosjava_project/*', 'templates/init_repo/*', ]}, - requires=['rospy' 'rospkg'] ) setup(**d) diff --git a/src/rosjava_build_tools/__init__.py b/src/rosjava_build_tools/__init__.py index 1b912767d5c0cc4cc684f798e58e327112eac0e4..827706bdbe12f563481e841dfda34c0cfa8c5a5c 100644 --- a/src/rosjava_build_tools/__init__.py +++ b/src/rosjava_build_tools/__init__.py @@ -7,6 +7,7 @@ import console from create_package import init_android_package, init_rosjava_package from create_android_project import create_android_project -from create_rosjava_project import create_rosjava_project, create_rosjava_msg_project +from create_rosjava_project import create_rosjava_project, create_rosjava_msg_project, create_rosjava_library_project from utils import which from release import scrape_for_release_message_packages +import catkin diff --git a/src/rosjava_build_tools/catkin.py b/src/rosjava_build_tools/catkin.py new file mode 100644 index 0000000000000000000000000000000000000000..6a3f75bceb3de638b61f601318247ea54e9586e7 --- /dev/null +++ b/src/rosjava_build_tools/catkin.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python + +############################################################################## +# Imports +############################################################################## + +import os +import catkin_pkg.packages +import catkin_pkg.topological_order + +############################################################################## +# Constants +############################################################################## + +# packages that don't properly identify themselves as message packages (fix upstream). +message_package_whitelist = ['map_store'] + +############################################################################## +# Methods +############################################################################## + + +def has_build_depend_on_message_generation(package): + ''' + Checks for a build dependency on message generation to determine if + that package contains msgs/srvs. + + @param package : typical catkin package object + @type catkin_pkg.Package + + @return True if it is a package that contains msgs/srvs + @rtype Bool + ''' + return 'message_generation' in [d.name for d in package.build_depends] + + +def index_message_package_dependencies_from_local_environment(package_name_list=[], package_paths=None): + ''' + Returns a topologically sorted list of message packages that can + be used for sequencing builds of packages. + + @param package_name_list : sort dependencies for these packages only (defaults to all if empty) + @param package_paths : a python list of ros workspaces (defaults to ROS_PACKAGE_PATH if None is given) + @return dict mapping relative path to a catkin_pkg.Package + ''' + if package_paths is None: + package_paths = os.getenv('ROS_PACKAGE_PATH', '') + package_paths = [x for x in package_paths.split(':') if x] + all_packages = {} # mapping package name to (path, catkin_pkg.Package) tuple + message_packages = {} + # use reversed to write over any packages lower down in the overlay heirarchy + # i.e. no duplicates! + for path in reversed(package_paths): + for package_path, package in catkin_pkg.packages.find_packages(path).items(): + all_packages[package.name] = (package_path, package) + if has_build_depend_on_message_generation(package) or package.name in message_package_whitelist: + if package_name_list: + if package.name in package_name_list: + message_packages[package.name] = (package_path, package) + else: + message_packages[package.name] = (package_path, package) + # put into the correct form for sorting + # The following returns: A list of tuples containing the relative path and a ``Package`` object, + sorted_package_tuples = catkin_pkg.topological_order.topological_order_packages( + packages=dict(message_packages.values()), + whitelisted=None, + blacklisted=None, + underlay_packages=dict(all_packages.values())) + # print("%s" % [p.name for (unused_relative_path, p) in sorted_package_tuples]) + return sorted_package_tuples diff --git a/src/rosjava_build_tools/create_android_project.py b/src/rosjava_build_tools/create_android_project.py index 1f273f8c488b9865025ccf8403d540bb2e15b291..d31d2dc28d794094cb3c5a679bc9022320b41711 100644 --- a/src/rosjava_build_tools/create_android_project.py +++ b/src/rosjava_build_tools/create_android_project.py @@ -28,10 +28,10 @@ def parse_arguments(): parser.add_argument('name', nargs=1, help='The name for the package') - parser.add_argument('-s', '--sdk-version', + parser.add_argument('-t', '--target-version', action='store', - default='18.1.1', - help='Android sdk version [18.1.1]') + default='15', + help='Android sdk version [15]') parser.add_argument('-p', '--android-package-name', action='store', default='com.github.rosjava.android.pkg_name', @@ -46,27 +46,30 @@ def parse_arguments(): return args -def actually_create_android_project(package_name, sdk_version, java_package_name, is_library): +def actually_create_android_project(package_name, target_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(" Target Ver: ", console.cyan) + console.pretty_println("%s" % target_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, ] + cmd = ['android', 'create', 'lib-project', '-n', package_name, '-p', path, '-k', java_package_name, '-t', 'android-' + target_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] + cmd = ['android', 'create', 'project', '-n', package_name, '-p', path, '-k', java_package_name, '-t', 'android-' + target_version, '-a', activity_name] + print("Command: %s" % cmd) try: subprocess.check_call(cmd) + print("Command: %s" % cmd) except subprocess.CalledProcessError: + print("Error") 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')) @@ -97,7 +100,7 @@ def create_gradle_package_files(args, author, is_library, sdk_version): ''' This is almost a direct copy from catkin_create_pkg. ''' - plugin_name = "android-library" if is_library else "android" + plugin_name = "com.android.library" if is_library else "com.android.application" try: package_name = args.name[0].lower() package_path = os.path.abspath(os.path.join(os.getcwd(), package_name)) @@ -157,8 +160,8 @@ def extra_gradle_library_text(): def create_android_project(is_library=False): args = parse_arguments() - actually_create_android_project(args.name[0], args.sdk_version, args.android_package_name, is_library) - create_gradle_package_files(args, args.author, is_library, args.sdk_version) + actually_create_android_project(args.name[0], args.target_version, args.android_package_name, is_library) + create_gradle_package_files(args, args.author, is_library, args.target_version) add_to_root_gradle_settings(args.name[0]) ############################################################################## diff --git a/src/rosjava_build_tools/create_rosjava_project.py b/src/rosjava_build_tools/create_rosjava_project.py index 3acd167409713d57806371b2377e154ecedb3a85..ccbb7504486c81c14227edad1a946c19ae8b63c0 100644 --- a/src/rosjava_build_tools/create_rosjava_project.py +++ b/src/rosjava_build_tools/create_rosjava_project.py @@ -7,6 +7,7 @@ from __future__ import print_function import os +import re import sys import argparse import xml.etree.ElementTree as ElementTree @@ -46,6 +47,10 @@ def instantiate_template(template, project_name, author): return template % locals() +def instantiate_code_template(template, package_name, project_name, author): + return template % locals() + + def create_gradle_package_files(args, template_directory): ''' This is almost a direct copy from catkin_create_pkg. @@ -68,6 +73,27 @@ def create_gradle_package_files(args, template_directory): raise +def create_talker_listener_classes(project_name, template_directory, author): + path = os.path.join(os.getcwd(), project_name.lower()) + package_name = os.path.basename(os.getcwd()) + java_package_path = os.path.join(path, 'src', 'main', 'java', 'com', 'github', package_name, project_name) + utils.mkdir_p(java_package_path) + try: + for template_name in ['Talker.java', 'Listener.java']: + filename = os.path.join(java_package_path, template_name) + template = utils.read_template_file(template_directory, template_name) + contents = instantiate_code_template(template, package_name, project_name, author) + 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. @@ -126,12 +152,48 @@ def add_to_package_xml(name): package_xml.write(new_contents) +def add_tasks_to_cmake_setup(tasks): + ''' + Adds project name to build_depends in package.xml (should be same name as the ros msg package name). + ''' + for rel_path in ['.', '..']: + cmakelists_txt_path = os.path.join(os.getcwd(), rel_path, 'CMakeLists.txt') + if os.path.isfile(cmakelists_txt_path): + break + else: + cmakelists_txt_path = None + if cmakelists_txt_path is None: + console.pretty_println("\nCouldn't find the root level CMakeLists.txt - not adding to the superproject.") + return + with open(cmakelists_txt_path, 'r') as cmakelists_txt: + old_contents = cmakelists_txt.read() + result = re.search('^catkin_rosjava_setup\(.*\)', old_contents, re.MULTILINE) + if result is None: + console.pretty_println("\nCouldn't find a catkin_rosjava_setup entry in the CMakeLists.txt - not adding tasks.") + return + rosjava_setup_string = result.group(0) + gradle_tasks = set([]) + if rosjava_setup_string.find("publishMavenJavaPublicationToMavenRepository") == -1: + gradle_tasks.add("publishMavenJavaPublicationToMavenRepository") + if rosjava_setup_string.find("installApp") == -1: + gradle_tasks.add("installApp") + gradle_tasks |= set(tasks) + console.pretty_print(' File : ', console.cyan) + console.pretty_println('CMakeLists.txt (gradle task update)', console.yellow) + old_text = rosjava_setup_string + new_text = 'catkin_rosjava_setup(' + ' '.join(gradle_tasks) + ')' + new_contents = old_contents.replace(old_text, new_text) + with open(cmakelists_txt_path, 'w') as cmakelists_txt: + cmakelists_txt.write(new_contents) + + def create_dummy_java_class(project_name): path = os.path.join(os.getcwd(), project_name.lower()) - java_package_path = os.path.join(path, 'src', 'main', 'java', 'com', 'github', 'rosjava', project_name) + package_name = os.path.basename(os.getcwd()) + java_package_path = os.path.join(path, 'src', 'main', 'java', 'com', 'github', package_name, project_name) utils.mkdir_p(java_package_path) filename = os.path.join(java_package_path, 'Dude.java') - java_class = "package com.github.rosjava.%s.Dude;\n" % project_name + java_class = "package com.github.%s.%s;\n" % (package_name, project_name) java_class += "\n" java_class += "public class Dude {\n" java_class += "}\n" @@ -170,12 +232,25 @@ def create_rosjava_project_common(args, template_directory): def create_rosjava_project(): args = parse_arguments() + project_name = args.name[0] + author = args.author create_rosjava_project_common(args, 'rosjava_project') - create_dummy_java_class(args.name[0]) + create_talker_listener_classes(project_name, 'rosjava_project', author) + add_tasks_to_cmake_setup(['installApp', 'publishMavenJavaPublicationToMavenRepository']) + + +def create_rosjava_library_project(): + args = parse_arguments() + project_name = args.name[0] + create_rosjava_project_common(args, 'rosjava_library_project') + create_dummy_java_class(project_name) + add_tasks_to_cmake_setup(['publishMavenJavaPublicationToMavenRepository']) def create_rosjava_msg_project(): args = parse_arguments() + project_name = args.name[0] create_rosjava_project_common(args, 'rosjava_msg_project') add_catkin_generate_tree_command() - add_to_package_xml(args.name[0]) + add_to_package_xml(project_name) + add_tasks_to_cmake_setup(['publishMavenJavaPublicationToMavenRepository']) diff --git a/src/rosjava_build_tools/gradle/Readme.md b/src/rosjava_build_tools/gradle/Readme.md index 61decdb579464cf7b9e9972864a15e9949ea99c7..8463db03187d3688be2aa58dea5276fa236f7e4e 100644 --- a/src/rosjava_build_tools/gradle/Readme.md +++ b/src/rosjava_build_tools/gradle/Readme.md @@ -1,3 +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.7. \ No newline at end of file +It is currently the gradle wrapper supporting gradle 2.2.1 diff --git a/src/rosjava_build_tools/gradle/gradle/wrapper/gradle-wrapper.jar b/src/rosjava_build_tools/gradle/gradle/wrapper/gradle-wrapper.jar index b979729db0ad460288cfe16f07072da7b1305e93..3c7abdf12790879c06b07176de29647f77aa4129 100644 Binary files a/src/rosjava_build_tools/gradle/gradle/wrapper/gradle-wrapper.jar and b/src/rosjava_build_tools/gradle/gradle/wrapper/gradle-wrapper.jar differ diff --git a/src/rosjava_build_tools/gradle/gradle/wrapper/gradle-wrapper.properties b/src/rosjava_build_tools/gradle/gradle/wrapper/gradle-wrapper.properties index 51678041070c14df3b19d1739e6a7e48759212af..1e1b11a32ede07b97b533af91a89f6f8546bec18 100644 --- a/src/rosjava_build_tools/gradle/gradle/wrapper/gradle-wrapper.properties +++ b/src/rosjava_build_tools/gradle/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Oct 18 13:01:06 CEST 2013 +#Wed Feb 11 20:39:17 KST 2015 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=http\://services.gradle.org/distributions/gradle-1.8-bin.zip +distributionUrl=http\://services.gradle.org/distributions/gradle-2.2.1-all.zip diff --git a/src/rosjava_build_tools/release.py b/src/rosjava_build_tools/release.py index f0778dd1bb30a427c4dd113d04439bf6d13ea053..8b4435cd4b411b0ff6f7f0cb6581ce13bc1d10d6 100644 --- a/src/rosjava_build_tools/release.py +++ b/src/rosjava_build_tools/release.py @@ -4,7 +4,9 @@ # Imports ############################################################################## -from rosinstall_generator.generator import ARG_ALL_PACKAGES, generate_rosinstall, sort_rosinstall +import rosdistro +import catkin_pkg +from . import catkin ############################################################################## # Imports @@ -12,22 +14,14 @@ from rosinstall_generator.generator import ARG_ALL_PACKAGES, generate_rosinstall def scrape_for_release_message_packages(track): - try: - # Should use ROS_DISTRO here, or some passed in value. - rosinstall_data = generate_rosinstall(track, [ARG_ALL_PACKAGES], - wet_only=True, dry_only=False - ) - except RuntimeError as unused_e: - raise RuntimeError("error occured while scraping rosdistro for msg package naems and versions.") - rosinstall_data = sort_rosinstall(rosinstall_data) - #print("%s" % rosinstall_data) + url = rosdistro.get_index_url() + index = rosdistro.get_index(url) + cache = rosdistro.get_release_cache(index, 'kinetic') packages = [] - for element in rosinstall_data: - for unused_key, value in element.items(): - if "_msgs" in value['local-name'] or "_srvs" in value['local-name']: - name = value['local-name'] - # bloom version is usually of the form: 'release/hydro/zeroconf_msgs/0.2.1-0' - version = value['version'].split('/')[-1].split('-')[0] - pkg = {'name': name, 'version': version} - packages.append(pkg) + for package_name, package_string in cache.package_xmls.iteritems(): + package = catkin_pkg.package.parse_package_string(package_string) + #print(" Name: %s" % package_name) + #print(" Buildtool Depends %s" % package.build) + if catkin.has_build_depend_on_message_generation(package): + packages.append({'name': package_name, 'version': package.version}) return packages diff --git a/src/rosjava_build_tools/templates/android_package/CMakeLists.txt.in b/src/rosjava_build_tools/templates/android_package/CMakeLists.txt.in index 46f3c06b34be0ff13066820851c4b13267832cd2..00803f3a5fdb45d50e128c2ecc055cdf77229010 100644 --- a/src/rosjava_build_tools/templates/android_package/CMakeLists.txt.in +++ b/src/rosjava_build_tools/templates/android_package/CMakeLists.txt.in @@ -11,6 +11,7 @@ project(%(repo_name)s) find_package(catkin REQUIRED rosjava_build_tools) # Set the gradle targets you want catkin's make to run by default +# e.g. usually catkin_android_setup(assembleRelease uploadArchives) catkin_android_setup(assembleRelease uploadArchives) catkin_package() @@ -19,8 +20,6 @@ catkin_package() # Installation ############################################################################## -# If you are deploying android libraries (.aar's) uncomment this and -# change this to match the maven group name you have specified in the -# allprojects closure the root build.gradle -#install(DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_GLOBAL_MAVEN_DESTINATION}/com/github/rosjava/${PROJECT_NAME}/ -# DESTINATION ${CATKIN_GLOBAL_MAVEN_DESTINATION}/com/github/rosjava/${PROJECT_NAME}) +# Deploy android libraries (.aar's) and applications (.apk's) +install(DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_GLOBAL_MAVEN_DESTINATION}/com/github/rosjava/${PROJECT_NAME}/ + DESTINATION ${CATKIN_GLOBAL_MAVEN_DESTINATION}/com/github/rosjava/${PROJECT_NAME}/) diff --git a/src/rosjava_build_tools/templates/android_package/build.gradle.in b/src/rosjava_build_tools/templates/android_package/build.gradle.in index 3ca8de49540720b5c21c8028f23892a0730b0f25..951a6d4c79d0be14ee9aae8000ec1cdf45d4cd90 100644 --- a/src/rosjava_build_tools/templates/android_package/build.gradle.in +++ b/src/rosjava_build_tools/templates/android_package/build.gradle.in @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 %(author)s + * Copyright (C) 2014 %(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 @@ -15,26 +15,11 @@ */ task wrapper(type: Wrapper) { - gradleVersion = '1.8' + gradleVersion = '2.2.1' } buildscript { - def rosMavenPath = "$System.env.ROS_MAVEN_PATH".split(':').collect { 'file://' + it } - def rosMavenRepository = "$System.env.ROS_MAVEN_REPOSITORY" - repositories { - rosMavenPath.each { p -> - maven { - url p - } - } - mavenLocal() - maven { - url rosMavenRepository - } - } - dependencies { - classpath group: 'org.ros.rosjava_bootstrap', name: 'gradle_plugins', version: '[0.2,0.3)' - } + apply from: "https://github.com/rosjava/android_core/raw/kinetic/buildscript.gradle" } apply plugin: 'catkin' @@ -47,7 +32,32 @@ allprojects { } subprojects { - /* See https://github.com/rosjava/rosjava_bootstrap (look for gradle_plugins) - to see what is going on under the hood. */ + /* + * The android plugin configures a few things: + * + * - local deployment repository : where it dumps the jars and packaged artifacts) + * - local maven repositories : where it finds your locally installed/built artifacts) + * - external maven repositories : where it goes looking if it can't find dependencies locally + * - android build tools version : which version we use across the board + * + * To modify, or add repos to the default external maven repositories list, pull request against this code: + * + * https://github.com/rosjava/rosjava_bootstrap/blob/kinetic/gradle_plugins/src/main/groovy/org/ros/gradle_plugins/RosPlugin.groovy#L31 + * + * To modify the build tools version, pull request against this code: + * + * https://github.com/rosjava/rosjava_bootstrap/blob/kinetic/gradle_plugins/src/main/groovy/org/ros/gradle_plugins/RosAndroid.groovy#L14 + */ apply plugin: 'ros-android' + + afterEvaluate { project -> + android { + // Exclude a few files that are duplicated across our dependencies and + // prevent packaging Android applications. + packagingOptions { + exclude "META-INF/LICENSE.txt" + exclude "META-INF/NOTICE.txt" + } + } + } } diff --git a/src/rosjava_build_tools/templates/android_package/settings.gradle b/src/rosjava_build_tools/templates/android_package/settings.gradle index 00841924d83ea9d3bf07fc35858bdce88e7c4733..f8618db1853eb6742ea75293e5b575c396dc40ed 100644 --- a/src/rosjava_build_tools/templates/android_package/settings.gradle +++ b/src/rosjava_build_tools/templates/android_package/settings.gradle @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 %(author)s + * Copyright (C) 2014 %(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 diff --git a/src/rosjava_build_tools/templates/android_project/build.gradle.in b/src/rosjava_build_tools/templates/android_project/build.gradle.in index b465ae2510816cdc960afc25fca1f4fbaa60c4c3..ab7998e6789ab3bda3dbcf59aacea4966f616f1e 100644 --- a/src/rosjava_build_tools/templates/android_project/build.gradle.in +++ b/src/rosjava_build_tools/templates/android_project/build.gradle.in @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 %(author)s. + * Copyright (C) 2014 %(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 @@ -14,29 +14,37 @@ * the License. */ -/* - Examples of +/* + Examples of 1) dependencies from another project in this gradle stack. 2,3) open ranged dependencies from a maven repository. - + It's a good idea to use open ranges on to save continually updating these references, but it is recommended - to restrict this to the patch version number (e.g. [0.2,0.3) will - get the latest 0.2.x version) to avoid unknowingly + to restrict this to the patch version number (e.g. [0.3,0.4) will + get the latest 0.3.x version) to avoid unknowingly having api breaking changes usually associated with minor and major version number changes. */ -/* +/* dependencies { compile project(':local_android_library_dependency') - compile 'org.ros.android_core:android_10:[0.2,0.3)' - compile 'com.github.ros_java.android_extras:gingerbread:[0.2,0.3)' + compile 'org.ros.android_core:android_10:[0.3,0.4)' + compile 'org.ros.android_core:android_15:[0.3,0.4)' + compile 'com.github.rosjava.android_extras:gingerbread:[0.3,0.4)' + compile 'org.ros.rosjava_messages:tf2_msgs:[0.5,0.6)' } */ apply plugin: '%(plugin_name)s' android { - compileSdkVersion %(sdk_version)s + compileSdkVersion %(sdk_version)s + defaultConfig { + minSdkVersion %(sdk_version)s + targetSdkVersion %(sdk_version)s + versionCode 1 + versionName "1.0" + } } - + diff --git a/src/rosjava_build_tools/templates/rosjava_library_project/build.gradle.in b/src/rosjava_build_tools/templates/rosjava_library_project/build.gradle.in new file mode 100644 index 0000000000000000000000000000000000000000..16f77ab77c16f6a3994a1d945abe4a6be5fe7bdb --- /dev/null +++ b/src/rosjava_build_tools/templates/rosjava_library_project/build.gradle.in @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2014 %(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. + */ + +/* + Dependencies can be on external maven artifacts (such as rosjava_core + here) or on sibling subprojects. Fpr external maven artifact dependencies + it's convenient to use an open ranged dependency, but restrict it to + cover the patch version only to avoid breakages due to api changes + which usually occur on minor and major version numbers. +*/ + +dependencies { + /* Example of an external maven artifact dependency */ + /* compile 'org.ros.rosjava_core:rosjava:[0.2,)' */ + /* Example of a local subproject dependency */ + /* compile project(':sibling_gradle_project') */ +} + diff --git a/src/rosjava_build_tools/templates/rosjava_msg_project/build.gradle.in b/src/rosjava_build_tools/templates/rosjava_msg_project/build.gradle.in index d2efc9c870c6dbb92279b411b10a629c81b1911c..5d4f66a0433ac2f74ec89af5bfd9a2bd39ae60ff 100644 --- a/src/rosjava_build_tools/templates/rosjava_msg_project/build.gradle.in +++ b/src/rosjava_build_tools/templates/rosjava_msg_project/build.gradle.in @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 %(author)s. + * Copyright (C) 2014 %(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 @@ -15,8 +15,7 @@ */ try { - project.catkin.tree.pkgs['%(project_name)s'].generateUnofficialMessageArtifact(project) + project.catkin.tree.generateMessageArtifact(project, '%(project_name)s') } catch (NullPointerException e) { println("Couldn't find %(project_name)s on the ROS_PACKAGE_PATH") } - diff --git a/src/rosjava_build_tools/templates/rosjava_package/CMakeLists.txt.in b/src/rosjava_build_tools/templates/rosjava_package/CMakeLists.txt.in index 651b6a0b5baa158951c72a37eb0238d98f0b5f3d..78952fc9aadeb488a0543b6bfc3cdd87811d8682 100644 --- a/src/rosjava_build_tools/templates/rosjava_package/CMakeLists.txt.in +++ b/src/rosjava_build_tools/templates/rosjava_package/CMakeLists.txt.in @@ -10,15 +10,20 @@ project(%(repo_name)s) ############################################################################## find_package(catkin REQUIRED rosjava_build_tools) -# Set the gradle targets you want catkin's make to run by default -catkin_android_setup(uploadArchives) + +# Set the gradle targets you want catkin's make to run by default, e.g. +# catkin_rosjava_setup(installApp) +# Note that the catkin_create_rosjava_xxx scripts will usually automatically +# add tasks to this for you when you create subprojects. +catkin_rosjava_setup() + catkin_package() ############################################################################## # Installation ############################################################################## -# Change this to match the maven group name you have specified in the +# Change this to match the maven group name you have specified in the # allprojects closure the root build.gradle -install(DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_GLOBAL_MAVEN_DESTINATION}/com/github/rosjava/${PROJECT_NAME}/ +install(DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_GLOBAL_MAVEN_DESTINATION}/com/github/rosjava/${PROJECT_NAME}/ DESTINATION ${CATKIN_GLOBAL_MAVEN_DESTINATION}/com/github/rosjava/${PROJECT_NAME}) diff --git a/src/rosjava_build_tools/templates/rosjava_package/build.gradle.in b/src/rosjava_build_tools/templates/rosjava_package/build.gradle.in index d1237536fa73bbcaba1b725e4637f9ede8ba9b45..f709c4a96d1284e2489100dbc1be6dcaeacb88f0 100644 --- a/src/rosjava_build_tools/templates/rosjava_package/build.gradle.in +++ b/src/rosjava_build_tools/templates/rosjava_package/build.gradle.in @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 %(author)s + * Copyright (C) 2014 %(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 @@ -15,26 +15,11 @@ */ task wrapper(type: Wrapper) { - gradleVersion = '1.8' + gradleVersion = '2.2.1' } buildscript { - def rosMavenPath = "$System.env.ROS_MAVEN_PATH".split(':').collect { 'file://' + it } - def rosMavenRepository = "$System.env.ROS_MAVEN_REPOSITORY" - repositories { - rosMavenPath.each { p -> - maven { - url p - } - } - mavenLocal() - maven { - url rosMavenRepository - } - } - dependencies { - classpath group: 'org.ros.rosjava_bootstrap', name: 'gradle_plugins', version: '[0.2,0.3)' - } + apply from: "https://github.com/rosjava/rosjava_bootstrap/raw/kinetic/buildscript.gradle" } apply plugin: 'catkin' @@ -51,16 +36,34 @@ allprojects { subprojects { /* - See https://github.com/rosjava/rosjava_bootstrap (look for gradle_plugins) - to see what is going on under the hood. - */ - apply plugin: 'ros' + * The ros-java plugin configures a few things: + * + * - local deployment repository : where it dumps the jars and packaged artifacts) + * - local maven repositories : where it finds your locally installed/built artifacts) + * - external maven repositories : where it goes looking if it can't find dependencies locally + * + * To modify, or add repos to the default external maven repositories list, pull request against this code: + * + * https://github.com/rosjava/rosjava_bootstrap/blob/kinetic/gradle_plugins/src/main/groovy/org/ros/gradle_plugins/RosPlugin.groovy#L31 + */ + apply plugin: "ros-java" + /* + * Some IDE support if you use it. + */ + /* apply plugin: "eclipse" */ + /* apply plugin: "idea" */ } /* Some useful tasks: + install: deploys jar's to MavenLocal() (i.e. ~/.m2/repository) uploadArchives : deploys jar's to devel/share/maven installApp : assembles java apps in the _subproject_/build directories. + + Note that these are dependent on the type of project (e.g. installApp is only valid for + java binary subprojects, while publishMavenJav... is only added once a subproject is included. + If you're using catkin_make, this is not important, since it will use the task list specified + in CMakeLists.txt */ -defaultTasks 'install' +defaultTasks 'tasks' diff --git a/src/rosjava_build_tools/templates/rosjava_project/Listener.java.in b/src/rosjava_build_tools/templates/rosjava_project/Listener.java.in new file mode 100644 index 0000000000000000000000000000000000000000..29bf303e2c02b6274304f7cec94074ef59e4117f --- /dev/null +++ b/src/rosjava_build_tools/templates/rosjava_project/Listener.java.in @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2014 %(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. + */ + +package com.github.rosjava.%(package_name)s.%(project_name)s; + +import org.apache.commons.logging.Log; +import org.ros.message.MessageListener; +import org.ros.namespace.GraphName; +import org.ros.node.AbstractNodeMain; +import org.ros.node.ConnectedNode; +import org.ros.node.NodeMain; +import org.ros.node.topic.Subscriber; + +/** + * A simple {@link Subscriber} {@link NodeMain}. + */ +public class Listener extends AbstractNodeMain { + + @Override + public GraphName getDefaultNodeName() { + return GraphName.of("rosjava/listener"); + } + + @Override + public void onStart(ConnectedNode connectedNode) { + final Log log = connectedNode.getLog(); + Subscriber<std_msgs.String> subscriber = connectedNode.newSubscriber("chatter", std_msgs.String._TYPE); + subscriber.addMessageListener(new MessageListener<std_msgs.String>() { + @Override + public void onNewMessage(std_msgs.String message) { + log.info("I heard: \"" + message.getData() + "\""); + } + }); + } +} diff --git a/src/rosjava_build_tools/templates/rosjava_project/Talker.java.in b/src/rosjava_build_tools/templates/rosjava_project/Talker.java.in new file mode 100644 index 0000000000000000000000000000000000000000..1ff54bbf758e1bba247083b724b9d07db99b6cd4 --- /dev/null +++ b/src/rosjava_build_tools/templates/rosjava_project/Talker.java.in @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2014 %(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. + */ + +package com.github.rosjava.%(package_name)s.%(project_name)s; + +import org.ros.concurrent.CancellableLoop; +import org.ros.namespace.GraphName; +import org.ros.node.AbstractNodeMain; +import org.ros.node.ConnectedNode; +import org.ros.node.NodeMain; +import org.ros.node.topic.Publisher; + +/** + * A simple {@link Publisher} {@link NodeMain}. + */ +public class Talker extends AbstractNodeMain { + + @Override + public GraphName getDefaultNodeName() { + return GraphName.of("rosjava/talker"); + } + + @Override + public void onStart(final ConnectedNode connectedNode) { + final Publisher<std_msgs.String> publisher = + connectedNode.newPublisher("chatter", std_msgs.String._TYPE); + // This CancellableLoop will be canceled automatically when the node shuts + // down. + connectedNode.executeCancellableLoop(new CancellableLoop() { + private int sequenceNumber; + + @Override + protected void setup() { + sequenceNumber = 0; + } + + @Override + protected void loop() throws InterruptedException { + std_msgs.String str = publisher.newMessage(); + str.setData("Hello world! " + sequenceNumber); + publisher.publish(str); + sequenceNumber++; + Thread.sleep(1000); + } + }); + } +} diff --git a/src/rosjava_build_tools/templates/rosjava_project/build.gradle.in b/src/rosjava_build_tools/templates/rosjava_project/build.gradle.in index b1a1bea4a041d25d46d0e2c904203d369cfaf651..6fbec4f1d7e0f5cf4f6efaa3ae0c7466c10a5d8e 100644 --- a/src/rosjava_build_tools/templates/rosjava_project/build.gradle.in +++ b/src/rosjava_build_tools/templates/rosjava_project/build.gradle.in @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 %(author)s. + * Copyright (C) 2014 %(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 @@ -14,23 +14,29 @@ * the License. */ -/* - Examples of +/* This plugin is necessary for creating installApp tasks (i.e. executables) */ +apply plugin: 'application' +mainClassName = 'org.ros.RosRun' + +/* + Examples of 1) dependencies from another project in this gradle stack. 2,3) open ranged dependencies from a maven repository. - - It's a good idea to use open ranges on to + + Dependencies can be on external maven artifacts (such as rosjava_core + here) or on sibling subprojects. For rosjava maven artifact dependencies + it is a good idea to use open ranges on to save continually updating these references, but it is recommended - to restrict this to the patch version number (e.g. [0.2,0.3) will - get the latest 0.2.x version) to avoid unknowingly + to restrict this to the patch version number (e.g. [0.3,0.4) will + get the latest 0.3.x version) to avoid unknowingly having api breaking changes usually associated with minor and major version number changes. */ -/* + dependencies { - compile project(':local_android_library_dependency') - compile 'org.ros.rosjava_core:rosjava:[0.2,0.3)' - compile 'com.github.rosjava.rosjava_extras:hokuyo:[0.2,0.3)' + /* An external maven artifact dependency */ + compile 'org.ros.rosjava_core:rosjava:[0.3,0.4)' + /* Example of a local subproject dependency */ + /* compile project(':sibling_gradle_project') */ } -*/