Skip to content
This repository was archived by the owner on Jan 14, 2023. It is now read-only.

Commit 2a4c144

Browse files
committed
remove deprecated message artifact generation, merge damons plugin upgrades - use buildscripts and some cleanups.
1 parent edf5fb9 commit 2a4c144

File tree

4 files changed

+201
-293
lines changed

4 files changed

+201
-293
lines changed

gradle_plugins/src/main/groovy/org/ros/gradle_plugins/CatkinPlugin.groovy

Lines changed: 119 additions & 194 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.gradle.api.Project;
44
import org.gradle.api.Plugin;
55
import org.gradle.api.Task;
66
import org.gradle.api.tasks.JavaExec
7+
import org.gradle.api.tasks.StopActionException
78

89
import org.gradle.api.*;
910

@@ -14,22 +15,22 @@ import org.gradle.api.*;
1415
* - project.catkin.workspaces : list of Strings
1516
* - project.catkin.tree.generate() : create the pkgs dictionary
1617
* - project.catkin.tree.pkgs : dictionary of CatkinPackage objects
17-
*
18+
*
1819
* The latter can be iterated over for information:
1920
*
2021
* project.catkin.tree.pkgs.each { pair ->
21-
* pkg = pair.value
22-
* println pkg.name
23-
* println pkg.version
24-
* pkg.dependencies.each { d ->
25-
* println d
26-
* }
27-
* // filtered list of *_msg dependencies.
28-
* pkg.messageDependencies().each { d ->
29-
* println d
30-
* }
22+
* pkg = pair.value
23+
* println pkg.name
24+
* println pkg.version
25+
* pkg.dependencies.each { d ->
26+
* println d
27+
* }
28+
* // filtered list of *_msg dependencies.
29+
* pkg.getMessageDependencies().each { d ->
30+
* println d
31+
* }
3132
* }
32-
*
33+
*
3334
* Use this only once in the root of a multi-project gradle build - it will
3435
* only generate the properties once and share them this way.
3536
*/
@@ -53,7 +54,7 @@ class CatkinPlugin implements Plugin<Project> {
5354
packageXml = project.file('package.xml')
5455
}
5556
if (packageXml != null) {
56-
project.catkin.pkg = new CatkinPackage(packageXml)
57+
project.catkin.pkg = new CatkinPackage(project, packageXml)
5758
}
5859
setTasks()
5960
}
@@ -69,202 +70,126 @@ class CatkinPlugin implements Plugin<Project> {
6970
}
7071
}
7172
class CatkinPluginExtension {
72-
CatkinPackage pkg
73-
List<String> workspaces
74-
CatkinPackages tree
73+
CatkinPackage pkg
74+
List<String> workspaces
75+
CatkinPackages tree
7576
}
77+
7678
class CatkinPackages {
77-
def Map<String, CatkinPackage> pkgs
78-
def List<String> workspaces
79-
def Project project
80-
81-
def CatkinPackages(Project project, List<String> workspaces) {
82-
this.project = project
83-
this.workspaces = workspaces
84-
this.pkgs = [:]
85-
}
86-
87-
def generate() {
88-
if ( this.pkgs.size() == 0 ) {
89-
this.workspaces.each { workspace ->
90-
def manifestTree = project.fileTree(dir: workspace, include: '**/package.xml')
91-
manifestTree.each { file ->
92-
def pkg = new CatkinPackage(file)
93-
if(this.pkgs.containsKey(pkg.name)) {
94-
if(this.pkgs[pkg.name].version < pkg.version) {
95-
println("Catkin generate tree: replacing older version of " + pkg.name + "[" + this.pkgs[pkg.name].version + "->" + pkg.version + "]")
96-
this.pkgs[pkg.name] = pkg
97-
}
98-
} else {
99-
this.pkgs.put(pkg.name, pkg)
100-
}
101-
}
79+
80+
Map<String, CatkinPackage> pkgs
81+
List<String> workspaces
82+
Project project
83+
84+
CatkinPackages(Project project, List<String> workspaces) {
85+
this.project = project
86+
this.workspaces = workspaces
87+
pkgs = [:]
88+
}
89+
90+
void generate() {
91+
if (pkgs.size() == 0) {
92+
workspaces.each { workspace ->
93+
def manifestTree = project.fileTree(dir: workspace,
94+
include: "**/package.xml")
95+
manifestTree.each { file ->
96+
def pkg = new CatkinPackage(file)
97+
if(this.pkgs.containsKey(pkg.name)) {
98+
if(this.pkgs[pkg.name].version < pkg.version) {
99+
println("Catkin generate tree: replacing older version of " + pkg.name + "[" + this.pkgs[pkg.name].version + "->" + pkg.version + "]")
100+
pkgs[pkg.name] = pkg
102101
}
102+
} else {
103+
pkgs.put(pkg.name, pkg)
104+
}
103105
}
106+
}
104107
}
108+
}
105109

106-
def isMessagePackage(String package_name) {
107-
def pkg
108-
def result = false
109-
try {
110-
pkg = this.pkgs[package_name]
111-
/* println(" Name: " + pkg.name + "-" + pkg.version) */
112-
/* println(" Dep-dependencies: " + pkg.dependencies) */
113-
pkg.dependencies.each { d ->
114-
if ( d.equalsIgnoreCase("message_generation") ) {
115-
result = true
116-
}
117-
}
118-
} catch (NullPointerException e) {
119-
/* Not a catkin package dependency (e.g. boost), ignore */
120-
result = false
110+
Boolean isMessagePackage(String package_name) {
111+
def pkg
112+
def result = false
113+
try {
114+
pkg = this.pkgs[package_name]
115+
/* println(" Name: " + pkg.name + "-" + pkg.version) */
116+
/* println(" Dep-dependencies: " + pkg.dependencies) */
117+
pkg.dependencies.each { d ->
118+
if ( d.equalsIgnoreCase("message_generation") ) {
119+
result = true
121120
}
122-
return result
121+
}
122+
} catch (NullPointerException e) {
123+
/* Not a catkin package dependency (e.g. boost), ignore */
124+
result = false
123125
}
126+
return result
127+
}
124128

125-
def void generateMessageArtifact(Project p, String package_name) {
126-
def pkg = this.pkgs[package_name]
127-
p.version = pkg.version
128-
/* println("Artifact: " + pkg.name + "-" + pkg.version) */
129-
p.dependencies.add("compile", 'org.ros.rosjava_bootstrap:message_generation:[0.1,0.2)')
130-
List<String> messageDependencies = []
131-
pkg.dependencies.each { d ->
132-
/* println(" Dependency: " + d) */
133-
if ( this.isMessagePackage(d) ) {
134-
messageDependencies.add(d)
135-
/* println(" Msg Pkg: yes") */
136-
} else {
137-
/* println(" Msg Pkg: no") */
138-
}
139-
}
140-
messageDependencies.each { d ->
141-
if ( p.getParent().getChildProjects().containsKey(d) ) {
142-
/* println(" Internal: " + d) */
143-
p.dependencies.add("compile", p.dependencies.project(path: ':' + d))
144-
} else {
145-
/* println(" External: " + d) */
146-
p.dependencies.add("compile", 'org.ros.rosjava_messages:' + d + ':[0.0,)')
147-
}
148-
}
149-
def generatedSourcesDir = "${p.buildDir}/generated-src"
150-
def generateSourcesTask = p.tasks.create("generateSources", JavaExec)
151-
generateSourcesTask.description = "Generate sources for " + pkg.name
152-
generateSourcesTask.outputs.dir(p.file(generatedSourcesDir))
153-
/* generateSourcesTask.args = new ArrayList<String>([generatedSourcesDir, pkg.name]) */
154-
generateSourcesTask.args = new ArrayList<String>([generatedSourcesDir, '--package-path=' + pkg.directory, pkg.name])
155-
generateSourcesTask.classpath = p.configurations.runtime
156-
generateSourcesTask.main = 'org.ros.internal.message.GenerateInterfaces'
157-
p.tasks.compileJava.source generateSourcesTask.outputs.files
129+
void generateMessageArtifact(Project project, String package_name) {
130+
def pkg = this.pkgs[package_name]
131+
project.version = pkg.version
132+
/* println("Artifact: " + pkg.name + "-" + pkg.version) */
133+
project.dependencies.add("compile", 'org.ros.rosjava_bootstrap:message_generation:[0.2,0.3)')
134+
Set<String> messageDependencies = pkg.getMessageDependencies()
135+
messageDependencies.each { d ->
136+
if ( project.getParent().getChildProjects().containsKey(d) ) {
137+
/* println(" Internal: " + d) */
138+
project.dependencies.add("compile", project.dependencies.project(path: ':' + d))
139+
} else {
140+
/* println(" External: " + d) */
141+
project.dependencies.add("compile", 'org.ros.rosjava_messages:' + d + ':[0.0,)')
142+
}
158143
}
144+
def generatedSourcesDir = "${project.buildDir}/generated-src"
145+
def generateSourcesTask = project.tasks.create("generateSources", JavaExec)
146+
generateSourcesTask.description = "Generate sources for " + pkg.name
147+
generateSourcesTask.outputs.dir(project.file(generatedSourcesDir))
148+
/* generateSourcesTask.args = new ArrayList<String>([generatedSourcesDir, pkg.name]) */
149+
generateSourcesTask.args = new ArrayList<String>([generatedSourcesDir, '--package-path=' + pkg.directory, pkg.name])
150+
generateSourcesTask.classpath = project.configurations.runtime
151+
generateSourcesTask.main = "org.ros.internal.message.GenerateInterfaces"
152+
project.tasks.compileJava.source generateSourcesTask.outputs.files
153+
}
159154
}
160155

161156
class CatkinPackage {
162-
def name
163-
def version
164-
def dependencies
165-
def directory
166-
167-
def CatkinPackage(File packageXmlFilename) {
168-
def packageXml = new XmlParser().parse(packageXmlFilename)
169-
directory = packageXmlFilename.parent
170-
name = packageXml.name.text()
171-
version = packageXml.version.text()
172-
dependencies = []
173-
packageXml.build_depend.each { d ->
174-
dependencies.add(d.text())
175-
}
176-
}
177-
def String toString() {
178-
def out = new String()
179-
out += name + "\n"
180-
out += " version: " + version + "\n"
181-
out += " dependencies:" + "\n"
182-
dependencies.each { d ->
183-
out += " " + d + "\n"
184-
}
185-
return out
186-
}
187-
/*
188-
* Find and annotate a list of package package dependencies.
189-
* Useful for message artifact generation).
190-
*
191-
* Depracated, but kept around for legacy purposes, remove in igloo
192-
*
193-
* @return List<String> : dependencies (package name strings)
194-
*/
195-
def List<String> messageDependencies() {
196-
List<String> msgDependencies = []
197-
dependencies.each { d ->
198-
if ( d.contains("_msgs") ) {
199-
msgDependencies.add(d)
200-
}
201-
}
202-
return msgDependencies
203-
}
204-
205-
/* Depracated, but kept around for legacy purposes, remove in igloo */
206-
def void generateMessageArtifact(Project p) {
207-
p.version = version
208-
p.dependencies.add("compile", 'org.ros.rosjava_bootstrap:message_generation:[0.1,0.2)')
209-
messageDependencies().each { d ->
210-
p.dependencies.add("compile", p.dependencies.project(path: ':' + d))
211-
}
212-
def generatedSourcesDir = "${p.buildDir}/generated-src"
213-
def generateSourcesTask = p.tasks.create("generateSources", JavaExec)
214-
generateSourcesTask.description = "Generate sources for " + name
215-
generateSourcesTask.outputs.dir(p.file(generatedSourcesDir))
216-
generateSourcesTask.args = new ArrayList<String>([generatedSourcesDir, name])
217-
generateSourcesTask.classpath = p.configurations.runtime
218-
generateSourcesTask.main = 'org.ros.internal.message.GenerateInterfaces'
219-
p.tasks.compileJava.source generateSourcesTask.outputs.files
220-
}
157+
Project project
158+
String name
159+
String version
160+
Set<String> dependencies
161+
String directory
221162

222-
/* Depracated, but kept around for legacy purposes, remove in igloo */
223-
def void generateUnofficialMessageArtifact(Project p) {
224-
/* Couple of constraints here:
225-
1) maven group forced to org.ros.rosjava_messages to that all message artifact
226-
dependencies are easily found.
227-
2) Open ended dependency range (takes the latest in ROS_PACKAGE_PATH) since we
228-
don't know the artifact versions the user really wants.
229-
*/
230-
p.version = version
231-
p.group = 'org.ros.rosjava_messages'
232-
p.dependencies.add("compile", 'org.ros.rosjava_bootstrap:message_generation:[0.1,0.2)')
233-
messageDependencies().each { d ->
234-
if ( p.getParent().getChildProjects().containsKey(d) ) {
235-
p.dependencies.add("compile", p.dependencies.project(path: ':' + d))
236-
} else {
237-
p.dependencies.add("compile", 'org.ros.rosjava_messages:' + d + ':[0.1,)')
238-
}
239-
}
240-
def generatedSourcesDir = "${p.buildDir}/generated-src"
241-
def generateSourcesTask = p.tasks.create("generateSources", JavaExec)
242-
generateSourcesTask.description = "Generate sources for " + name
243-
generateSourcesTask.outputs.dir(p.file(generatedSourcesDir))
244-
generateSourcesTask.args = new ArrayList<String>([generatedSourcesDir, '--package-path=' + directory, name])
245-
generateSourcesTask.classpath = p.configurations.runtime
246-
generateSourcesTask.main = 'org.ros.internal.message.GenerateInterfaces'
247-
p.tasks.compileJava.source generateSourcesTask.outputs.files
248-
}
163+
CatkinPackage(Project project, File packageXmlFilename) {
164+
this.project = project
165+
/* println "Loading " + packageXmlFilename */
166+
def packageXml = new XmlParser().parse(packageXmlFilename)
167+
directory = packageXmlFilename.parent
168+
name = packageXml.name.text()
169+
version = packageXml.version.text()
170+
dependencies = packageXml.build_depend.collect{ it.text() }
171+
}
249172

250-
/*
251-
* Hack to work around for rosjava_test_msgs - look in a subfolder for the
252-
* msgs and name the artifact by the subfolder name/version.
253-
*/
254-
def void generateMessageArtifactInSubFolder(Project p, String subfolderName, List<String> dependencies) {
255-
// p.version = version use the subfolder's project version
256-
p.dependencies.add("compile", 'org.ros.rosjava_bootstrap:message_generation:[0.1,0.2)')
257-
dependencies.each { d ->
258-
p.dependencies.add("compile", p.dependencies.project(path: ':' + d))
259-
}
260-
def generatedSourcesDir = "${p.buildDir}/generated-src"
261-
def generateSourcesTask = p.tasks.create("generateSources", JavaExec)
262-
generateSourcesTask.description = "Generate sources for " + name + "/" + subfolderName
263-
generateSourcesTask.outputs.dir(p.file(generatedSourcesDir))
264-
generateSourcesTask.args = new ArrayList<String>([generatedSourcesDir, subfolderName])
265-
generateSourcesTask.classpath = p.configurations.runtime
266-
generateSourcesTask.main = 'org.ros.internal.message.GenerateInterfaces'
267-
p.tasks.compileJava.source generateSourcesTask.outputs.files
173+
String toString() { "${name} ${version} ${dependencies}" }
174+
175+
Set<String> getTransitiveDependencies(Collection<String> dependencies) {
176+
Set<String> result = [];
177+
dependencies.each {
178+
if (project.catkin.tree.pkgs.containsKey(it)) {
179+
result.add(it)
180+
result.addAll(getTransitiveDependencies(
181+
project.catkin.tree.pkgs[it].dependencies))
182+
}
268183
}
184+
return result
185+
}
186+
187+
Set<String> getMessageDependencies() {
188+
getTransitiveDependencies(dependencies).findAll {
189+
project.catkin.tree.pkgs.containsKey(it) &&
190+
project.catkin.tree.pkgs[it].dependencies.contains("message_generation")
191+
} as Set
192+
}
193+
269194
}
270195

0 commit comments

Comments
 (0)