diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/DefaultCInteropSettings.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/DefaultCInteropSettings.kt index 35dd0fb2b7b..bcb598dc2ab 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/DefaultCInteropSettings.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/DefaultCInteropSettings.kt @@ -7,10 +7,13 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.gradle.api.Action -import org.gradle.api.Project import org.gradle.api.file.FileCollection +import org.gradle.api.file.ProjectLayout +import org.gradle.api.internal.file.FileOperations +import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.ListProperty import org.gradle.api.provider.Property +import org.gradle.api.provider.ProviderFactory import org.jetbrains.kotlin.gradle.plugin.CInteropSettings import org.jetbrains.kotlin.gradle.plugin.CInteropSettings.IncludeDirectories import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation @@ -23,23 +26,29 @@ import java.io.File import javax.inject.Inject abstract class DefaultCInteropSettings @Inject constructor( - private val project: Project, private val name: String, - override val compilation: KotlinNativeCompilationData<*> -) : CInteropSettings { + @Transient + override val compilation: KotlinNativeCompilationData<*>, + private val providerFactory: ProviderFactory, + private val objectFactory: ObjectFactory, + private val projectLayout: ProjectLayout, + private val fileOperations: FileOperations, + ) : CInteropSettings { + private fun files() = objectFactory.fileCollection() + private fun files(vararg paths: Any) = objectFactory.fileCollection().from(*paths) inner class DefaultIncludeDirectories : IncludeDirectories { - var allHeadersDirs: FileCollection = project.files() - var headerFilterDirs: FileCollection = project.files() + var allHeadersDirs: FileCollection = files() + var headerFilterDirs: FileCollection = files() override fun allHeaders(vararg includeDirs: Any) = allHeaders(includeDirs.toList()) override fun allHeaders(includeDirs: Collection) { - allHeadersDirs += project.files(*includeDirs.toTypedArray()) + allHeadersDirs += files(*includeDirs.toTypedArray()) } override fun headerFilterOnly(vararg includeDirs: Any) = headerFilterOnly(includeDirs.toList()) override fun headerFilterOnly(includeDirs: Collection) { - headerFilterDirs += project.files(*includeDirs.toTypedArray()) + headerFilterDirs += files(*includeDirs.toTypedArray()) } } @@ -54,7 +63,7 @@ abstract class DefaultCInteropSettings @Inject constructor( override val dependencyConfigurationName: String get() = compilation.disambiguateName("${name.capitalize()}CInterop") - override var dependencyFiles: FileCollection = project.files() + override var dependencyFiles: FileCollection = files() val interopProcessingTaskName: String get() = lowerCamelCaseName( @@ -64,8 +73,8 @@ abstract class DefaultCInteropSettings @Inject constructor( target?.disambiguationClassifier ?: compilation.compilationClassifier ) - val defFileProperty: Property = project.objects.property(File::class.java) - .apply { set(project.projectDir.resolve("src/nativeInterop/cinterop/$name.def")) } + val defFileProperty: Property = objectFactory.property(File::class.java) + .apply { set(projectLayout.projectDirectory.asFile.resolve("src/nativeInterop/cinterop/$name.def")) } var defFile: File get() = defFileProperty.get() @@ -79,26 +88,26 @@ abstract class DefaultCInteropSettings @Inject constructor( _packageNameProp.set(value) } - internal val _packageNameProp: Property = project.objects.property(String::class.java) + internal val _packageNameProp: Property = objectFactory.property(String::class.java) val compilerOpts = mutableListOf() val linkerOpts = mutableListOf() var extraOpts: List get() = _extraOptsProp.get() set(value) { - _extraOptsProp = project.objects.listProperty(String::class.java) + _extraOptsProp = objectFactory.listProperty(String::class.java) extraOpts(value) } - internal var _extraOptsProp: ListProperty = project.objects.listProperty(String::class.java) + internal var _extraOptsProp: ListProperty = objectFactory.listProperty(String::class.java) val includeDirs = DefaultIncludeDirectories() - var headers: FileCollection = project.files() + var headers: FileCollection = files() // DSL methods. override fun defFile(file: Any) { - defFileProperty.set(project.file(file)) + defFileProperty.set(fileOperations.file(file)) } override fun packageName(value: String) { @@ -106,7 +115,7 @@ abstract class DefaultCInteropSettings @Inject constructor( } override fun header(file: Any) = headers(file) - override fun headers(vararg files: Any) = headers(project.files(files)) + override fun headers(vararg files: Any) = headers(files(files)) override fun headers(files: FileCollection) { headers += files } @@ -127,7 +136,7 @@ abstract class DefaultCInteropSettings @Inject constructor( override fun extraOpts(vararg values: Any) = extraOpts(values.toList()) override fun extraOpts(values: List) { - _extraOptsProp.addAll(project.provider { values.map { it.toString() } }) + _extraOptsProp.addAll(providerFactory.provider { values.map { it.toString() } }) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt index fbe8a355b6f..12faf0e1167 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt @@ -96,7 +96,7 @@ abstract class KotlinNativeCompilation @Inject constructor( // Interop DSL. val cinterops = project.container(DefaultCInteropSettings::class.java) { cinteropName -> - project.objects.newInstance(DefaultCInteropSettings::class.java, project, cinteropName, this) + project.objects.newInstance(DefaultCInteropSettings::class.java, cinteropName, this) } fun cinterops(action: Action>) = action.execute(cinterops) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt index a76eeecbe61..f4dfe2b6cff 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt @@ -61,6 +61,7 @@ import org.jetbrains.kotlin.library.* import org.jetbrains.kotlin.project.model.LanguageSettings import java.io.File import java.nio.file.Files +import java.nio.file.Path import javax.inject.Inject import org.jetbrains.kotlin.konan.file.File as KFile import org.jetbrains.kotlin.utils.ResolvedDependencies as KResolvedDependencies @@ -112,8 +113,13 @@ private fun File.providedByCompiler(project: Project): Boolean = // We need to filter out interop duplicates because we create copy of them for IDE. // TODO: Remove this after interop rework. -private fun FileCollection.filterOutPublishableInteropLibs(project: Project): FileCollection { - val libDirectories = project.rootProject.allprojects.map { it.buildDir.resolve("libs").absoluteFile.toPath() } +private fun FileCollection.filterOutPublishableInteropLibs(project: Project): FileCollection = + filterOutPublishableInteropLibs(project.buildLibDirectories()) + +private fun Project.buildLibDirectories(): List = + rootProject.allprojects.map { it.buildDir.resolve("libs").absoluteFile.toPath() } + +private fun FileCollection.filterOutPublishableInteropLibs(libDirectories: List): FileCollection { return filter { file -> !(file.name.contains("-cinterop-") && libDirectories.any { file.toPath().startsWith(it) }) } @@ -1148,7 +1154,6 @@ internal class CacheBuilder( @CacheableTask open class CInteropProcess @Inject constructor( - @Transient @Internal val settings: DefaultCInteropSettings, private val objectFactory: ObjectFactory, @@ -1196,36 +1201,38 @@ open class CInteropProcess @get:InputFile @get:PathSensitive(PathSensitivity.RELATIVE) - val defFile: File = settings.defFileProperty.get() + val defFile: File get() = settings.defFileProperty.get() @get:Optional @get:Input - val packageName: String? = settings.packageName + val packageName: String? get() = settings.packageName @get:Input - val compilerOpts: List = settings.compilerOpts + val compilerOpts: List get() = settings.compilerOpts @get:Input - val linkerOpts: List = settings.linkerOpts + val linkerOpts: List get() = settings.linkerOpts @get:IgnoreEmptyDirectories @get:InputFiles @get:PathSensitive(PathSensitivity.RELATIVE) - val headers: FileCollection = settings.headers + val headers: FileCollection get() = settings.headers @get:Input - val allHeadersDirs: Set = settings.includeDirs.allHeadersDirs.files + val allHeadersDirs: Set get() = settings.includeDirs.allHeadersDirs.files @get:Input - val headerFilterDirs: Set = settings.includeDirs.headerFilterDirs.files + val headerFilterDirs: Set get() = settings.includeDirs.headerFilterDirs.files + + private val libDirectories = project.buildLibDirectories() @get:IgnoreEmptyDirectories @get:InputFiles @get:PathSensitive(PathSensitivity.RELATIVE) - val libraries: FileCollection = settings.dependencyFiles.filterOutPublishableInteropLibs(project) + val libraries: FileCollection get() = settings.dependencyFiles.filterOutPublishableInteropLibs(libDirectories) @get:Input - val extraOpts: List = settings.extraOpts + val extraOpts: List get() = settings.extraOpts private val isInIdeaSync = project.isInIdeaSync