Skip to content

Commit 73af145

Browse files
committed
Added support for multiple source sets (issue #11) and basic support for Gradle incremental tasks (issue #10).
When Gradle detects there were no changes to the input files, it won't call Clojure compile task at all.
1 parent 663c939 commit 73af145

File tree

1 file changed

+49
-75
lines changed

1 file changed

+49
-75
lines changed

src/main/kotlin/cursive/ClojurePlugin.kt

Lines changed: 49 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import org.gradle.api.Project
2222
import org.gradle.api.file.FileCollection
2323
import org.gradle.api.file.SourceDirectorySet
2424
import org.gradle.api.internal.ConventionTask
25-
import org.gradle.api.internal.HasConvention
2625
import org.gradle.api.internal.file.FileResolver
2726
import org.gradle.api.internal.file.collections.SimpleFileCollection
2827
import org.gradle.api.internal.plugins.DslObject
@@ -54,59 +53,32 @@ class ClojurePlugin : Plugin<Project> {
5453

5554
override fun apply(project: Project) {
5655
logger.info("Applying ClojurePlugin")
57-
val javaBasePlugin = project.plugins.apply(JavaBasePlugin::class.java)
56+
project.plugins.apply(JavaBasePlugin::class.java)
57+
project.plugins.apply(JavaPlugin::class.java)
58+
5859
val javaPluginConvention = project.convention.getPlugin(JavaPluginConvention::class.java)
5960

60-
project.plugins.apply(JavaPlugin::class.java)
61+
javaPluginConvention.sourceSets?.all { sourceSet ->
62+
val compileTask = createClojureCompileTask(project, sourceSet)
6163

62-
val mainSourceSet = javaPluginConvention.sourceSets?.getByName(SourceSet.MAIN_SOURCE_SET_NAME)
63-
if (mainSourceSet is HasConvention) {
64-
val mainCompileTask = createCompileTask(project, mainSourceSet)
65-
val conventionMapping = mainCompileTask.conventionMapping
66-
conventionMapping.map("classpath", {
67-
mainSourceSet.compileClasspath
68-
.plus(SimpleFileCollection(mainSourceSet.allSource.srcDirs))
69-
})
70-
conventionMapping.map("namespaces", {
71-
mainCompileTask.findNamespaces()
72-
})
73-
}
7464

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.plus(compileTask.outputs.files)
71+
})
72+
testTaskMapping.map("namespaces", {
73+
compileTask.findNamespaces()
74+
})
75+
76+
testTask.dependsOn(compileTask.name)
77+
}
10678
}
10779
}
10880

109-
fun createCompileTask(project: Project, sourceSet: SourceSet): ClojureCompiler {
81+
fun createClojureCompileTask(project: Project, sourceSet: SourceSet): ClojureCompile {
11082
val projectInternal = project as ProjectInternal
11183
val sourceRootDir: String = "src/${sourceSet.name}/clojure"
11284

@@ -124,26 +96,32 @@ class ClojurePlugin : Plugin<Project> {
12496
sourceSet.resources?.filter?.exclude { clojureDirSet.contains(it.file) }
12597

12698
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)
135107
}
136108

137-
project.tasks.findByName(sourceSet.classesTaskName)?.dependsOn(compile.name)
109+
project.tasks.findByName(sourceSet.classesTaskName)?.dependsOn(clojureCompileTask.name)
138110

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+
})
140118
conventionMapping.map("destinationDir", {
141119
sourceSet.output.classesDir
142120
})
143121

144-
compile.source(clojureDirSet)
122+
clojureCompileTask.source(clojureDirSet)
145123

146-
return compile
124+
return clojureCompileTask
147125
}
148126
}
149127

@@ -161,7 +139,6 @@ fun createTestTask(project: Project): ClojureTestRunner {
161139
return testRunner
162140
}
163141

