plugins { `java-base` } val compilerClasspath = configurations.create("compilerClasspath") { isCanBeResolved = true isCanBeConsumed = false } val scriptsClasspath = configurations.create("scriptsClasspath") { isCanBeResolved = true isCanBeConsumed = false } dependencies { compilerClasspath.name(project(":kotlin-compiler-embeddable")) compilerClasspath.name(project(":kotlin-scripting-compiler-embeddable")) scriptsClasspath.name(project(":gradle:regression-benchmark-templates")) scriptsClasspath.name(project(":kotlin-script-runtime")) scriptsClasspath.name(kotlinStdlib()) } val service = project.extensions.getByType() abstract class ScriptArgumentProvider @Inject constructor( layout: ProjectLayout, private val releaseKotlinVersion: String ) : CommandLineArgumentProvider { @get:Classpath abstract val scriptClasspath: ConfigurableFileCollection @get:Input abstract val script: Property @get:OutputDirectory val scriptOutputDirectories: Provider = layout.buildDirectory.dir("benchmark-script") override fun asArguments(): Iterable { return listOf( "-no-reflect", "-no-stdlib", "-classpath", scriptClasspath.asFileTree.files.joinToString(separator = File.pathSeparator), "-script", "benchmarkScripts/${script.get()}", scriptOutputDirectories.get().asFile.absolutePath, releaseKotlinVersion ) } } fun addBenchmarkTask( taskName: String, script: String, jdkVersion: JavaLanguageVersion = JavaLanguageVersion.of(8), additionalConfiguration: JavaExec.() -> Unit = {} ): TaskProvider { return tasks.register(taskName) { group = "Gradle Regression Benchmark" description = "Runs regression benchmark from $script" dependsOnKotlinGradlePluginInstall() outputs.upToDateWhen { false } javaLauncher.set(service.launcherFor { languageVersion.set(jdkVersion) }) classpath = compilerClasspath mainClass.set("org.jetbrains.kotlin.cli.jvm.K2JVMCompiler") val scriptArgs = objects.newInstance(version) scriptArgs.script.set(script) scriptArgs.scriptClasspath.from(scriptsClasspath) argumentProviders.add(scriptArgs) additionalConfiguration() } } val acceptAndroidSdkLicenses = tasks.register("acceptAndroidSdkLicenses") { useAndroidSdk() acceptAndroidSdkLicenses() } fun JavaExec.usesAndroidSdk() { dependsOn(acceptAndroidSdkLicenses) doFirst { environment("ANDROID_HOME", configurations["androidSdk"].singleFile.canonicalPath) } } addBenchmarkTask( taskName = "benchmarkRegressionDuckduckgo", script = "duckduckgo.benchmark.kts", JavaLanguageVersion.of(17) ) { usesAndroidSdk() } addBenchmarkTask( taskName = "benchmarkRegressionGraphql", script = "graphql-kotlin.benchmark.kts", JavaLanguageVersion.of(11) ) addBenchmarkTask( taskName = "benchmarkRegressionKvision", script = "kvision.benchmark.kts", JavaLanguageVersion.of(11) )