Skip to content

Commit 905004f

Browse files
authored
Use toolchains for java tasks (#181)
Closes #176
1 parent 3f32f2d commit 905004f

File tree

10 files changed

+101
-3
lines changed

10 files changed

+101
-3
lines changed

integration/src/test/kotlin/kotlinx/benchmark/integration/GradleTest.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ abstract class GradleTest {
2626
val builder = ProjectBuilder().apply(build)
2727
templates.resolve(name).copyRecursively(rootProjectDir)
2828
file("build.gradle").modify(builder::build)
29-
file("settings.gradle").writeText("") // empty settings file
29+
val settingsFile = file("settings.gradle")
30+
if (!settingsFile.exists()) {
31+
file("settings.gradle").writeText("") // empty settings file
32+
}
3033
return Runner(rootProjectDir, print, gradleVersion)
3134
}
3235
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package kotlinx.benchmark.integration
2+
3+
import org.gradle.testkit.runner.TaskOutcome
4+
import org.junit.Test
5+
import kotlin.test.assertEquals
6+
7+
class JvmToolchainsTest : GradleTest() {
8+
@Test
9+
fun testJvmToolchainSetup() {
10+
val runner = project("kmp-with-toolchain", true, GradleTestVersion.v8_0) {
11+
}
12+
runner.run("benchmark") {
13+
assertEquals(TaskOutcome.SUCCESS, task(":jvmBenchmark")!!.outcome)
14+
assertOutputDoesNotContain("<failure>")
15+
}
16+
}
17+
}

integration/src/test/kotlin/kotlinx/benchmark/integration/testDsl.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,14 @@ internal fun BuildResult.assertOutputContains(
4545
}
4646
}
4747

48-
internal fun BuildResult.assertTasksUpToDate(tasks: Collection<String>) = assertTasksUpToDate(*tasks.toTypedArray())
48+
internal fun BuildResult.assertOutputDoesNotContain(
49+
expectedSubString: String,
50+
message: String = "Build output contains \"$expectedSubString\""
51+
) {
52+
assert(!output.contains(expectedSubString)) {
53+
printBuildOutput()
54+
message
55+
}
56+
}
57+
58+
internal fun BuildResult.assertTasksUpToDate(tasks: Collection<String>) = assertTasksUpToDate(*tasks.toTypedArray())
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
kotlin {
2+
jvm {
3+
jvmToolchain(21)
4+
}
5+
6+
sourceSets {
7+
commonMain {
8+
dependencies {
9+
implementation("org.jetbrains.kotlinx:kotlinx-benchmark-runtime:0.5.0-SNAPSHOT")
10+
}
11+
}
12+
}
13+
}
14+
15+
benchmark {
16+
targets {
17+
register("jvm")
18+
}
19+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
org.gradle.jvmargs=-Xmx2g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
plugins {
2+
id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0"
3+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package test
2+
3+
import kotlinx.benchmark.*
4+
import kotlin.math.*
5+
6+
// Don't really need to measure anything here, just check that the benchmark works
7+
@State(Scope.Benchmark)
8+
@Warmup(iterations = 0)
9+
@Measurement(iterations = 1, time = 100, timeUnit = BenchmarkTimeUnit.MILLISECONDS)
10+
@OutputTimeUnit(BenchmarkTimeUnit.MILLISECONDS)
11+
@BenchmarkMode(Mode.Throughput)
12+
open class CommonBenchmark {
13+
@Benchmark
14+
open fun mathBenchmark() = 3.14
15+
}

plugin/main/src/kotlinx/benchmark/gradle/JmhBytecodeGeneratorTask.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package kotlinx.benchmark.gradle
22

33
import org.gradle.api.*
44
import org.gradle.api.file.*
5+
import org.gradle.api.provider.Provider
56
import org.gradle.api.tasks.*
67
import org.gradle.workers.*
78
import java.io.*
@@ -28,11 +29,18 @@ open class JmhBytecodeGeneratorTask
2829
@InputFiles
2930
@PathSensitive(PathSensitivity.RELATIVE)
3031
lateinit var runtimeClasspath: FileCollection
32+
33+
@Optional
34+
@Input
35+
var executableProvider: Provider<String> = project.provider { null }
3136

3237
@TaskAction
3338
fun generate() {
3439
val workQueue = workerExecutor.processIsolation { workerSpec ->
3540
workerSpec.classpath.setFrom(runtimeClasspath.files)
41+
if (executableProvider.isPresent) {
42+
workerSpec.forkOptions.executable = executableProvider.get()
43+
}
3644
}
3745
workQueue.submit(JmhBytecodeGeneratorWorker::class.java) { workParameters ->
3846
workParameters.inputClasses.setFrom(inputClassesDirs.files)

plugin/main/src/kotlinx/benchmark/gradle/JvmTasks.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ fun Project.createJvmBenchmarkCompileTask(target: JvmBenchmarkTarget, compileCla
2020
classpath = compileClasspath
2121
source = fileTree("$benchmarkBuildDir/sources")
2222
destinationDirectory.set(file("$benchmarkBuildDir/classes"))
23+
javaCompiler.set(javaCompilerProvider())
2324
}
2425

2526
task<Jar>(
@@ -90,6 +91,9 @@ fun Project.createJvmBenchmarkGenerateSourceTask(
9091
inputClassesDirs = compilationOutput
9192
outputResourcesDir = file("$benchmarkBuildDir/resources")
9293
outputSourcesDir = file("$benchmarkBuildDir/sources")
94+
executableProvider = javaLauncherProvider().map {
95+
it.executablePath.asFile.absolutePath
96+
}
9397
}
9498
}
9599

@@ -123,5 +127,6 @@ fun Project.createJvmBenchmarkExecTask(
123127

124128
val reportFile = setupReporting(target, config)
125129
args(writeParameters(target.name, reportFile, traceFormat(), config))
130+
javaLauncher.set(javaLauncherProvider())
126131
}
127132
}

plugin/main/src/kotlinx/benchmark/gradle/Utils.kt

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@ import org.gradle.api.Action
55
import org.gradle.api.Project
66
import org.gradle.api.Task
77
import org.gradle.api.invocation.Gradle
8+
import org.gradle.api.plugins.JavaPluginExtension
9+
import org.gradle.api.provider.Provider
810
import org.gradle.api.tasks.TaskProvider
11+
import org.gradle.jvm.toolchain.JavaCompiler
12+
import org.gradle.jvm.toolchain.JavaLauncher
13+
import org.gradle.jvm.toolchain.JavaToolchainService
914
import java.io.File
1015
import java.nio.file.Path
1116
import java.time.LocalDateTime
@@ -261,4 +266,16 @@ internal fun Project.getSystemProperty(key: String): String? {
261266
} else {
262267
System.getProperty(key)
263268
}
264-
}
269+
}
270+
271+
fun Project.javaCompilerProvider(): Provider<JavaCompiler> = provider {
272+
val toolchainService = extensions.findByType(JavaToolchainService::class.java) ?: return@provider null
273+
val javaExtension = extensions.findByType(JavaPluginExtension::class.java) ?: return@provider null
274+
toolchainService.compilerFor(javaExtension.toolchain).orNull
275+
}
276+
277+
fun Project.javaLauncherProvider(): Provider<JavaLauncher> = provider {
278+
val toolchainService = extensions.findByType(JavaToolchainService::class.java) ?: return@provider null
279+
val javaExtension = extensions.findByType(JavaPluginExtension::class.java) ?: return@provider null
280+
toolchainService.launcherFor(javaExtension.toolchain).orNull
281+
}

0 commit comments

Comments
 (0)