Skip to content

Commit 852512d

Browse files
committed
chore: Make csi plugin not running in project.afterEvaluate
1 parent e3d0c57 commit 852512d

File tree

2 files changed

+44
-37
lines changed

2 files changed

+44
-37
lines changed

buildSrc/src/main/kotlin/datadog/gradle/plugin/csi/CallSiteInstrumentationExtension.kt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import org.gradle.api.plugins.JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME
99
import org.gradle.api.plugins.JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME
1010
import org.gradle.api.provider.ListProperty
1111
import org.gradle.api.provider.Property
12-
import org.gradle.api.tasks.SourceSet.MAIN_SOURCE_SET_NAME
1312
import org.gradle.api.tasks.SourceSet.TEST_SOURCE_SET_NAME
1413
import org.gradle.jvm.toolchain.JavaLanguageVersion
1514
import org.gradle.kotlin.dsl.listProperty
@@ -98,12 +97,7 @@ abstract class CallSiteInstrumentationExtension @Inject constructor(
9897
TEST_SOURCE_SET_NAME + RUNTIME_CLASSPATH_CONFIGURATION_NAME.capitalize(),
9998
TEST_SOURCE_SET_NAME + COMPILE_CLASSPATH_CONFIGURATION_NAME.capitalize() -> true
10099

101-
// Other main_javaXX source sets
102-
else -> {
103-
it.name.startsWith(MAIN_SOURCE_SET_NAME) &&
104-
(it.name.endsWith(RUNTIME_CLASSPATH_CONFIGURATION_NAME, ignoreCase = true) ||
105-
it.name.endsWith(COMPILE_CLASSPATH_CONFIGURATION_NAME, ignoreCase = true))
106-
}
100+
else -> false
107101
}
108102
}
109103
}

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

Lines changed: 43 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.gradle.api.tasks.JavaExec
1010
import org.gradle.api.tasks.SourceSet.MAIN_SOURCE_SET_NAME
1111
import org.gradle.api.tasks.SourceSet.TEST_SOURCE_SET_NAME
1212
import org.gradle.api.tasks.SourceSetContainer
13+
import org.gradle.api.tasks.TaskProvider
1314
import org.gradle.api.tasks.compile.AbstractCompile
1415
import org.gradle.api.tasks.testing.Test
1516
import org.gradle.jvm.tasks.Jar
@@ -27,6 +28,8 @@ import java.nio.file.Paths
2728
import javax.inject.Inject
2829

2930
private const val CALL_SITE_INSTRUMENTER_MAIN_CLASS = "datadog.trace.plugin.csi.PluginApplication"
31+
private const val CSI = "csi"
32+
private const val CSI_SOURCE_SET = CSI
3033

