Skip to content

Commit 6d852cf

Browse files
authored
Lazy config of the CallSiteInstrumentationPlugin (#9316)
* chore: Configure lazily :buildSrc:call-site-instrumentation-plugin tasks * chore: Configure lazily CallSiteInstrumentationPlugin
1 parent 9de0da8 commit 6d852cf

File tree

2 files changed

+69
-62
lines changed

2 files changed

+69
-62
lines changed

buildSrc/call-site-instrumentation-plugin/build.gradle.kts

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -52,41 +52,39 @@ sourceSets {
5252
}
5353
}
5454

55-
val copyCallSiteSources = tasks.register<Copy>("copyCallSiteSources") {
56-
val csiPackage = "datadog/trace/agent/tooling/csi"
57-
val source = layout.projectDirectory.file("../../dd-java-agent/agent-tooling/src/main/java/$csiPackage")
58-
val target = layout.buildDirectory.dir("generated/sources/csi/$csiPackage")
59-
doFirst {
60-
val folder = target.get().asFile
61-
if (folder.exists() && !folder.deleteRecursively()) {
62-
throw GradleException("Cannot delete files in $folder")
55+
tasks {
56+
val copyCallSiteSources = register<Copy>("copyCallSiteSources") {
57+
val csiPackage = "datadog/trace/agent/tooling/csi"
58+
val source = layout.projectDirectory.file("../../dd-java-agent/agent-tooling/src/main/java/$csiPackage")
59+
val target = layout.buildDirectory.dir("generated/sources/csi/$csiPackage")
60+
doFirst {
61+
val folder = target.get().asFile
62+
if (folder.exists() && !folder.deleteRecursively()) {
63+
throw GradleException("Cannot delete files in $folder")
64+
}
6365
}
66+
from(source)
67+
into(target)
68+
group = "build"
6469
}
65-
from(source)
66-
into(target)
67-
group = "build"
68-
}
6970

70-
tasks {
71-
withType<AbstractCompile> {
71+
withType<AbstractCompile>().configureEach {
7272
dependsOn(copyCallSiteSources)
7373
}
74-
}
7574

76-
tasks {
77-
named<ShadowJar>("shadowJar") {
75+
shadowJar {
7876
mergeServiceFiles()
7977
manifest {
8078
attributes(mapOf("Main-Class" to "datadog.trace.plugin.csi.PluginApplication"))
8179
}
8280
}
83-
}
8481

85-
tasks.build {
86-
dependsOn(tasks.shadowJar)
87-
}
82+
build {
83+
dependsOn(shadowJar)
84+
}
8885

89-
tasks.test {
90-
useJUnitPlatform()
91-
enabled = project.hasProperty("runBuildSrcTests")
86+
test {
87+
useJUnitPlatform()
88+
enabled = project.hasProperty("runBuildSrcTests")
89+
}
9290
}

buildSrc/src/main/kotlin/datadog/gradle/plugin/CallSiteInstrumentationPlugin.kt

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -87,28 +87,31 @@ abstract class CallSiteInstrumentationPlugin : Plugin<Project>{
8787
// create a new source set for the csi files
8888
val targetFolder = newBuildFolder(project, extension.targetFolder.get().asFile.toString())
8989
val sourceSets = getSourceSets(project)
90-
val csiSourceSet = sourceSets.create("csi")
9190
val mainSourceSet = sourceSets.named(SourceSet.MAIN_SOURCE_SET_NAME).get()
92-
val csiConfiguration = project.configurations.named(csiSourceSet.compileClasspathConfigurationName).get()
93-
val mainConfiguration = project.configurations.named(mainSourceSet.compileClasspathConfigurationName).get()
94-
csiConfiguration.extendsFrom(mainConfiguration)
95-
csiSourceSet.compileClasspath += mainSourceSet.output // mainly needed for the plugin tests
96-
csiSourceSet.annotationProcessorPath += mainSourceSet.annotationProcessorPath
97-
csiSourceSet.java.srcDir(targetFolder)
98-
project.getTasksByName(csiSourceSet.getCompileTaskName("java"), false).forEach { task ->
99-
val compile = task as AbstractCompile
100-
compile.sourceCompatibility = JavaVersion.VERSION_1_8.toString()
101-
compile.targetCompatibility = JavaVersion.VERSION_1_8.toString()
91+
val csiSourceSet = sourceSets.create("csi") {
92+
compileClasspath += mainSourceSet.output // mainly needed for the plugin tests
93+
annotationProcessorPath += mainSourceSet.annotationProcessorPath
94+
java.srcDir(targetFolder)
95+
96+
}
97+
project.configurations.named(csiSourceSet.compileClasspathConfigurationName) {
98+
extendsFrom(project.configurations.named(mainSourceSet.compileClasspathConfigurationName).get())
99+
}
100+
101+
project.tasks.named(csiSourceSet.getCompileTaskName("java"), AbstractCompile::class.java).configure {
102+
sourceCompatibility = JavaVersion.VERSION_1_8.toString()
103+
targetCompatibility = JavaVersion.VERSION_1_8.toString()
102104
}
103105

104106
// add csi classes to test classpath
105-
val testSourceSet = sourceSets.named(SourceSet.TEST_SOURCE_SET_NAME).get()
106-
testSourceSet.compileClasspath += csiSourceSet.output.classesDirs
107-
testSourceSet.runtimeClasspath += csiSourceSet.output.classesDirs
107+
sourceSets.named(SourceSet.TEST_SOURCE_SET_NAME) {
108+
compileClasspath += csiSourceSet.output.classesDirs
109+
runtimeClasspath += csiSourceSet.output.classesDirs
110+
}
108111
project.dependencies.add("testImplementation", csiSourceSet.output)
109112

110113
// include classes in final JAR
111-
project.tasks.named("jar", Jar::class.java).configure {
114+
project.tasks.named("jar", Jar::class.java) {
112115
from(csiSourceSet.output.classesDirs)
113116
}
114117
}
@@ -137,16 +140,16 @@ abstract class CallSiteInstrumentationPlugin : Plugin<Project>{
137140
}
138141

139142
private fun createTasks(project: Project, extension: CallSiteInstrumentationExtension) {
140-
val compileTask: AbstractCompile = project.tasks.named("compileJava", AbstractCompile::class.java).get()
141-
val input = compileTask.destinationDirectory
142-
createGenerateCallSiteTask(project, extension, compileTask, input)
143+
registerGenerateCallSiteTask(project, extension, "compileJava")
143144
val targetFolder = extension.targetFolder.get().asFile
144145
project.tasks.withType(AbstractCompile::class.java).matching {
145146
task -> task.name.startsWith("compileTest")
146147
}.configureEach {
148+
inputs.dir(extension.targetFolder)
147149
classpath += project.files(targetFolder)
148150
}
149151
project.tasks.withType(Test::class.java).configureEach {
152+
inputs.dir(extension.targetFolder)
150153
classpath += project.files(targetFolder)
151154
}
152155
}
@@ -157,11 +160,10 @@ abstract class CallSiteInstrumentationPlugin : Plugin<Project>{
157160
})
158161
}
159162

160-
private fun createGenerateCallSiteTask(project: Project,
161-
extension: CallSiteInstrumentationExtension,
162-
compileTask: AbstractCompile,
163-
input: DirectoryProperty) {
164-
val taskName = compileTask.name.replace("compile", "generateCallSite")
163+
private fun registerGenerateCallSiteTask(project: Project,
164+
extension: CallSiteInstrumentationExtension,
165+
compileTaskName: String) {
166+
val taskName = compileTaskName.replace("compile", "generateCallSite")
165167
val rootFolder = extension.rootFolder.getOrElse(project.rootDir)
166168
val pluginJarFile = Paths.get(
167169
rootFolder.toString(),
@@ -171,49 +173,56 @@ abstract class CallSiteInstrumentationPlugin : Plugin<Project>{
171173
"libs",
172174
"call-site-instrumentation-plugin-all.jar"
173175
).toFile()
174-
val programClassPath = getProgramClasspath(project).map { it.toString() }
176+
val compileTask = project.tasks.named(compileTaskName, AbstractCompile::class.java)
175177
val callSiteGeneratorTask = project.tasks.register(taskName, JavaExec::class.java) {
176178
// Task description
177179
group = "call site instrumentation"
178-
description = "Generates call sites from ${compileTask.name}"
180+
description = "Generates call sites from ${compileTaskName}"
179181
// Task input & output
180182
val output = extension.targetFolder
181-
inputs.dir(input)
183+
val inputProvider = compileTask.map { it.destinationDirectory.get() }
184+
inputs.dir(inputProvider)
182185
outputs.dir(output)
183186
// JavaExec configuration
184187
if (extension.javaVersion.isPresent) {
185188
configureLanguage(this, extension.javaVersion.get())
186189
}
187-
jvmArgs(extension.jvmArgs.get())
190+
jvmArgumentProviders.add({ extension.jvmArgs.get() })
188191
classpath(pluginJarFile)
189192
mainClass.set(CALL_SITE_INSTRUMENTER_MAIN_CLASS)
190193
// Write the call site instrumenter arguments into a temporary file
191194
doFirst {
192-
val argumentFile = newTempFile(temporaryDir, "call-site-arguments")
195+
val programClassPath = getProgramClasspath(project).map { it.toString() }
193196
val arguments = listOf(
194197
extension.srcFolder.get().asFile.toString(),
195-
input.get().asFile.toString(),
198+
inputProvider.get().asFile.toString(),
196199
output.get().asFile.toString(),
197200
extension.suffix.get(),
198201
extension.reporters.get().joinToString(",")
199202
) + programClassPath
203+
204+
val argumentFile = newTempFile(temporaryDir, "call-site-arguments")
200205
Files.write(argumentFile.toPath(), arguments)
201206
args(argumentFile.toString())
202207
}
203-
}.get()
204208

205-
// insert task after compile
206-
callSiteGeneratorTask.dependsOn(compileTask)
209+
// make task depends on compile
210+
dependsOn(compileTask)
211+
}
212+
213+
// make all sourcesets' class tasks depend on call site generator
207214
val sourceSets = getSourceSets(project)
208-
val mainSourceSet = sourceSets.named(SourceSet.MAIN_SOURCE_SET_NAME).get()
209-
project.tasks.named(mainSourceSet.classesTaskName).configure {
210-
dependsOn(callSiteGeneratorTask)
215+
sourceSets.named(SourceSet.MAIN_SOURCE_SET_NAME) {
216+
project.tasks.named(classesTaskName) {
217+
dependsOn(callSiteGeneratorTask)
218+
}
211219
}
212220

213221
// compile generated sources
214-
val csiSourceSet = sourceSets.named("csi").get()
215-
project.tasks.named(csiSourceSet.compileJavaTaskName).configure {
216-
callSiteGeneratorTask.finalizedBy(this)
222+
sourceSets.named("csi") {
223+
project.tasks.named(compileJavaTaskName) {
224+
dependsOn(callSiteGeneratorTask)
225+
}
217226
}
218227
}
219228

0 commit comments

Comments
 (0)