import org.gradle.crypto.checksum.Checksum import org.gradle.plugins.ide.idea.model.IdeaModel buildscript { val cacheRedirectorEnabled = findProperty("cacheRedirectorEnabled")?.toString()?.toBoolean() == true kotlinBootstrapFrom(BootstrapOption.SpaceBootstrap(kotlinBuildProperties.kotlinBootstrapVersion!!, cacheRedirectorEnabled)) repositories { bootstrapKotlinRepo?.let(::maven) if (cacheRedirectorEnabled) { maven("https://cache-redirector.jetbrains.com/plugins.gradle.org/m2") maven("https://cache-redirector.jetbrains.com/repo.maven.apache.org/maven2") } else { maven("https://plugins.gradle.org/m2") mavenCentral() } } // a workaround for kotlin compiler classpath in kotlin project: sometimes gradle substitutes // kotlin-stdlib external dependency with local project :kotlin-stdlib in kotlinCompilerClasspath configuration. // see also configureCompilerClasspath@ val bootstrapCompilerClasspath by configurations.creating dependencies { bootstrapCompilerClasspath(kotlin("compiler-embeddable", bootstrapKotlinVersion)) classpath("org.jetbrains.kotlin:kotlin-build-gradle-plugin:${kotlinBuildProperties.buildGradlePluginVersion}") classpath(kotlin("gradle-plugin", bootstrapKotlinVersion)) classpath(kotlin("serialization", bootstrapKotlinVersion)) } val versionPropertiesFile = project.rootProject.projectDir.resolve("gradle/versions.properties") val versionProperties = java.util.Properties() versionPropertiesFile.inputStream().use { propInput -> versionProperties.load(propInput) } configurations.all { resolutionStrategy.eachDependency { if (requested.group == "com.google.code.gson" && requested.name == "gson") { useVersion(versionProperties["versions.gson"] as String) because("Force using same gson version because of https://github.com/google/gson/pull/1991") } } } } plugins { base idea id("jps-compatible") id("org.jetbrains.gradle.plugin.idea-ext") id("org.gradle.crypto.checksum") version "1.2.0" signing } pill { excludedDirs( "out", "buildSrc/build", "buildSrc/prepare-deps/intellij-sdk/build" ) } val isTeamcityBuild = project.kotlinBuildProperties.isTeamcityBuild val defaultSnapshotVersion: String by extra val buildNumber by extra(findProperty("build.number")?.toString() ?: defaultSnapshotVersion) val kotlinVersion by extra( findProperty("deployVersion")?.toString()?.let { deploySnapshotStr -> if (deploySnapshotStr != "default.snapshot") deploySnapshotStr else defaultSnapshotVersion } ?: buildNumber ) val kotlinLanguageVersion by extra("1.8") extra["kotlin_root"] = rootDir val jpsBootstrap by configurations.creating val commonBuildDir = File(rootDir, "build") val distDir by extra("$rootDir/dist") val distKotlinHomeDir by extra("$distDir/kotlinc") val distLibDir = "$distKotlinHomeDir/lib" val commonLocalDataDir = "$rootDir/local" val ideaSandboxDir = "$commonLocalDataDir/ideaSandbox" val artifactsDir = "$distDir/artifacts" val ideaPluginDir = "$artifactsDir/ideaPlugin/Kotlin" extra["ktorExcludesForDaemon"] = listOf( "org.jetbrains.kotlin" to "kotlin-reflect", "org.jetbrains.kotlin" to "kotlin-stdlib", "org.jetbrains.kotlin" to "kotlin-stdlib-common", "org.jetbrains.kotlin" to "kotlin-stdlib-jdk8", "org.jetbrains.kotlin" to "kotlin-stdlib-jdk7", "org.jetbrains.kotlinx" to "kotlinx-coroutines-jdk8", "org.jetbrains.kotlinx" to "kotlinx-coroutines-core", "org.jetbrains.kotlinx" to "kotlinx-coroutines-core-common" ) // TODO: use "by extra()" syntax where possible extra["distLibDir"] = project.file(distLibDir) extra["commonLocalDataDir"] = project.file(commonLocalDataDir) extra["ideaSandboxDir"] = project.file(ideaSandboxDir) extra["ideaPluginDir"] = project.file(ideaPluginDir) extra["isSonatypeRelease"] = false val kotlinNativeVersionObject = project.kotlinNativeVersionValue() subprojects { extra["kotlinNativeVersion"] = kotlinNativeVersionObject } rootProject.apply { from(rootProject.file("gradle/versions.gradle.kts")) from(rootProject.file("gradle/report.gradle.kts")) from(rootProject.file("gradle/javaInstrumentation.gradle.kts")) from(rootProject.file("gradle/jps.gradle.kts")) from(rootProject.file("gradle/checkArtifacts.gradle.kts")) from(rootProject.file("gradle/checkCacheability.gradle.kts")) from(rootProject.file("gradle/retryPublishing.gradle.kts")) from(rootProject.file("gradle/modularizedTestConfigurations.gradle.kts")) from(rootProject.file("gradle/ideaRtHack.gradle.kts")) } IdeVersionConfigurator.setCurrentIde(project) if (!project.hasProperty("versions.kotlin-native")) { extra["versions.kotlin-native"] = "1.8.0-dev-287" } val irCompilerModules = arrayOf( ":compiler:ir.tree", ":compiler:ir.serialization.common", ":compiler:ir.serialization.js", ":compiler:ir.serialization.jvm", ":compiler:ir.backend.common", ":compiler:ir.interpreter", ":wasm:wasm.ir" ).also { extra["irCompilerModules"] = it } val commonCompilerModules = arrayOf( ":compiler:psi", ":compiler:frontend.common-psi", ":compiler:light-classes", // TODO split this module to base and FE1.0 implementation modules ":compiler:frontend.common", ":compiler:util", ":compiler:config.jvm", ":compiler:cli-common", ":compiler:resolution.common", ":compiler:resolution.common.jvm", ":core:metadata", ":core:metadata.jvm", ":core:deserialization.common", ":core:deserialization.common.jvm", ":core:compiler.common", ":core:compiler.common.jvm", ":core:util.runtime", ":compiler:frontend.common.jvm", ":compiler:frontend.java", // TODO this is fe10 module but some utils used in fir ide now ":analysis:decompiled:decompiler-to-stubs", ":analysis:decompiled:decompiler-to-file-stubs", ":analysis:decompiled:decompiler-to-psi", ":analysis:decompiled:light-classes-for-decompiled", ":analysis:kt-references", ).also { extra["commonCompilerModules"] = it } val firCompilerCoreModules = arrayOf( ":compiler:fir:cones", ":compiler:fir:providers", ":compiler:fir:semantics", ":compiler:fir:resolve", ":compiler:fir:fir-serialization", ":compiler:fir:fir-deserialization", ":compiler:fir:tree", ":compiler:fir:java", ":compiler:fir:raw-fir:raw-fir.common", ":compiler:fir:raw-fir:psi2fir", ":compiler:fir:checkers", ":compiler:fir:checkers:checkers.jvm", ":compiler:fir:checkers:checkers.js", ":compiler:fir:entrypoint", // TODO should not be in core modules but FIR IDE uses DependencyListForCliModule from this module ":compiler:fir:fir2ir:jvm-backend", // TODO should not be in core modules but FIR IDE uses Fir2IrSignatureComposer from this module ":compiler:fir:fir2ir" // TODO should not be in core modules but FIR IDE uses Fir2IrSignatureComposer from this module ).also { extra["firCompilerCoreModules"] = it } val firAllCompilerModules = firCompilerCoreModules + arrayOf( ":compiler:fir:raw-fir:light-tree2fir", ":compiler:fir:analysis-tests", ":compiler:fir:analysis-tests:legacy-fir-tests" ) val fe10CompilerModules = arrayOf( ":compiler", ":core:descriptors.runtime", ":core:descriptors", ":core:descriptors.jvm", ":compiler:resolution", ":compiler:serialization", ":compiler:frontend", ":compiler:config", ":compiler:container", ":compiler:cli-common", ":core:deserialization", ":compiler:frontend:cfg", ":compiler:ir.psi2ir", ":compiler:backend.jvm", ":compiler:backend.jvm.lower", ":compiler:backend.jvm.codegen", ":compiler:backend.jvm.entrypoint", ":compiler:backend.js", ":compiler:backend.wasm", ":kotlin-util-io", ":kotlin-util-klib", ":kotlin-util-klib-metadata", ":compiler:backend-common", ":compiler:backend", ":compiler:plugin-api", ":compiler:javac-wrapper", ":compiler:cli", ":compiler:cli-js", ":compiler:incremental-compilation-impl", ":compiler:compiler.version", ":js:js.ast", ":js:js.sourcemap", ":js:js.serializer", ":js:js.parser", ":js:js.config", ":js:js.frontend", ":js:js.translator", ":js:js.dce", ":native:frontend.native", ":native:kotlin-native-utils", ":kotlin-build-common", ":compiler:backend.common.jvm", ":analysis:decompiled:light-classes-for-decompiled-fe10", ).also { extra["fe10CompilerModules"] = it } extra["compilerModules"] = irCompilerModules + fe10CompilerModules + commonCompilerModules + firAllCompilerModules // They are embedded just because we don't publish those dependencies as separate Maven artifacts (yet) extra["kotlinJpsPluginEmbeddedDependencies"] = listOf( ":compiler:cli-common", ":kotlin-compiler-runner-unshaded", ":daemon-common", ":daemon-common-new", ":core:compiler.common", ":core:compiler.common.jvm", ":core:descriptors", ":core:descriptors.jvm", ":compiler:backend.common.jvm", ":js:js.serializer", ":core:deserialization", ":core:deserialization.common", ":core:deserialization.common.jvm", ":compiler:frontend.common.jvm", ":compiler:frontend.java", ":core:metadata", ":core:metadata.jvm", ":kotlin-preloader", ":compiler:util", ":compiler:config", ":compiler:config.jvm", ":js:js.config", ":core:util.runtime", ":compiler:compiler.version" ) extra["kotlinJpsPluginMavenDependencies"] = listOf( ":kotlin-daemon-client", ":kotlin-build-common", ":kotlin-reflect", ":kotlin-util-io", ":kotlin-util-klib", ":kotlin-util-klib-metadata", ":native:kotlin-native-utils" ) extra["compilerArtifactsForIde"] = listOfNotNull( ":prepare:ide-plugin-dependencies:android-extensions-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:allopen-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:incremental-compilation-impl-tests-for-ide", ":prepare:ide-plugin-dependencies:js-ir-runtime-for-ide", ":prepare:ide-plugin-dependencies:kotlin-build-common-tests-for-ide", ":prepare:ide-plugin-dependencies:kotlin-compiler-for-ide", ":prepare:ide-plugin-dependencies:kotlin-compiler-cli-for-ide", ":prepare:ide-plugin-dependencies:kotlin-gradle-statistics-for-ide", ":prepare:ide-plugin-dependencies:kotlin-jps-common-for-ide", ":prepare:ide-plugin-dependencies:kotlin-jps-plugin-classpath", ":prepare:ide-plugin-dependencies:kotlin-jps-plugin-tests-for-ide", ":prepare:ide-plugin-dependencies:kotlin-jps-plugin-testdata-for-ide", ":prepare:ide-plugin-dependencies:kotlinx-serialization-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:noarg-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:sam-with-receiver-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:parcelize-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:lombok-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:kotlin-backend-native-for-ide".takeIf { kotlinBuildProperties.isKotlinNativeEnabled }, ":prepare:ide-plugin-dependencies:kotlin-compiler-tests-for-ide", ":prepare:ide-plugin-dependencies:kotlin-compiler-testdata-for-ide", ":prepare:ide-plugin-dependencies:kotlin-stdlib-minimal-for-test-for-ide", ":prepare:ide-plugin-dependencies:low-level-api-fir-for-ide", ":prepare:ide-plugin-dependencies:high-level-api-for-ide", ":prepare:ide-plugin-dependencies:high-level-api-impl-base-for-ide", ":prepare:ide-plugin-dependencies:high-level-api-impl-base-tests-for-ide", ":prepare:ide-plugin-dependencies:high-level-api-fir-for-ide", ":prepare:ide-plugin-dependencies:high-level-api-fir-tests-for-ide", ":prepare:ide-plugin-dependencies:high-level-api-fe10-for-ide", ":prepare:ide-plugin-dependencies:high-level-api-fe10-tests-for-ide", ":prepare:ide-plugin-dependencies:kt-references-fe10-for-ide", ":prepare:ide-plugin-dependencies:analysis-api-providers-for-ide", ":prepare:ide-plugin-dependencies:analysis-project-structure-for-ide", ":prepare:ide-plugin-dependencies:symbol-light-classes-for-ide", ":prepare:ide-plugin-dependencies:analysis-api-standalone-for-ide", ":prepare:ide-plugin-dependencies:kotlin-compiler-ir-for-ide", ":prepare:ide-plugin-dependencies:kotlin-compiler-common-for-ide", ":prepare:ide-plugin-dependencies:kotlin-compiler-fe10-for-ide", ":prepare:ide-plugin-dependencies:kotlin-compiler-fir-for-ide", ":prepare:kotlin-jps-plugin", ":kotlin-script-runtime", ":kotlin-script-util", ":kotlin-scripting-common", ":kotlin-scripting-jvm", ":kotlin-scripting-compiler", ":kotlin-scripting-compiler-impl", ":kotlin-android-extensions-runtime", ":plugins:parcelize:parcelize-runtime", ":kotlin-stdlib-common", ":kotlin-stdlib", ":kotlin-stdlib-js", ":kotlin-test", ":kotlin-daemon", ":kotlin-compiler", ":kotlin-annotations-jvm", ":kotlin-stdlib-jdk7", ":kotlin-stdlib-jdk8", ":kotlin-reflect", ":kotlin-main-kts" ) val coreLibProjects by extra { listOfNotNull( ":kotlin-stdlib", ":kotlin-stdlib-common", ":kotlin-stdlib-js", ":kotlin-stdlib-jdk7", ":kotlin-stdlib-jdk8", ":kotlin-test", ":kotlin-test:kotlin-test-annotations-common", ":kotlin-test:kotlin-test-common", ":kotlin-test:kotlin-test-jvm", ":kotlin-test:kotlin-test-junit", ":kotlin-test:kotlin-test-junit5", ":kotlin-test:kotlin-test-testng", ":kotlin-test:kotlin-test-js".takeIf { !kotlinBuildProperties.isInJpsBuildIdeaSync }, ":kotlin-reflect" ) } val projectsWithEnabledContextReceivers by extra { listOf( ":compiler:fir:fir2ir" ) } val gradlePluginProjects = listOf( ":kotlin-gradle-plugin", ":kotlin-gradle-plugin-api", ":kotlin-gradle-plugin-idea", ":kotlin-gradle-plugin-idea-proto", ":kotlin-gradle-plugin-kpm-android", ":kotlin-allopen", ":kotlin-annotation-processing-gradle", ":kotlin-noarg", ":kotlin-sam-with-receiver", ":kotlin-parcelize-compiler", ":kotlin-lombok" ) val ignoreTestFailures by extra(project.kotlinBuildProperties.ignoreTestFailures) allprojects { if (!project.path.startsWith(":kotlin-ide.")) { pluginManager.apply("common-configuration") } val mirrorRepo: String? = findProperty("maven.repository.mirror")?.toString() repositories { when(kotlinBuildProperties.getOrNull("attachedIntellijVersion")) { null -> {} "master" -> { maven { setUrl("https://www.jetbrains.com/intellij-repository/snapshots") } } else -> { kotlinBuildLocalRepo(project) } } mirrorRepo?.let(::maven) internalBootstrapRepo?.let(::maven)?.apply { content { includeGroup("org.jetbrains.kotlin") } } bootstrapKotlinRepo?.let(::maven)?.apply { content { includeGroup("org.jetbrains.kotlin") } } maven(protobufRepo) { content { includeModule("org.jetbrains.kotlin", "protobuf-lite") includeModule("org.jetbrains.kotlin", "protobuf-relocated") } } maven(intellijRepo) maven("https://packages.jetbrains.team/maven/p/ij/intellij-dependencies") mavenCentral() maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-dependencies") maven("https://dl.google.com/dl/android/maven2") maven("https://download.jetbrains.com/teamcity-repository/") jcenter() } } apply { from("libraries/commonConfiguration.gradle") if (extra.has("isDeployStagingRepoGenerationRequired") && project.extra["isDeployStagingRepoGenerationRequired"] as Boolean == true ) { logger.info("Applying configuration for sonatype release") from("libraries/prepareSonatypeStaging.gradle") } } gradle.taskGraph.whenReady { fun Boolean.toOnOff(): String = if (this) "on" else "off" val profile = if (isTeamcityBuild) "CI" else "Local" val proguardMessage = "proguard is ${kotlinBuildProperties.proguard.toOnOff()}" val jarCompressionMessage = "jar compression is ${kotlinBuildProperties.jarCompression.toOnOff()}" logger.warn( "$profile build profile is active ($proguardMessage, $jarCompressionMessage). " + "Use -Pteamcity= to reproduce CI/local build" ) allTasks.filterIsInstance().forEach { task -> task.entryCompression = if (kotlinBuildProperties.jarCompression) ZipEntryCompression.DEFLATED else ZipEntryCompression.STORED } } val dist = tasks.register("dist") { dependsOn(":kotlin-compiler:dist") } val syncMutedTests = tasks.register("syncMutedTests") { dependsOn(":compiler:tests-mutes:tc-integration:run") } tasks.register("createIdeaHomeForTests") { val ideaBuildNumberFileForTests = ideaBuildNumberFileForTests() val intellijSdkVersion = rootProject.extra["versions.intellijSdk"] outputs.file(ideaBuildNumberFileForTests) doFirst { ideaBuildNumberFileForTests.parentFile.mkdirs() ideaBuildNumberFileForTests.writeText("IC-$intellijSdkVersion") } } tasks { named("clean") { delete += setOf("$buildDir/repo", distDir) } register("cleanupArtifacts") { delete = setOf(artifactsDir) } listOf("clean", "assemble", "install").forEach { taskName -> register("coreLibs${taskName.capitalize()}") { for (projectName in coreLibProjects) { if (projectName.startsWith(":kotlin-test:") && taskName == "install") continue dependsOn("$projectName:$taskName") } } } register("coreLibsTest") { (coreLibProjects + listOf( ":kotlin-stdlib:samples", ":kotlin-stdlib-js-ir", ":kotlin-test:kotlin-test-js-ir".takeIf { !kotlinBuildProperties.isInJpsBuildIdeaSync }, ":kotlin-test:kotlin-test-js:kotlin-test-js-it".takeIf { !kotlinBuildProperties.isInJpsBuildIdeaSync }, ":kotlin-test:kotlin-test-js-ir:kotlin-test-js-ir-it".takeIf { !kotlinBuildProperties.isInJpsBuildIdeaSync }, ":kotlinx-metadata-jvm", ":tools:binary-compatibility-validator", //":kotlin-stdlib-wasm", )).forEach { dependsOn("$it:check") } } register("gradlePluginTest") { gradlePluginProjects.forEach { dependsOn("$it:check") } } register("gradlePluginIntegrationTest") { dependsOn(":kotlin-gradle-plugin-integration-tests:check") } register("jvmCompilerTest") { dependsOn("dist") dependsOn( ":compiler:test", ":compiler:tests-common-new:test", ":compiler:container:test", ":compiler:tests-java8:test", ":compiler:tests-spec:test", ":compiler:tests-against-klib:test" ) dependsOn(":plugins:jvm-abi-gen:test") } register("testsForBootstrapBuildTest") { dependsOn("dist") dependsOn(":compiler:tests-common-new:test") } register("jvmCompilerIntegrationTest") { dependsOn( ":kotlin-compiler-embeddable:test", ":kotlin-compiler-client-embeddable:test" ) } register("jsCompilerTest") { dependsOn(":js:js.tests:test") dependsOn(":js:js.tests:runMocha") } register("wasmCompilerTest") { dependsOn(":js:js.tests:wasmTest") // Windows WABT release requires Visual C++ Redistributable if (!kotlinBuildProperties.isTeamcityBuild || !org.gradle.internal.os.OperatingSystem.current().isWindows) { dependsOn(":wasm:wasm.ir:test") } } register("nativeCompilerTest") { dependsOn(":native:kotlin-native-utils:test") } register("firCompilerTest") { dependsOn(":compiler:fir:raw-fir:psi2fir:test") dependsOn(":compiler:fir:raw-fir:light-tree2fir:test") dependsOn(":compiler:fir:analysis-tests:test") dependsOn(":compiler:fir:analysis-tests:legacy-fir-tests:test") dependsOn(":compiler:fir:fir2ir:test") dependsOn(":plugins:fir-plugin-prototype:test") dependsOn(":plugins:fir-plugin-prototype:fir-plugin-ic-test:test") } register("firAllTest") { dependsOn( ":dist", ":compiler:fir:raw-fir:psi2fir:test", ":compiler:fir:raw-fir:light-tree2fir:test", ":compiler:fir:analysis-tests:test", ":compiler:fir:analysis-tests:legacy-fir-tests:test", ":compiler:fir:fir2ir:test", ":plugins:fir-plugin-prototype:test", ":plugins:fir-plugin-prototype:fir-plugin-ic-test:test" ) } register("compilerFrontendVisualizerTest") { dependsOn("compiler:visualizer:test") } register("scriptingJvmTest") { dependsOn("dist") dependsOn(":kotlin-script-util:test") dependsOn(":kotlin-scripting-compiler:test") dependsOn(":kotlin-scripting-compiler:testWithIr") dependsOn(":kotlin-scripting-common:test") dependsOn(":kotlin-scripting-jvm:test") dependsOn(":kotlin-scripting-jvm-host-test:test") dependsOn(":kotlin-scripting-jvm-host-test:testWithIr") dependsOn(":kotlin-scripting-dependencies:test") dependsOn(":kotlin-scripting-dependencies-maven:test") dependsOn(":kotlin-scripting-jsr223-test:test") // see comments on the task in kotlin-scripting-jvm-host-test // dependsOn(":kotlin-scripting-jvm-host-test:embeddableTest") dependsOn(":kotlin-scripting-jsr223-test:embeddableTest") dependsOn(":kotlin-main-kts-test:test") dependsOn(":kotlin-main-kts-test:testWithIr") dependsOn(":kotlin-scripting-ide-services-test:test") dependsOn(":kotlin-scripting-ide-services-test:embeddableTest") } register("scriptingTest") { dependsOn("scriptingJvmTest") dependsOn(":kotlin-scripting-js-test:test") } register("compilerTest") { dependsOn("jvmCompilerTest") dependsOn("jsCompilerTest") dependsOn("miscCompilerTest") } register("miscCompilerTest") { dependsOn("coreLibsTest") dependsOn("gradlePluginTest") dependsOn("toolsTest") dependsOn("examplesTest") dependsOn("nativeCompilerTest") dependsOn(":kotlin-daemon-tests:test") dependsOn("scriptingTest") dependsOn(":kotlin-build-common:test") dependsOn(":compiler:incremental-compilation-impl:test") dependsOn(":compiler:incremental-compilation-impl:testJvmICWithJdk11") dependsOn(":core:descriptors.runtime:test") dependsOn("jvmCompilerIntegrationTest") dependsOn(":plugins:parcelize:parcelize-compiler:test") dependsOn(":kotlinx-serialization-compiler-plugin:test") dependsOn(":kotlin-util-io:test") dependsOn(":kotlin-util-klib:test") dependsOn(":generators:test") } register("toolsTest") { dependsOn(":tools:kotlinp:test") dependsOn(":native:kotlin-klib-commonizer:test") dependsOn(":native:kotlin-klib-commonizer-api:test") dependsOn(":kotlin-tooling-core:check") dependsOn(":kotlin-tooling-metadata:check") } register("examplesTest") { dependsOn("dist") project(":examples").subprojects.forEach { p -> dependsOn("${p.path}:check") } } register("distTest") { dependsOn("compilerTest") dependsOn("frontendApiTests") dependsOn("toolsTest") dependsOn("gradlePluginTest") dependsOn("examplesTest") } register("specTest") { dependsOn("dist") dependsOn(":compiler:tests-spec:test") } register("androidCodegenTest") { dependsOn(":compiler:android-tests:test") } register("jps-tests") { dependsOn("dist") dependsOn(":jps:jps-plugin:test") } register("frontendApiTests") { dependsOn(":analysis:analysisAllTests") } register("kaptTests") { dependsOn(":kotlin-annotation-processing:test") dependsOn(":kotlin-annotation-processing-base:test") dependsOn(":kotlin-annotation-processing-cli:test") } register("test") { doLast { throw GradleException("Don't use directly, use aggregate tasks *-check instead") } } named("check") { dependsOn("test") } named("checkBuild") { if (kotlinBuildProperties.isTeamcityBuild) { doFirst { println("##teamcity[setParameter name='bootstrap.kotlin.version' value='$bootstrapKotlinVersion']") } } } register("publishGradlePluginArtifacts") { idePluginDependency { dependsOnKotlinGradlePluginPublish() } } register("publishIdeArtifacts") { idePluginDependency { dependsOn((rootProject.extra["compilerArtifactsForIde"] as List).map { "$it:publish" }) } } register("installIdeArtifacts") { idePluginDependency { dependsOn((rootProject.extra["compilerArtifactsForIde"] as List).map { "$it:install" }) } } } fun CopySpec.setExecutablePermissions() { filesMatching("**/bin/*") { mode = 0b111101101 } filesMatching("**/bin/*.bat") { mode = 0b110100100 } } val zipCompiler by task { dependsOn(dist) destinationDirectory.set(file(distDir)) archiveFileName.set("kotlin-compiler-$kotlinVersion.zip") from(distKotlinHomeDir) into("kotlinc") setExecutablePermissions() doLast { logger.lifecycle("Compiler artifacts packed to ${archiveFile.get().asFile.absolutePath}") } } val zipStdlibTests by task { destinationDirectory.set(file(distDir)) archiveFileName.set("kotlin-stdlib-tests.zip") from("libraries/stdlib/common/test") { into("common") } from("libraries/stdlib/test") { into("test") } from("libraries/kotlin.test/common/src/test/kotlin") { into("kotlin-test") } doLast { logger.lifecycle("Stdlib tests are packed to ${archiveFile.get()}") } } val zipTestData by task { dependsOn(zipStdlibTests) destinationDirectory.set(file(distDir)) archiveFileName.set("kotlin-test-data.zip") isZip64 = true from("compiler/testData") { into("compiler") } from("idea/testData") { into("ide") } from("idea/idea-completion/testData") { into("ide/completion") } from("compiler/tests-common/tests/org/jetbrains/kotlin/coroutineTestUtil.kt") { into("compiler") } doLast { logger.lifecycle("Test data packed to ${archiveFile.get()}") } } fun Project.secureZipTask(zipTask: TaskProvider): RegisteringDomainObjectDelegateProviderWithAction { val checkSumTask = tasks.register("${zipTask.name}Checksum", Checksum::class) { dependsOn(zipTask) val compilerFile = zipTask.get().outputs.files.singleFile files = files(compilerFile) outputDir = compilerFile.parentFile algorithm = Checksum.Algorithm.SHA256 } val signTask = tasks.register("${zipTask.name}Sign", Sign::class) { description = "Signs the archive produced by the '" + zipTask.name + "' task." sign(zipTask.get()) } return tasks.registering { dependsOn(checkSumTask) dependsOn(signTask) } } signing { useGpgCmd() } val zipCompilerWithSignature by secureZipTask(zipCompiler) configure { module { excludeDirs = files( project.buildDir, commonLocalDataDir, ".gradle", "dependencies", "dist", "tmp" ).toSet() } } val disableVerificationTasks = providers.gradleProperty("kotlin.build.disable.verification.tasks") .forUseAtConfigurationTime().orNull?.toBoolean() ?: false if (disableVerificationTasks) { logger.info("Verification tasks are disabled because `kotlin.build.disable.verification.tasks` is true") gradle.taskGraph.whenReady { allTasks.forEach { if (it is VerificationTask) { logger.info("Task ${it.path} is disabled because `kotlin.build.disable.verification.tasks` is true") it.enabled = false } } } } plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin::class) { extensions.configure(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension::class.java) { npmInstallTaskProvider?.configure { args += listOf("--network-concurrency", "1", "--mutex", "network") } ?: error("kotlinNpmInstall task should exist inside NodeJsRootExtension") } } afterEvaluate { val cacheRedirectorEnabled = findProperty("cacheRedirectorEnabled")?.toString()?.toBoolean() == true if (cacheRedirectorEnabled) { rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin::class.java) { rootProject.the().downloadBaseUrl = "https://cache-redirector.jetbrains.com/github.com/yarnpkg/yarn/releases/download" } } } afterEvaluate { checkExpectedGradlePropertyValues() }