164-
165142
interface ClojureSourceSet {
166143
fun getClojure(): SourceDirectorySet
167144
fun clojure(configureClosure: Closure<Any?>?): ClojureSourceSet
@@ -178,14 +155,14 @@ open class ClojureSourceSetImpl(displayName: String?, resolver: FileResolver?) :
178155
override fun getClojure(): SourceDirectorySet = clojure
179156

180157
override fun clojure(configureClosure: Closure<Any?>?): ClojureSourceSet {
181-
ApiFacade.configureByClosure(this, configureClosure)
158+
ApiFacade.configureByClosure(clojure, configureClosure)
182159
return this
183160
}
184161
}
185162

186163
class ReflectionWarnings(var enabled: Boolean, var projectOnly: Boolean, var asErrors: Boolean)
187164

188-
open class ClojureCompiler @Inject constructor(val fileResolver: FileResolver) :
165+
open class ClojureCompile @Inject constructor(val fileResolver: FileResolver) :
189166
AbstractCompile(),
190167
JavaForkOptions by DefaultJavaForkOptions(fileResolver) {
191168

@@ -210,7 +187,10 @@ open class ClojureCompiler @Inject constructor(val fileResolver: FileResolver) :
210187
}
211188

212189
override fun compile() {
213-
logger.info("Starting ClojureCompiler task")
190+
logger.info("Starting ClojureCompile task")
191+
192+
destinationDir.deleteRecursively()
193+
destinationDir.mkdirs()
214194

215195
if (copySourceToOutput ?: !aotCompile) {
216196
project.copy {
@@ -244,8 +224,6 @@ open class ClojureCompiler @Inject constructor(val fileResolver: FileResolver) :
244224
"(System/exit 0)")
245225
.joinToString("\n")
246226

247-
// println(script)
248-
249227
val stdout = object : LineProcessingOutputStream() {
250228
override fun processLine(line: String) {
251229
System.out.print(line)
@@ -297,12 +275,10 @@ open class ClojureCompiler @Inject constructor(val fileResolver: FileResolver) :
297275
out.write("$script\n")
298276
}
299277

300-
// println("Classpath: " + classpath.joinToString(", "))
301-
302278
val exec = JavaExecHandleBuilder(fileResolver)
303279
copyTo(exec)
304280
exec.main = "clojure.main"
305-
exec.classpath = classpath.plus(SimpleFileCollection(destinationDir))
281+
exec.classpath = classpath + SimpleFileCollection(getSourceRootsFiles())
306282
exec.setArgs(listOf("-i", file.canonicalPath))
307283
exec.defaultCharacterEncoding = "UTF8"
308284

@@ -333,10 +309,8 @@ open class ClojureCompiler @Inject constructor(val fileResolver: FileResolver) :
333309
}
334310

335311
val sources = getSource()
336-
// println("Sources: " + sources.joinToString(", "))
337312
val roots = getSourceRoots()
338-
// println("Roots: " + roots.joinToString(", "))
339-
val namespaces = sources.map { findNamespace(it, roots) }.toList()
313+
val namespaces = sources.map { findNamespace(it, roots) }
340314
return namespaces
341315
}
342316

@@ -349,6 +323,10 @@ open class ClojureCompiler @Inject constructor(val fileResolver: FileResolver) :
349323
return roots
350324
}
351325

326+
private fun getSourceRootsFiles(): List<File> {
327+
return getSourceRoots().map(::File)
328+
}
329+
352330
companion object {
353331
val CHAR_MAP = mapOf('-' to "_",
354332
':' to "_COLON_",
@@ -444,8 +422,6 @@ open class ClojureTestRunner @Inject constructor(val fileResolver: FileResolver)
444422

445423
val script = "$testRunnerScript\n$runnerInvocation"
446424

447-
// println(script)
448-
449425
executeScript(script)
450426
}
451427

@@ -457,8 +433,6 @@ open class ClojureTestRunner @Inject constructor(val fileResolver: FileResolver)
457433

458434
val classpath = conventionMapping.getConventionValue<FileCollection>(SimpleFileCollection(), "classpath", false)
459435

460-
// println("Classpath: " + classpath.joinToString(", "))
461-
462436
val exec = JavaExecHandleBuilder(fileResolver)
463437
copyTo(exec)
464438
exec.main = "clojure.main"

0 commit comments

Comments
 (0)