Skip to content
Snippets Groups Projects
Commit abf2ac62 authored by Daniel Stonier's avatar Daniel Stonier
Browse files

catkin package creation moved to create repo script.

parent da289d63
No related branches found
No related tags found
No related merge requests found
......@@ -6,7 +6,7 @@ from catkin_pkg.python_setup import generate_distutils_setup
d = generate_distutils_setup(
packages=['rosjava_tools'],
package_dir={'': 'src'},
scripts=['scripts/catkin_init_android_repo',
scripts=['scripts/catkin_create_android_repo',
'scripts/catkin_create_android_pkg',
'scripts/catkin_create_android_library_pkg'
],
......
......@@ -19,8 +19,6 @@ import shutil
# local imports
import utils
import console
import catkin_pkg
from catkin_pkg.package_templates import create_package_xml, PackageTemplate
##############################################################################
# Methods
......@@ -34,29 +32,6 @@ def parse_arguments():
parser.add_argument('name',
nargs=1,
help='The name for the package')
parser.add_argument('dependencies',
nargs='*',
help='Android library dependencies')
# need to move all this catkin stuff to android_init_repo
# 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',
......@@ -65,11 +40,13 @@ def parse_arguments():
action='store',
default='com.github.rosjava.android.pkg_name',
help='Android package name (e.g. com.github.rosjava.android.pkg_name)')
parser.add_argument('-a', '--author',
action='store',
default=utils.author_name(),
help='A single author, may be used multiple times')
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
......@@ -120,49 +97,20 @@ def instantiate_template(template, package_name, author, plugin_name, sdk_versio
return template % locals()
def create_catkin_package_files(args, is_library, sdk_version):
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"
try:
package_name = args.name[0].lower()
# Also should move to init repo instead of here.
# 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))
console.pretty_println("\nCreating gradle files", console.bold)
# try:
# filename = os.path.join(package_path, 'package.xml')
# 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)
contents = instantiate_template(template, package_name, author, plugin_name, sdk_version)
print("Template")
try:
f = open(filename, 'w')
f.write(contents)
......@@ -195,16 +143,13 @@ def add_to_root_gradle_settings(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)
create_gradle_package_files(args, args.author, 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')
......@@ -216,99 +161,3 @@ def read_template_file(filename):
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
......@@ -12,6 +12,8 @@ import os
import sys
import argparse
import subprocess
import catkin_pkg
from catkin_pkg.package_templates import create_package_xml, PackageTemplate
# local imports
import utils
......@@ -27,7 +29,36 @@ def parse_arguments():
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).')
parser.add_argument('dependencies',
nargs='*',
help='Dependency list')
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',
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')
args = parser.parse_args(argv)
# if not args.author:
# args.author = []
# args.author.append(utils.author_name)
# if not args.maintainer:
# args.maintainer = []
# args.maintainer.append(catkin_pkg.package.Person(utils.author_name))
# else:
# args.maintainer = []
# args.maintainer.append(catkin_pkg.package.Person(utils.author_name))
return args
......@@ -50,6 +81,7 @@ def instantiate_template(template, repo_name, author):
def get_templates():
template_dir = os.path.join(os.path.dirname(__file__), 'templates', 'init_repo')
templates = {}
templates['CMakeLists.txt'] = read_template(os.path.join(template_dir, 'CMakeLists.txt.in'))
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
......@@ -81,6 +113,42 @@ def create_gradle_wrapper(repo_path):
except subprocess.CalledProcessError:
raise subprocess.CalledProcessError("failed to create the gradle wrapper.")
def create_catkin_package_files(package_name, package_path, args):
'''
This is almost a direct copy from catkin_create_pkg.
'''
try:
build_depends = []
if 'rosjava_tools' not in args.dependencies:
build_depends.append(catkin_pkg.package.Dependency('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
distro_version = utils.distro_version()
package_xml = create_package_xml(package_template=package_template, rosdistro=distro_version)
try:
filename = os.path.join(package_path, 'package.xml')
f = open(filename, 'w')
f.write(package_xml)
console.pretty_print('Created repo file: ', console.cyan)
console.pretty_println('%s' % filename, console.yellow)
finally:
f.close()
except Exception:
raise
##############################################################################
# Methods acting on classes
##############################################################################
......@@ -90,7 +158,9 @@ def init_android_repo():
args = parse_arguments()
try:
repo_path = utils.validate_path(args.path)
repo_name = os.path.basename(os.path.normpath(repo_path)).lower()
populate_repo(repo_path)
create_catkin_package_files(repo_name, repo_path, args)
create_gradle_wrapper(repo_path)
except Exception:
raise
<?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>
......@@ -3,7 +3,7 @@
##############################################################################
cmake_minimum_required(VERSION 2.8.3)
project(%(package_name)s)
project(%(repo_name)s)
##############################################################################
# Catkin
......
......@@ -9,14 +9,28 @@
##############################################################################
import os
import sys
import errno
import pwd
import console
##############################################################################
# Methods
##############################################################################
def distro_version():
'''
This code is pulled from rosversion, which unfortunately has it buried inside
the script, not in the python module.
'''
if 'ROS_DISTRO' in os.environ:
return os.environ['ROS_DISTRO']
else:
console.error("could not determine the rosdistro")
sys.exit(1)
def which(program):
'''
Looks for program in the environment.
......@@ -79,7 +93,8 @@ def mkdir_p(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'))
else:
raise
def validate_path(path):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment