From 3f607988484ef7c913b196a356131742d6bc5bed Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Thu, 2 Aug 2018 03:10:31 +0300 Subject: [PATCH] Fix the use case of an old-style project depending on an MPP lib * Setup the attributes for the resolvable and output configurations --- .../kotlin/gradle/NewMultiplatformIT.kt | 18 ++++++++++++++ .../sample-old-style-app/app-js/build.gradle | 5 ++++ .../app-js/src/main/kotlin/jsApp.kt | 10 ++++++++ .../sample-old-style-app/app-jvm/build.gradle | 5 ++++ .../app-jvm/src/main/kotlin/jvmApp.kt | 10 ++++++++ .../sample-old-style-app/build.gradle | 18 ++++++++++++++ .../sample-old-style-app/settings.gradle | 3 +++ .../kotlin/gradle/plugin/KotlinPlugin.kt | 24 +++++++++++++++++-- .../gradle/plugin/KotlinTargetConfigurator.kt | 19 ++++++++------- 9 files changed, 102 insertions(+), 10 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-js/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-js/src/main/kotlin/jsApp.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-jvm/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-jvm/src/main/kotlin/jvmApp.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/settings.gradle diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt index c3d35b72e02..6d8c08bcedc 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.gradle +import org.jetbrains.kotlin.gradle.util.checkBytecodeContains import org.jetbrains.kotlin.gradle.util.modify import org.junit.Assert import org.junit.Test @@ -20,6 +21,7 @@ class NewMultiplatformIT : BaseGradleIT() { fun testLibAndApp() { val libProject = Project("sample-lib", gradleVersion, "new-mpp-lib-and-app") val appProject = Project("sample-app", gradleVersion, "new-mpp-lib-and-app") + val oldStyleAppProject = Project("sample-old-style-app", gradleVersion, "new-mpp-lib-and-app") with(libProject) { build("publish") { @@ -86,6 +88,22 @@ class NewMultiplatformIT : BaseGradleIT() { checkAppBuild() } } + + with(oldStyleAppProject) { + setupWorkingDir() + gradleBuildScript().appendText("\nallprojects { repositories { maven { url '$libLocalRepoUri' } } }") + + build("assemble") { + assertSuccessful() + assertTasksExecuted(":app-js:compileKotlin2Js", ":app-jvm:compileKotlin") + + val jvmClassFile = projectDir.resolve(kotlinClassesDir("app-jvm") + "com/example/app/JvmAppKt.class") + checkBytecodeContains(jvmClassFile, "CommonKt.id", "MainKt.expectedFun") + + val jsCompiledFilePath = kotlinClassesDir("app-js") + "app-js.js" + assertFileContains(jsCompiledFilePath, "lib.expectedFun", "lib.id") + } + } } @Test diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-js/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-js/build.gradle new file mode 100644 index 00000000000..6c9ab01026c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-js/build.gradle @@ -0,0 +1,5 @@ +apply plugin: 'kotlin2js' + +dependencies { + compile 'com.example:sample-lib:1.0' +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-js/src/main/kotlin/jsApp.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-js/src/main/kotlin/jsApp.kt new file mode 100644 index 00000000000..47ef85a09bf --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-js/src/main/kotlin/jsApp.kt @@ -0,0 +1,10 @@ +package com.example.app + +import com.example.lib.id +import com.example.lib.expectedFun + +fun idUsage(x: Int): Int = id(x) + +fun main(args: Array) { + expectedFun() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-jvm/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-jvm/build.gradle new file mode 100644 index 00000000000..11006e79e1a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-jvm/build.gradle @@ -0,0 +1,5 @@ +apply plugin: 'kotlin' + +dependencies { + compile 'com.example:sample-lib:1.0' +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-jvm/src/main/kotlin/jvmApp.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-jvm/src/main/kotlin/jvmApp.kt new file mode 100644 index 00000000000..47ef85a09bf --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-jvm/src/main/kotlin/jvmApp.kt @@ -0,0 +1,10 @@ +package com.example.app + +import com.example.lib.id +import com.example.lib.expectedFun + +fun idUsage(x: Int): Int = id(x) + +fun main(args: Array) { + expectedFun() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/build.gradle new file mode 100644 index 00000000000..b18bc419fa0 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/build.gradle @@ -0,0 +1,18 @@ +buildscript { + repositories { + mavenLocal() + jcenter() + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + mavenLocal() + jcenter() + // NB: Build of this module depends on 'sample-lib' publication. You need to add the local + // repository where 'sample-lib' artifacts are published. + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/settings.gradle new file mode 100644 index 00000000000..5d139c22763 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/settings.gradle @@ -0,0 +1,3 @@ +enableFeaturePreview('GRADLE_METADATA') + +include 'app-jvm', 'app-js' \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index a36ef3bee22..47e97f76b24 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -346,11 +346,14 @@ internal abstract class AbstractKotlinPlugin( override fun apply(project: Project) { project.plugins.apply(JavaPlugin::class.java) + val target = (project.kotlinExtension as KotlinSingleJavaTargetExtension).target + configureTarget( - (project.kotlinExtension as KotlinSingleJavaTargetExtension).target, + target, { compilation -> buildSourceSetProcessor(project, compilation, kotlinPluginVersion) } ) + configureAttributes(target) configureProjectGlobalSettings(project, kotlinPluginVersion) registry.register(KotlinModelBuilder(kotlinPluginVersion)) } @@ -422,7 +425,24 @@ internal abstract class AbstractKotlinPlugin( } } - fun configureSourceSetDefaults( + private fun configureAttributes( + kotlinTarget: KotlinWithJavaTarget + ) { + val project = kotlinTarget.project + + // Don't set the attributes for common module; otherwise their 'common' platform won't be compatible with the one in + // platform-specific modules + if (kotlinTarget.platformType != KotlinPlatformType.common) { + project.dependencies.attributesSchema.attribute(KotlinPlatformType.attribute) + project.configurations.getByName(kotlinTarget.apiElementsConfigurationName).usesPlatformOf(kotlinTarget) + project.configurations.getByName(kotlinTarget.runtimeElementsConfigurationName).usesPlatformOf(kotlinTarget) + kotlinTarget.compilations.all { compilation -> + KotlinTargetConfigurator.defineConfigurationsForCompilation(compilation, kotlinTarget, project.configurations) + } + } + } + + private fun configureSourceSetDefaults( kotlinTarget: KotlinTarget, buildSourceSetProcessor: (KotlinCompilation) -> KotlinSourceSetProcessor<*> ) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt index 6393d16d5fe..4a1cd78773e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget import org.jetbrains.kotlin.gradle.plugin.mpp.disambiguateName import org.jetbrains.kotlin.gradle.plugin.mpp.defaultSourceSetName +import org.jetbrains.kotlin.gradle.plugin.sources.getSourceSetHierarchy import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName @@ -56,6 +57,14 @@ open class KotlinTargetConfigurator( val project = platformTarget.project val main = platformTarget.compilations.create(KotlinCompilation.MAIN_COMPILATION_NAME) + platformTarget.compilations.all { + buildOutputCleanupRegistry.registerOutputs(it.output) + it.compileDependencyFiles = project.configurations.maybeCreate(it.compileDependencyConfigurationName) + if (it is KotlinCompilationToRunnableFiles) { + it.runtimeDependencyFiles = project.configurations.maybeCreate(it.runtimeDependencyConfigurationName) + } + } + platformTarget.compilations.create(KotlinCompilation.TEST_COMPILATION_NAME).apply { compileDependencyFiles = project.files(main.output, project.configurations.maybeCreate(compileDependencyConfigurationName)) @@ -64,9 +73,6 @@ open class KotlinTargetConfigurator( } } - platformTarget.compilations.all { - buildOutputCleanupRegistry.registerOutputs(it.output) - } } private fun configureCompilationDefaults(target: KotlinOnlyTarget) { @@ -80,7 +86,8 @@ open class KotlinTargetConfigurator( } if (compilation is KotlinCompilationWithResources) { - configureResourceProcessing(compilation, project.files()) + val sourceSetHierarchy = compilation.kotlinSourceSets.flatMap { it.getSourceSetHierarchy() }.distinct() + configureResourceProcessing(compilation, project.files(Callable { sourceSetHierarchy.map { it.resources } })) } createLifecycleTask(compilation) @@ -336,8 +343,6 @@ open class KotlinTargetConfigurator( description = "Compile classpath for $compilation." } - compilation.compileDependencyFiles = compileClasspathConfiguration - if (compilation is KotlinCompilationToRunnableFiles) { val runtimeConfiguration = configurations.maybeCreate(compilation.deprecatedRuntimeConfigurationName).apply { extendsFrom(compileConfiguration) @@ -366,8 +371,6 @@ open class KotlinTargetConfigurator( attributes.attribute(USAGE_ATTRIBUTE, compilation.target.project.usageByName(Usage.JAVA_RUNTIME)) description = "Runtime classpath of $compilation." } - - compilation.runtimeDependencyFiles = compilation.output.plus(runtimeClasspathConfiguration) } }