@@ -4,6 +4,7 @@ import org.gradle.api.Project;
4
4
import org.gradle.api.Plugin ;
5
5
import org.gradle.api.Task ;
6
6
import org.gradle.api.tasks.JavaExec
7
+ import org.gradle.api.tasks.StopActionException
7
8
8
9
import org.gradle.api.* ;
9
10
@@ -14,22 +15,22 @@ import org.gradle.api.*;
14
15
* - project.catkin.workspaces : list of Strings
15
16
* - project.catkin.tree.generate() : create the pkgs dictionary
16
17
* - project.catkin.tree.pkgs : dictionary of CatkinPackage objects
17
- *
18
+ *
18
19
* The latter can be iterated over for information:
19
20
*
20
21
* 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
+ * }
31
32
* }
32
- *
33
+ *
33
34
* Use this only once in the root of a multi-project gradle build - it will
34
35
* only generate the properties once and share them this way.
35
36
*/
@@ -53,7 +54,7 @@ class CatkinPlugin implements Plugin<Project> {
53
54
packageXml = project. file(' package.xml' )
54
55
}
55
56
if (packageXml != null ) {
56
- project. catkin. pkg = new CatkinPackage (packageXml)
57
+ project. catkin. pkg = new CatkinPackage (project, packageXml)
57
58
}
58
59
setTasks()
59
60
}
@@ -69,202 +70,126 @@ class CatkinPlugin implements Plugin<Project> {
69
70
}
70
71
}
71
72
class CatkinPluginExtension {
72
- CatkinPackage pkg
73
- List<String > workspaces
74
- CatkinPackages tree
73
+ CatkinPackage pkg
74
+ List<String > workspaces
75
+ CatkinPackages tree
75
76
}
77
+
76
78
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
102
101
}
102
+ } else {
103
+ pkgs. put(pkg. name, pkg)
104
+ }
103
105
}
106
+ }
104
107
}
108
+ }
105
109
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
121
120
}
122
- return result
121
+ }
122
+ } catch (NullPointerException e) {
123
+ /* Not a catkin package dependency (e.g. boost), ignore */
124
+ result = false
123
125
}
126
+ return result
127
+ }
124
128
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
+ }
158
143
}
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
+ }
159
154
}
160
155
161
156
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
221
162
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
+ }
249
172
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
+ }
268
183
}
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
+
269
194
}
270
195
0 commit comments