@@ -22,7 +22,6 @@ import org.gradle.api.Project
22
22
import org.gradle.api.file.FileCollection
23
23
import org.gradle.api.file.SourceDirectorySet
24
24
import org.gradle.api.internal.ConventionTask
25
- import org.gradle.api.internal.HasConvention
26
25
import org.gradle.api.internal.file.FileResolver
27
26
import org.gradle.api.internal.file.collections.SimpleFileCollection
28
27
import org.gradle.api.internal.plugins.DslObject
@@ -34,6 +33,7 @@ import org.gradle.api.plugins.JavaPluginConvention
34
33
import org.gradle.api.tasks.SourceSet
35
34
import org.gradle.api.tasks.TaskAction
36
35
import org.gradle.api.tasks.compile.AbstractCompile
36
+ import org.gradle.api.tasks.incremental.IncrementalTaskInputs
37
37
import org.gradle.process.JavaForkOptions
38
38
import org.gradle.process.internal.DefaultJavaForkOptions
39
39
import org.gradle.process.internal.ExecException
@@ -53,60 +53,32 @@ class ClojurePlugin : Plugin<Project> {
53
53
54
54
override fun apply (project : Project ) {
55
55
logger.info(" Applying ClojurePlugin" )
56
- val javaBasePlugin = project.plugins.apply (JavaBasePlugin ::class .java)
56
+ project.plugins.apply (JavaBasePlugin ::class .java)
57
+ project.plugins.apply (JavaPlugin ::class .java)
58
+
57
59
val javaPluginConvention = project.convention.getPlugin(JavaPluginConvention ::class .java)
58
60
59
- project.plugins.apply (JavaPlugin ::class .java)
61
+ javaPluginConvention.sourceSets?.all { sourceSet ->
62
+ val compileTask = createClojureCompileTask(project, sourceSet)
60
63
61
- val mainSourceSet = javaPluginConvention.sourceSets?.getByName(SourceSet .MAIN_SOURCE_SET_NAME )
62
- if (mainSourceSet is HasConvention ) {
63
- val mainCompileTask = createCompileTask(project, mainSourceSet)
64
- val conventionMapping = mainCompileTask.conventionMapping
65
- conventionMapping.map(" classpath" , {
66
- mainSourceSet.compileClasspath
67
- .plus(SimpleFileCollection (mainSourceSet.allSource.srcDirs))
68
- .plus(SimpleFileCollection (mainSourceSet.output.classesDir))
69
- })
70
- conventionMapping.map(" namespaces" , {
71
- mainCompileTask.findNamespaces()
72
- })
73
- }
74
64
75
- val testSourceSet = javaPluginConvention.sourceSets?.getByName(SourceSet .TEST_SOURCE_SET_NAME )
76
- if (testSourceSet is HasConvention ) {
77
- val testCompileTask = createCompileTask(project, testSourceSet)
78
-
79
- val mainSrcDirs = mainSourceSet?.allSource?.srcDirs ? : emptyList<File >()
80
- val testSrcDirs = testSourceSet.allSource.srcDirs
81
- val outputDirs = if (mainSourceSet != null )
82
- listOf (mainSourceSet.output.classesDir, testSourceSet.output.classesDir)
83
- else
84
- listOf (testSourceSet.output.classesDir)
85
-
86
- val compileMapping = testCompileTask.conventionMapping
87
- compileMapping.map(" classpath" , {
88
- testSourceSet.compileClasspath
89
- .plus(SimpleFileCollection (mainSrcDirs + testSrcDirs + outputDirs))
90
- })
91
- compileMapping.map(" namespaces" , {
92
- testCompileTask.findNamespaces()
93
- })
94
-
95
- val testTask = createTestTask(project)
96
-
97
- val testRunnerMapping = testTask.conventionMapping
98
- testRunnerMapping.map(" classpath" , {
99
- testSourceSet.runtimeClasspath.plus(SimpleFileCollection (mainSrcDirs + testSrcDirs + outputDirs))
100
- })
101
- testRunnerMapping.map(" namespaces" , {
102
- testCompileTask.findNamespaces()
103
- })
104
-
105
- testTask.dependsOn(testCompileTask.name)
65
+ if (sourceSet.name == SourceSet .TEST_SOURCE_SET_NAME ) {
66
+ val testTask = createTestTask(project)
67
+
68
+ val testTaskMapping = testTask.conventionMapping
69
+ testTaskMapping.map(" classpath" , {
70
+ sourceSet.runtimeClasspath
71
+ })
72
+ testTaskMapping.map(" namespaces" , {
73
+ compileTask.findNamespaces()
74
+ })
75
+
76
+ testTask.dependsOn(compileTask.name)
77
+ }
106
78
}
107
79
}
108
80
109
- fun createCompileTask (project : Project , sourceSet : SourceSet ): ClojureCompiler {
81
+ fun createClojureCompileTask (project : Project , sourceSet : SourceSet ): ClojureCompile {
110
82
val projectInternal = project as ProjectInternal
111
83
val sourceRootDir: String = " src/${sourceSet.name} /clojure"
112
84
@@ -124,26 +96,32 @@ class ClojurePlugin : Plugin<Project> {
124
96
sourceSet.resources?.filter?.exclude { clojureDirSet.contains(it.file) }
125
97
126
98
val name = sourceSet.getCompileTaskName(" clojure" )
127
- val compilerClass = ClojureCompiler ::class .java
128
- logger.info(" Creating Clojure compile task $name with class $compilerClass " )
129
- val compile = project.tasks.create(name, compilerClass )
130
- compile .description = " Compiles the $sourceSet Clojure code"
131
-
132
- val javaTask = project.tasks.findByName(sourceSet.compileJavaTaskName)
133
- if (javaTask != null ) {
134
- compile .dependsOn(javaTask .name)
99
+ val clojureCompileClass = ClojureCompile ::class .java
100
+ logger.info(" Creating Clojure compile task $name with class $clojureCompileClass " )
101
+ val clojureCompileTask = project.tasks.create(name, clojureCompileClass )
102
+ clojureCompileTask .description = " Compiles the $sourceSet Clojure code"
103
+
104
+ val javaCompileTask = project.tasks.findByName(sourceSet.compileJavaTaskName)
105
+ if (javaCompileTask != null ) {
106
+ clojureCompileTask .dependsOn(javaCompileTask .name)
135
107
}
136
108
137
- project.tasks.findByName(sourceSet.classesTaskName)?.dependsOn(compile .name)
109
+ project.tasks.findByName(sourceSet.classesTaskName)?.dependsOn(clojureCompileTask .name)
138
110
139
- val conventionMapping = compile.conventionMapping
111
+ val conventionMapping = clojureCompileTask.conventionMapping
112
+ conventionMapping.map(" classpath" , {
113
+ sourceSet.compileClasspath
114
+ })
115
+ conventionMapping.map(" namespaces" , {
116
+ clojureCompileTask.findNamespaces()
117
+ })
140
118
conventionMapping.map(" destinationDir" , {
141
119
sourceSet.output.classesDir
142
120
})
143
121
144
- compile .source(clojureDirSet)
122
+ clojureCompileTask .source(clojureDirSet)
145
123
146
- return compile
124
+ return clojureCompileTask
147
125
}
148
126
}
149
127
@@ -161,7 +139,6 @@ fun createTestTask(project: Project): ClojureTestRunner {
161
139
return testRunner
162
140
}
163
141
164
-
165
142
interface ClojureSourceSet {
166
143
fun getClojure (): SourceDirectorySet
167
144
fun clojure (configureClosure : Closure <Any ?>? ): ClojureSourceSet
@@ -178,14 +155,14 @@ open class ClojureSourceSetImpl(displayName: String?, resolver: FileResolver?) :
178
155
override fun getClojure (): SourceDirectorySet = clojure
179
156
180
157
override fun clojure (configureClosure : Closure <Any ?>? ): ClojureSourceSet {
181
- ApiFacade .configureByClosure(this , configureClosure)
158
+ ApiFacade .configureByClosure(clojure , configureClosure)
182
159
return this
183
160
}
184
161
}
185
162
186
163
class ReflectionWarnings (var enabled : Boolean , var projectOnly : Boolean , var asErrors : Boolean )
187
164
188
- open class ClojureCompiler @Inject constructor(val fileResolver : FileResolver ) :
165
+ open class ClojureCompile @Inject constructor(val fileResolver : FileResolver ) :
189
166
AbstractCompile (),
190
167
JavaForkOptions by DefaultJavaForkOptions (fileResolver) {
191
168
@@ -205,8 +182,15 @@ open class ClojureCompiler @Inject constructor(val fileResolver: FileResolver) :
205
182
}
206
183
207
184
@TaskAction
185
+ fun compile (inputs : IncrementalTaskInputs ) {
186
+ compile()
187
+ }
188
+
208
189
override fun compile () {
209
- logger.info(" Starting ClojureCompiler task" )
190
+ logger.info(" Starting ClojureCompile task" )
191
+
192
+ destinationDir.deleteRecursively()
193
+ destinationDir.mkdirs()
210
194
211
195
if (copySourceToOutput ? : ! aotCompile) {
212
196
project.copy {
@@ -240,8 +224,6 @@ open class ClojureCompiler @Inject constructor(val fileResolver: FileResolver) :
240
224
" (System/exit 0)" )
241
225
.joinToString(" \n " )
242
226
243
- // println(script)
244
-
245
227
val stdout = object : LineProcessingOutputStream () {
246
228
override fun processLine (line : String ) {
247
229
System .out .print (line)
@@ -293,12 +275,16 @@ open class ClojureCompiler @Inject constructor(val fileResolver: FileResolver) :
293
275
out .write(" $script \n " )
294
276
}
295
277
296
- // println("Classpath: " + classpath.joinToString(", "))
297
-
298
278
val exec = JavaExecHandleBuilder (fileResolver)
299
279
copyTo(exec)
300
280
exec.main = " clojure.main"
301
- exec.classpath = classpath
281
+
282
+ // clojure.core/compile requires following on its classpath:
283
+ // - libs (this.classpath)
284
+ // - compiled namespaces sources (getSourceRootsFiles)
285
+ // - *compile-path* directory (this.destinationDir)
286
+ exec.classpath = classpath + SimpleFileCollection (getSourceRootsFiles()) + SimpleFileCollection (destinationDir)
287
+
302
288
exec.setArgs(listOf (" -i" , file.canonicalPath))
303
289
exec.defaultCharacterEncoding = " UTF8"
304
290
@@ -329,10 +315,8 @@ open class ClojureCompiler @Inject constructor(val fileResolver: FileResolver) :
329
315
}
330
316
331
317
val sources = getSource()
332
- // println("Sources: " + sources.joinToString(", "))
333
318
val roots = getSourceRoots()
334
- // println("Roots: " + roots.joinToString(", "))
335
- val namespaces = sources.map { findNamespace(it, roots) }.toList()
319
+ val namespaces = sources.map { findNamespace(it, roots) }
336
320
return namespaces
337
321
}
338
322
@@ -345,6 +329,10 @@ open class ClojureCompiler @Inject constructor(val fileResolver: FileResolver) :
345
329
return roots
346
330
}
347
331
332
+ private fun getSourceRootsFiles (): List <File > {
333
+ return getSourceRoots().map(::File )
334
+ }
335
+
348
336
companion object {
349
337
val CHAR_MAP = mapOf (' -' to " _" ,
350
338
' :' to " _COLON_" ,
@@ -440,8 +428,6 @@ open class ClojureTestRunner @Inject constructor(val fileResolver: FileResolver)
440
428
441
429
val script = " $testRunnerScript \n $runnerInvocation "
442
430
443
- // println(script)
444
-
445
431
executeScript(script)
446
432
}
447
433
@@ -453,8 +439,6 @@ open class ClojureTestRunner @Inject constructor(val fileResolver: FileResolver)
453
439
454
440
val classpath = conventionMapping.getConventionValue<FileCollection >(SimpleFileCollection (), " classpath" , false )
455
441
456
- // println("Classpath: " + classpath.joinToString(", "))
457
-
458
442
val exec = JavaExecHandleBuilder (fileResolver)
459
443
copyTo(exec)
460
444
exec.main = " clojure.main"
0 commit comments