diff --git a/GRADLE_PLUGIN.md b/GRADLE_PLUGIN.md index 7b5b32d312a..bef01ffa97c 100644 --- a/GRADLE_PLUGIN.md +++ b/GRADLE_PLUGIN.md @@ -242,12 +242,12 @@ project to a common project: } When a common project is added as an `expectedBy` dependency, all the artifacts with the multiplatform support enabled -will use it's `main` source set as a common module. One may specify a custom source set for each artifact using the -`commonSourceSet` DSL method. In this case the multiplatform support will be also enabled for this artifact. +will use it's `main` source set as a common module. One may specify custom source sets for each artifact using the +`commonSourceSets` DSL method. In this case the multiplatform support will be also enabled for this artifact. konanArtifacts { program('foo') { - commonSourceSet 'customSourceSet' + commonSourceSets 'customSourceSet', 'anotherCustomSourceSet' } } @@ -279,7 +279,7 @@ for each an artifact defined in a `konanArtifacts` block. Such a task may have d |`enableAssertions `|`boolean` |Is the assertion support enabled | |`measureTime `|`boolean` |Does the compiler print phase time | |`enableMultiplatform`|`boolean` |Is multiplatform support enabled for this artifact | - |`commonSourceSet` |`String` |Name of a source set used as a common module | + |`commonSourceSets` |`Collection` |Names of source sets used as a common module | ##### Properties available for a cinterop task (task building an interoperability library): @@ -573,7 +573,7 @@ tables below. apply plugin: 'konan' - // In this example common code is located in 'bar' source set of ':common' project. + // In this example common code is located in 'foo' and 'bar' source sets of ':common' project. konanArtifacts { // All the artifact types except interop libraries may use common modules. @@ -583,8 +583,9 @@ tables below. // Enable multiplatform support for this artifact. enableMultiplatform true - // Set a custom name for a source set used as a common module. - commonSourceSet 'bar' + // Set a custom names for source sets used as a common module. + // The default source set is 'main' + commonSourceSets 'foo', 'bar' } } diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanCompileConfig.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanCompileConfig.kt index 030df0c773b..1d19d273c99 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanCompileConfig.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanCompileConfig.kt @@ -52,6 +52,7 @@ abstract class KonanCompileConfig(name: String, override fun nativeLibraries(libs: FileCollection) = forEach { it.nativeLibraries(libs) } override fun commonSourceSet(sourceSetName: String) = forEach { it.commonSourceSet(sourceSetName) } + override fun commonSourceSets(vararg sourceSetNames: String) = forEach { it.commonSourceSets(*sourceSetNames) } override fun enableMultiplatform(flag: Boolean) = forEach { it.enableMultiplatform(flag) } override fun linkerOpts(values: List) = forEach { it.linkerOpts(values) } diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanSpecs.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanSpecs.kt index ae2ac223f31..160fbb9815f 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanSpecs.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanSpecs.kt @@ -55,6 +55,7 @@ interface KonanCompileSpec: KonanBuildingSpec { // DSL. Multiplatform projects fun enableMultiplatform(flag: Boolean) fun commonSourceSet(sourceSetName: String) + fun commonSourceSets(vararg sourceSetNames: String) // DSL. Other parameters. diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinNativePlatformPlugin.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinNativePlatformPlugin.kt index b8843324561..2cb00f947a9 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinNativePlatformPlugin.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinNativePlatformPlugin.kt @@ -40,15 +40,17 @@ open class KotlinNativePlatformPlugin: KotlinPlatformImplementationPluginBase("n .withType(KonanCompileTask::class.java) .filter { it.enableMultiplatform } .forEach { task: KonanCompileTask -> - val commonSourceSet = commonProject.sourceSets.findByName(task.commonSourceSet) ?: - throw GradleException("Cannot find a source set with name '${task.commonSourceSet}' " + - "in a common project '${commonProject.path}' " + - "for an artifact '${task.artifactName}' " + - "in a platform project '${platformProject.path}'") + task.commonSourceSets.forEach { commonSourceSetName -> + val commonSourceSet = commonProject.sourceSets.findByName(commonSourceSetName) ?: + throw GradleException("Cannot find a source set with name '${commonSourceSetName}' " + + "in a common project '${commonProject.path}' " + + "for an artifact '${task.artifactName}' " + + "in a platform project '${platformProject.path}'") - commonSourceSet.kotlin!!.srcDirs.forEach { - task.commonSrcDir(it) - } + commonSourceSet.kotlin!!.srcDirs.forEach { + task.commonSrcDir(it) + } + } } } } diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanCompileTask.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanCompileTask.kt index adb4a690a61..84f4aa83746 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanCompileTask.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanCompileTask.kt @@ -51,7 +51,7 @@ abstract class KonanCompileTask: KonanBuildingTask(), KonanCompileSpec { // Multiplatform support -------------------------------------------------- - @Input var commonSourceSet = "main" + @Input var commonSourceSets = listOf("main") @Internal var enableMultiplatform = false @@ -158,7 +158,12 @@ abstract class KonanCompileTask: KonanBuildingTask(), KonanCompileSpec { } override fun commonSourceSet(sourceSetName: String) { - commonSourceSet = sourceSetName + commonSourceSets = listOf(sourceSetName) + enableMultiplatform(true) + } + + override fun commonSourceSets(vararg sourceSetNames: String) { + commonSourceSets = sourceSetNames.toList() enableMultiplatform(true) } diff --git a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/MultiplatformSpecification.groovy b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/MultiplatformSpecification.groovy index 93795d85c54..ddd3e263b48 100644 --- a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/MultiplatformSpecification.groovy +++ b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/MultiplatformSpecification.groovy @@ -163,6 +163,43 @@ class MultiplatformSpecification extends BaseKonanSpecification { project.createRunner().withArguments(":build").build() } + def 'Plugin should allow setting several common source sets'() { + expect: + def project = KonanProject.createEmpty(projectDirectory) { KonanProject it -> + def commonDirectory = createCommonProject(it) + Paths.get(commonDirectory.absolutePath, "build.gradle").append(""" + sourceSets { + common.kotlin.srcDir 'src/common/kotlin' + } + """.stripIndent()) + + createCommonSource(commonDirectory, + ["src", "common", "kotlin"], + "common.kt", + "expect fun bar(): Int") + + createCommonSource(commonDirectory, + ["src", "main", "kotlin"], + "main.kt", + "expect fun foo() : Int") + + it.generateSrcFile("platform.kt", "actual fun bar() = 42\nactual fun foo() = 43") + it.buildFile.append(""" + konanArtifacts { + library('foo') { + enableMultiplatform true + commonSourceSets 'common', 'main' + } + } + + dependencies { + expectedBy project(':common') + } + """.stripIndent()) + } + project.createRunner().withArguments(":build").build() + } + def 'Build should fail if the expectedBy dependency is not a project one'() { when: def project = KonanProject.createEmpty(projectDirectory) { KonanProject it ->