3134
abstract class CallSiteInstrumentationPlugin : Plugin<Project>{
3235
@get:Inject
@@ -36,19 +39,17 @@ abstract class CallSiteInstrumentationPlugin : Plugin<Project>{
3639
project.pluginManager.apply(JavaPlugin::class)
3740

3841
// Create plugin extension
39-
val extension = project.extensions.create<CallSiteInstrumentationExtension>("csi")
40-
project.afterEvaluate {
41-
configureSourceSets(project, extension)
42-
createTasks(project, extension)
43-
}
42+
val extension = project.extensions.create<CallSiteInstrumentationExtension>(CSI)
43+
configureSourceSets(project, extension)
44+
createTasks(project, extension)
4445
}
4546

4647
private fun configureSourceSets(project: Project, extension: CallSiteInstrumentationExtension) {
4748
// create a new source set for the csi files
4849
val targetFolder = newBuildFolder(project, extension.targetFolder.get().asFile.toString())
4950
val sourceSets = project.sourceSets
5051
val mainSourceSet = sourceSets.named(MAIN_SOURCE_SET_NAME).get()
51-
val csiSourceSet = sourceSets.create("csi") {
52+
val csiSourceSet = sourceSets.create(CSI_SOURCE_SET) {
5253
compileClasspath += mainSourceSet.output // mainly needed for the plugin tests
5354
annotationProcessorPath += mainSourceSet.annotationProcessorPath
5455
java.srcDir(targetFolder)
@@ -96,9 +97,9 @@ abstract class CallSiteInstrumentationPlugin : Plugin<Project>{
9697
}
9798

9899
private fun createTasks(project: Project, extension: CallSiteInstrumentationExtension) {
99-
registerGenerateCallSiteTask(project, extension, "compileJava")
100-
val targetFolder = extension.targetFolder.get().asFile
100+
registerGenerateCallSiteTask(project, extension, project.tasks.named<AbstractCompile>("compileJava"))
101101

102+
val targetFolder = extension.targetFolder.get().asFile
102103
project.tasks.withType<AbstractCompile>().matching {
103104
task -> task.name.startsWith("compileTest")
104105
}.configureEach {
@@ -120,25 +121,28 @@ abstract class CallSiteInstrumentationPlugin : Plugin<Project>{
120121

121122
private fun registerGenerateCallSiteTask(project: Project,
122123
csiExtension: CallSiteInstrumentationExtension,
123-
compileTaskName: String) {
124-
val taskName = compileTaskName.replace("compile", "generateCallSite")
125-
val rootFolder = csiExtension.rootFolder.getOrElse(project.rootDir)
124+
mainCompileTask: TaskProvider<AbstractCompile>) {
125+
val genTaskName = mainCompileTask.name.replace("compile", "generateCallSite")
126126
val pluginJarFile = Paths.get(
127-
rootFolder.toString(),
127+
csiExtension.rootFolder.getOrElse(project.rootDir).toString(),
128128
"buildSrc",
129129
"call-site-instrumentation-plugin",
130130
"build",
131131
"libs",
132132
"call-site-instrumentation-plugin-all.jar"
133133
).toFile()
134-
val compileTask = project.tasks.named<AbstractCompile>(compileTaskName)
135-
val callSiteGeneratorTask = project.tasks.register<JavaExec>(taskName) {
134+
135+
val callSiteGeneratorTask = project.tasks.register<JavaExec>(genTaskName) {
136136
// Task description
137137
group = "call site instrumentation"
138-
description = "Generates call sites from $compileTaskName"
138+
description = "Generates call sites from ${mainCompileTask.name}"
139+
140+
// Remote Debug
141+
// jvmArgs("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:5005")
142+
139143
// Task input & output
140144
val output = csiExtension.targetFolder
141-
val inputProvider = compileTask.map { it.destinationDirectory.get() }
145+
val inputProvider = mainCompileTask.flatMap { it.destinationDirectory }
142146
inputs.dir(inputProvider)
143147
outputs.dir(output)
144148

@@ -152,28 +156,37 @@ abstract class CallSiteInstrumentationPlugin : Plugin<Project>{
152156

153157
// Write the call site instrumenter arguments into a temporary file
154158
doFirst {
155-
val sourceSetOutput = project.sourceSets.matching { it.name.startsWith(MAIN_SOURCE_SET_NAME) }.flatMap {
156-
it.output.classesDirs.files
157-
}
158-
val programClassPath = csiExtension.configurations.get().flatMap {
159-
it.files
159+
val callsitesClassPath = project.objects.fileCollection()
160+
.from(
161+
project.sourceSets.named(MAIN_SOURCE_SET_NAME).map { it.output },
162+
csiExtension.configurations
163+
)
164+
165+
if (project.logger.isInfoEnabled) {
166+
project.logger.info(
167+
"Aggregated CSI classpath:\n{}",
168+
callsitesClassPath.toSet().sorted().joinToString("\n") { it.toString() }
169+
)
160170
}
161171

162-
val arguments = listOf(
163-
csiExtension.srcFolder.get().asFile.toString(),
164-
inputProvider.get().asFile.toString(),
165-
output.get().asFile.toString(),
166-
csiExtension.suffix.get(),
167-
csiExtension.reporters.get().joinToString(",")
168-
) + (sourceSetOutput + programClassPath).map { it.toString() }
172+
val arguments = buildList {
173+
add(csiExtension.srcFolder.get().asFile.toString())
174+
add(inputProvider.get().asFile.toString())
175+
add(output.get().asFile.toString())
176+
add(csiExtension.suffix.get())
177+
add(csiExtension.reporters.get().joinToString(","))
178+
179+
// module program classpath
180+
addAll(callsitesClassPath.map { it.toString() })
181+
}
169182

170183
val argumentFile = newTempFile(temporaryDir, "call-site-arguments")
171184
Files.write(argumentFile.toPath(), arguments)
172185
args(argumentFile.toString())
173186
}
174187

175188
// make task depends on compile
176-
dependsOn(compileTask)
189+
dependsOn(mainCompileTask)
177190
}
178191

179192
// make all sourcesets' class tasks depend on call site generator
@@ -185,7 +198,7 @@ abstract class CallSiteInstrumentationPlugin : Plugin<Project>{
185198
}
186199

187200
// compile generated sources
188-
sourceSets.named("csi") {
201+
sourceSets.named(CSI_SOURCE_SET) {
189202
project.tasks.named(compileJavaTaskName) {
190203
dependsOn(callSiteGeneratorTask)
191204
}

0 commit comments

Comments
 (0)