@@ -4,6 +4,7 @@ import org.gradle.api.Project;
44import org.gradle.api.Plugin ;
55import org.gradle.api.Task ;
66import org.gradle.api.tasks.JavaExec
7+ import org.gradle.api.tasks.StopActionException
78
89import 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}
7172class CatkinPluginExtension {
72- CatkinPackage pkg
73- List<String > workspaces
74- CatkinPackages tree
73+ CatkinPackage pkg
74+ List<String > workspaces
75+ CatkinPackages tree
7576}
77+
7678class 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
161156class 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