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

remove deprecated message artifact generation, merge damons plugin upgrades -...

remove deprecated message artifact generation, merge damons plugin upgrades - use buildscripts and some cleanups.
parent edf5fb99
No related branches found
No related tags found
No related merge requests found
...@@ -4,6 +4,7 @@ import org.gradle.api.Project; ...@@ -4,6 +4,7 @@ import org.gradle.api.Project;
import org.gradle.api.Plugin; import org.gradle.api.Plugin;
import org.gradle.api.Task; import org.gradle.api.Task;
import org.gradle.api.tasks.JavaExec import org.gradle.api.tasks.JavaExec
import org.gradle.api.tasks.StopActionException
import org.gradle.api.*; import org.gradle.api.*;
...@@ -25,7 +26,7 @@ import org.gradle.api.*; ...@@ -25,7 +26,7 @@ import org.gradle.api.*;
* println d * println d
* } * }
* // filtered list of *_msg dependencies. * // filtered list of *_msg dependencies.
* pkg.messageDependencies().each { d -> * pkg.getMessageDependencies().each { d ->
* println d * println d
* } * }
* } * }
...@@ -53,7 +54,7 @@ class CatkinPlugin implements Plugin<Project> { ...@@ -53,7 +54,7 @@ class CatkinPlugin implements Plugin<Project> {
packageXml = project.file('package.xml') packageXml = project.file('package.xml')
} }
if (packageXml != null) { if (packageXml != null) {
project.catkin.pkg = new CatkinPackage(packageXml) project.catkin.pkg = new CatkinPackage(project, packageXml)
} }
setTasks() setTasks()
} }
...@@ -73,37 +74,40 @@ class CatkinPluginExtension { ...@@ -73,37 +74,40 @@ class CatkinPluginExtension {
List<String> workspaces List<String> workspaces
CatkinPackages tree CatkinPackages tree
} }
class CatkinPackages { class CatkinPackages {
def Map<String, CatkinPackage> pkgs
def List<String> workspaces
def Project project
def CatkinPackages(Project project, List<String> workspaces) { Map<String, CatkinPackage> pkgs
List<String> workspaces
Project project
CatkinPackages(Project project, List<String> workspaces) {
this.project = project this.project = project
this.workspaces = workspaces this.workspaces = workspaces
this.pkgs = [:] pkgs = [:]
} }
def generate() { void generate() {
if ( this.pkgs.size() == 0 ) { if (pkgs.size() == 0) {
this.workspaces.each { workspace -> workspaces.each { workspace ->
def manifestTree = project.fileTree(dir: workspace, include: '**/package.xml') def manifestTree = project.fileTree(dir: workspace,
include: "**/package.xml")
manifestTree.each { file -> manifestTree.each { file ->
def pkg = new CatkinPackage(file) def pkg = new CatkinPackage(file)
if(this.pkgs.containsKey(pkg.name)) { if(this.pkgs.containsKey(pkg.name)) {
if(this.pkgs[pkg.name].version < pkg.version) { if(this.pkgs[pkg.name].version < pkg.version) {
println("Catkin generate tree: replacing older version of " + pkg.name + "[" + this.pkgs[pkg.name].version + "->" + pkg.version + "]") println("Catkin generate tree: replacing older version of " + pkg.name + "[" + this.pkgs[pkg.name].version + "->" + pkg.version + "]")
this.pkgs[pkg.name] = pkg pkgs[pkg.name] = pkg
} }
} else { } else {
this.pkgs.put(pkg.name, pkg) pkgs.put(pkg.name, pkg)
} }
} }
} }
} }
} }
def isMessagePackage(String package_name) { Boolean isMessagePackage(String package_name) {
def pkg def pkg
def result = false def result = false
try { try {
...@@ -122,149 +126,70 @@ class CatkinPackages { ...@@ -122,149 +126,70 @@ class CatkinPackages {
return result return result
} }
def void generateMessageArtifact(Project p, String package_name) { void generateMessageArtifact(Project project, String package_name) {
def pkg = this.pkgs[package_name] def pkg = this.pkgs[package_name]
p.version = pkg.version project.version = pkg.version
/* println("Artifact: " + pkg.name + "-" + pkg.version) */ /* println("Artifact: " + pkg.name + "-" + pkg.version) */
p.dependencies.add("compile", 'org.ros.rosjava_bootstrap:message_generation:[0.1,0.2)') project.dependencies.add("compile", 'org.ros.rosjava_bootstrap:message_generation:[0.2,0.3)')
List<String> messageDependencies = [] Set<String> messageDependencies = pkg.getMessageDependencies()
pkg.dependencies.each { d ->
/* println(" Dependency: " + d) */
if ( this.isMessagePackage(d) ) {
messageDependencies.add(d)
/* println(" Msg Pkg: yes") */
} else {
/* println(" Msg Pkg: no") */
}
}
messageDependencies.each { d -> messageDependencies.each { d ->
if ( p.getParent().getChildProjects().containsKey(d) ) { if ( project.getParent().getChildProjects().containsKey(d) ) {
/* println(" Internal: " + d) */ /* println(" Internal: " + d) */
p.dependencies.add("compile", p.dependencies.project(path: ':' + d)) project.dependencies.add("compile", project.dependencies.project(path: ':' + d))
} else { } else {
/* println(" External: " + d) */ /* println(" External: " + d) */
p.dependencies.add("compile", 'org.ros.rosjava_messages:' + d + ':[0.0,)') project.dependencies.add("compile", 'org.ros.rosjava_messages:' + d + ':[0.0,)')
} }
} }
def generatedSourcesDir = "${p.buildDir}/generated-src" def generatedSourcesDir = "${project.buildDir}/generated-src"
def generateSourcesTask = p.tasks.create("generateSources", JavaExec) def generateSourcesTask = project.tasks.create("generateSources", JavaExec)
generateSourcesTask.description = "Generate sources for " + pkg.name generateSourcesTask.description = "Generate sources for " + pkg.name
generateSourcesTask.outputs.dir(p.file(generatedSourcesDir)) generateSourcesTask.outputs.dir(project.file(generatedSourcesDir))
/* generateSourcesTask.args = new ArrayList<String>([generatedSourcesDir, pkg.name]) */ /* generateSourcesTask.args = new ArrayList<String>([generatedSourcesDir, pkg.name]) */
generateSourcesTask.args = new ArrayList<String>([generatedSourcesDir, '--package-path=' + pkg.directory, pkg.name]) generateSourcesTask.args = new ArrayList<String>([generatedSourcesDir, '--package-path=' + pkg.directory, pkg.name])
generateSourcesTask.classpath = p.configurations.runtime generateSourcesTask.classpath = project.configurations.runtime
generateSourcesTask.main = 'org.ros.internal.message.GenerateInterfaces' generateSourcesTask.main = "org.ros.internal.message.GenerateInterfaces"
p.tasks.compileJava.source generateSourcesTask.outputs.files project.tasks.compileJava.source generateSourcesTask.outputs.files
} }
} }
class CatkinPackage { class CatkinPackage {
def name Project project
def version String name
def dependencies String version
def directory Set<String> dependencies
String directory
def CatkinPackage(File packageXmlFilename) { CatkinPackage(Project project, File packageXmlFilename) {
this.project = project
/* println "Loading " + packageXmlFilename */
def packageXml = new XmlParser().parse(packageXmlFilename) def packageXml = new XmlParser().parse(packageXmlFilename)
directory = packageXmlFilename.parent directory = packageXmlFilename.parent
name = packageXml.name.text() name = packageXml.name.text()
version = packageXml.version.text() version = packageXml.version.text()
dependencies = [] dependencies = packageXml.build_depend.collect{ it.text() }
packageXml.build_depend.each { d ->
dependencies.add(d.text())
}
}
def String toString() {
def out = new String()
out += name + "\n"
out += " version: " + version + "\n"
out += " dependencies:" + "\n"
dependencies.each { d ->
out += " " + d + "\n"
}
return out
}
/*
* Find and annotate a list of package package dependencies.
* Useful for message artifact generation).
*
* Depracated, but kept around for legacy purposes, remove in igloo
*
* @return List<String> : dependencies (package name strings)
*/
def List<String> messageDependencies() {
List<String> msgDependencies = []
dependencies.each { d ->
if ( d.contains("_msgs") ) {
msgDependencies.add(d)
}
}
return msgDependencies
} }
/* Depracated, but kept around for legacy purposes, remove in igloo */ String toString() { "${name} ${version} ${dependencies}" }
def void generateMessageArtifact(Project p) {
p.version = version
p.dependencies.add("compile", 'org.ros.rosjava_bootstrap:message_generation:[0.1,0.2)')
messageDependencies().each { d ->
p.dependencies.add("compile", p.dependencies.project(path: ':' + d))
}
def generatedSourcesDir = "${p.buildDir}/generated-src"
def generateSourcesTask = p.tasks.create("generateSources", JavaExec)
generateSourcesTask.description = "Generate sources for " + name
generateSourcesTask.outputs.dir(p.file(generatedSourcesDir))
generateSourcesTask.args = new ArrayList<String>([generatedSourcesDir, name])
generateSourcesTask.classpath = p.configurations.runtime
generateSourcesTask.main = 'org.ros.internal.message.GenerateInterfaces'
p.tasks.compileJava.source generateSourcesTask.outputs.files
}
/* Depracated, but kept around for legacy purposes, remove in igloo */ Set<String> getTransitiveDependencies(Collection<String> dependencies) {
def void generateUnofficialMessageArtifact(Project p) { Set<String> result = [];
/* Couple of constraints here: dependencies.each {
1) maven group forced to org.ros.rosjava_messages to that all message artifact if (project.catkin.tree.pkgs.containsKey(it)) {
dependencies are easily found. result.add(it)
2) Open ended dependency range (takes the latest in ROS_PACKAGE_PATH) since we result.addAll(getTransitiveDependencies(
don't know the artifact versions the user really wants. project.catkin.tree.pkgs[it].dependencies))
*/
p.version = version
p.group = 'org.ros.rosjava_messages'
p.dependencies.add("compile", 'org.ros.rosjava_bootstrap:message_generation:[0.1,0.2)')
messageDependencies().each { d ->
if ( p.getParent().getChildProjects().containsKey(d) ) {
p.dependencies.add("compile", p.dependencies.project(path: ':' + d))
} else {
p.dependencies.add("compile", 'org.ros.rosjava_messages:' + d + ':[0.1,)')
} }
} }
def generatedSourcesDir = "${p.buildDir}/generated-src" return result
def generateSourcesTask = p.tasks.create("generateSources", JavaExec)
generateSourcesTask.description = "Generate sources for " + name
generateSourcesTask.outputs.dir(p.file(generatedSourcesDir))
generateSourcesTask.args = new ArrayList<String>([generatedSourcesDir, '--package-path=' + directory, name])
generateSourcesTask.classpath = p.configurations.runtime
generateSourcesTask.main = 'org.ros.internal.message.GenerateInterfaces'
p.tasks.compileJava.source generateSourcesTask.outputs.files
} }
/* Set<String> getMessageDependencies() {
* Hack to work around for rosjava_test_msgs - look in a subfolder for the getTransitiveDependencies(dependencies).findAll {
* msgs and name the artifact by the subfolder name/version. project.catkin.tree.pkgs.containsKey(it) &&
*/ project.catkin.tree.pkgs[it].dependencies.contains("message_generation")
def void generateMessageArtifactInSubFolder(Project p, String subfolderName, List<String> dependencies) { } as Set
// p.version = version use the subfolder's project version
p.dependencies.add("compile", 'org.ros.rosjava_bootstrap:message_generation:[0.1,0.2)')
dependencies.each { d ->
p.dependencies.add("compile", p.dependencies.project(path: ':' + d))
}
def generatedSourcesDir = "${p.buildDir}/generated-src"
def generateSourcesTask = p.tasks.create("generateSources", JavaExec)
generateSourcesTask.description = "Generate sources for " + name + "/" + subfolderName
generateSourcesTask.outputs.dir(p.file(generatedSourcesDir))
generateSourcesTask.args = new ArrayList<String>([generatedSourcesDir, subfolderName])
generateSourcesTask.classpath = p.configurations.runtime
generateSourcesTask.main = 'org.ros.internal.message.GenerateInterfaces'
p.tasks.compileJava.source generateSourcesTask.outputs.files
} }
} }
...@@ -4,35 +4,20 @@ import org.gradle.api.Project ...@@ -4,35 +4,20 @@ import org.gradle.api.Project
import org.gradle.api.Plugin import org.gradle.api.Plugin
import java.util.HashMap import java.util.HashMap
/* /**
* Configures java for the ros-android build environment. Pretty elementary right now, * Configures ROS on Android build environment.
* just applies the java plugin and defines the jdk compatibility level.
*/ */
class RosAndroidPlugin implements Plugin<Project> { class RosAndroidPlugin implements Plugin<Project> {
Project project void apply(Project project) {
project.apply plugin: "ros"
def void apply(Project project) {
this.project = project
if (!project.plugins.findPlugin('ros')) {
project.apply(plugin: 'ros')
}
project.extensions.create("rosandroid", RosAndroidPluginExtension) project.extensions.create("rosandroid", RosAndroidPluginExtension)
project.rosandroid.buildToolsVersion = "19.1.0" project.rosandroid.buildToolsVersion = "19.1.0"
/*********************************************************************
* Find the android plugin
*********************************************************************/
project.buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.11.+'
}
}
/********************************************************************** /**********************************************************************
* Publishing - not we're using old style here. Upgrade to maven-publish * Publishing - not we're using old style here. Upgrade to maven-publish
* once they have support: * once they have support:
* https://github.com/rosjava/rosjava_bootstrap/issues/1 * https://github.com/rosjava/rosjava_bootstrap/issues/1
* This is specifically for releasing and working in a ros workspace.
**********************************************************************/ **********************************************************************/
project.uploadArchives { project.uploadArchives {
repositories.mavenDeployer { repositories.mavenDeployer {
...@@ -43,11 +28,9 @@ class RosAndroidPlugin implements Plugin<Project> { ...@@ -43,11 +28,9 @@ class RosAndroidPlugin implements Plugin<Project> {
* Our maven repo 3rd parties are currently incompatible with android * Our maven repo 3rd parties are currently incompatible with android
* junit especially could use a look at - find a compatible version! * junit especially could use a look at - find a compatible version!
**********************************************************************/ **********************************************************************/
project.configurations.create('compile') project.configurations.maybeCreate("compile")
def excludes = new HashMap<String, String>() project.configurations.compile.exclude "group": "junit"
excludes.put('group', 'junit') project.configurations.compile.exclude "group": "xml-apis"
excludes.put('group', 'xml-apis')
project.configurations['compile'].exclude(excludes)
/********************************************************************** /**********************************************************************
* Delay android plugin configuration because that will depend on * Delay android plugin configuration because that will depend on
* the subproject's late loading of android or android-library plugin. * the subproject's late loading of android or android-library plugin.
...@@ -57,7 +40,6 @@ class RosAndroidPlugin implements Plugin<Project> { ...@@ -57,7 +40,6 @@ class RosAndroidPlugin implements Plugin<Project> {
buildToolsVersion project.rosandroid.buildToolsVersion buildToolsVersion project.rosandroid.buildToolsVersion
} }
} }
} }
} }
......
package org.ros.gradle_plugins; package org.ros.gradle_plugins;
import org.gradle.api.Project;
import org.gradle.api.Plugin;
import org.gradle.api.*; import org.gradle.api.*;
import org.gradle.api.publish.maven.MavenPublication;
/* /**
* Provides information about the ros workspace. * Configures a Java project for use with ROS.
* *
* - project.ros.mavenPath : location of local ros maven repositories (in your chained workspaces) * - project.ros.mavenPath : location of local ros maven repositories (in your chained workspaces)
* - project.ros.mavenDeploymentRepository : location of the ros maven repository you will publish to * - project.ros.mavenDeploymentRepository : location of the ros maven repository you will publish to
...@@ -17,48 +16,50 @@ import org.gradle.api.*; ...@@ -17,48 +16,50 @@ import org.gradle.api.*;
* - configures the uploadArchives for artifact deployment to the local ros maven repo (devel/share/maven) * - configures the uploadArchives for artifact deployment to the local ros maven repo (devel/share/maven)
*/ */
class RosPlugin implements Plugin<Project> { class RosPlugin implements Plugin<Project> {
Project project
def void apply(Project project) { def void apply(Project project) {
this.project = project project.apply plugin: "maven"
if (!project.plugins.findPlugin('maven')) {
project.apply(plugin: 'maven') project.extensions.create("ros", RosPluginExtension)
}
/* Create project.ros.* property extensions */ project.ros.mavenRepository = System.getenv("ROS_MAVEN_REPOSITORY")
project.extensions.create("ros", RosExtension) project.ros.mavenDeploymentRepository = System.getenv("ROS_MAVEN_DEPLOYMENT_REPOSITORY")
project.ros.mavenPath = "$System.env.ROS_MAVEN_PATH".split(':') String mavenPath = System.getenv("ROS_MAVEN_PATH")
project.ros.mavenDeploymentRepository = "$System.env.ROS_MAVEN_DEPLOYMENT_REPOSITORY" if (mavenPath != null) {
def mavenRepository = "$System.env.ROS_MAVEN_REPOSITORY" project.ros.mavenPath = mavenPath.tokenize(":")
if ( mavenRepository != 'null' ) {
project.ros.mavenRepository = mavenRepository
} }
/*
* Could use some better handling for when this is not defined as it sets
* file://null, but it doesn't seem to hurt the process any
*/
def repoURLs = project.ros.mavenPath.collect { 'file://' + it }
project.repositories { project.repositories {
repoURLs.each { p -> if (project.ros.mavenPath != null) {
project.ros.mavenPath.each { path ->
maven { maven {
url p url project.uri(path)
} }
} }
mavenLocal() }
if (project.ros.mavenRepository != null) {
maven { maven {
url project.ros.mavenRepository url project.ros.mavenRepository
} }
}
mavenLocal()
maven {
url "http://repository.springsource.com/maven/bundles/release"
}
maven {
url "http://repository.springsource.com/maven/bundles/external"
}
mavenCentral() mavenCentral()
} }
} }
} }
/* http://www.gradle.org/docs/nightly/dsl/org.gradle.api.plugins.ExtensionAware.html */ /* http://www.gradle.org/docs/nightly/dsl/org.gradle.api.plugins.ExtensionAware.html */
class RosExtension { class RosPluginExtension {
List<String> mavenPath
String mavenDeploymentRepository
String mavenRepository String mavenRepository
String mavenDeploymentRepository
List<String> mavenPath
RosExtension() { RosPluginExtension() {
/* Initialising the strings here gets rid of the dynamic property deprecated warnings. */ /* Initialising the strings here gets rid of the dynamic property deprecated warnings. */
this.mavenDeploymentRepository = "" this.mavenDeploymentRepository = ""
this.mavenRepository = "https://github.com/rosjava/rosjava_mvn_repo/raw/master" this.mavenRepository = "https://github.com/rosjava/rosjava_mvn_repo/raw/master"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment