From 01622f069e36eb7e166e4a75fee9446a0d6e6e0e Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Wed, 11 Dec 2019 19:46:37 +0700 Subject: [PATCH] Gradle, native: Support exporting dependencies for static and shared libs Issue #KT-35352 fixed --- .../kotlin/gradle/NewMultiplatformIT.kt | 25 ++++++-- .../groovy-dsl/build.gradle | 8 ++- .../kotlin-dsl/build.gradle.kts | 8 ++- .../native/KotlinNativeTargetConfigurator.kt | 2 +- .../gradle/targets/native/NativeBinaries.kt | 57 +++++++++++-------- .../targets/native/tasks/KotlinNativeTasks.kt | 2 +- 6 files changed, 65 insertions(+), 37 deletions(-) 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 d250dd25e51..3180a0019af 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 @@ -1037,8 +1037,8 @@ class NewMultiplatformIT : BaseGradleIT() { val prefix = outputKind.prefix(HostManager.host) val suffix = outputKind.suffix(HostManager.host) val fileName = "$prefix$fileBaseName$suffix" - "build/bin/$nativeHostTargetName/$name/$fileName" - } + name to "build/bin/$nativeHostTargetName/$name/$fileName" + }.toMap() val runTasks = listOf( "runDebugExecutable", @@ -1060,12 +1060,22 @@ class NewMultiplatformIT : BaseGradleIT() { assertSuccessful() assertTasksExecuted(linkTasks.map { ":$it" }) assertTasksExecuted(":$compileTask", ":$compileTestTask") - outputFiles.forEach { - assertFileExists(it) + outputFiles.forEach { (_, file) -> + assertFileExists(file) } // Check that getters work fine. assertTrue(output.contains("Check link task: linkReleaseShared$hostSuffix")) assertTrue(output.contains("Check run task: runFooReleaseExecutable$hostSuffix")) + + // Check that dependency export works for static and shared libs. + val staticSuffix = CompilerOutputKind.STATIC.suffix(HostManager.host) + val sharedSuffix = CompilerOutputKind.DYNAMIC.suffix(HostManager.host) + val staticPrefix = CompilerOutputKind.STATIC.prefix(HostManager.host) + val sharedPrefix = CompilerOutputKind.DYNAMIC.prefix(HostManager.host) + val staticHeader = outputFiles.getValue("releaseStatic").removeSuffix(staticSuffix) + "_api.h" + val sharedHeader = outputFiles.getValue("releaseShared").removeSuffix(sharedSuffix) + "_api.h" + assertTrue(fileInWorkingDir(staticHeader).readText().contains("${staticPrefix}native_binary_KInt (*exported)();")) + assertTrue(fileInWorkingDir(sharedHeader).readText().contains("${sharedPrefix}native_binary_KInt (*exported)();")) } build("tasks") { @@ -1140,8 +1150,11 @@ class NewMultiplatformIT : BaseGradleIT() { build("linkDebugFrameworkIos") { assertSuccessful() assertFileExists("build/bin/ios/debugFramework/native_binary.framework") - fileInWorkingDir("build/bin/ios/debugFramework/native_binary.framework/Headers/native_binary.h") - .readText().contains("+ (int32_t)exported") + assertTrue( + fileInWorkingDir("build/bin/ios/debugFramework/native_binary.framework/Headers/native_binary.h") + .readText() + .contains("+ (int32_t)exported") + ) // Check that by default debug frameworks have bitcode marker embedded. checkNativeCommandLineFor(":linkDebugFrameworkIos") { assertTrue(it.contains("-Xembed-bitcode-marker")) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-native-binaries/groovy-dsl/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-native-binaries/groovy-dsl/build.gradle index 777ea9ed6c8..3b514dfdf80 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-native-binaries/groovy-dsl/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-native-binaries/groovy-dsl/build.gradle @@ -61,8 +61,12 @@ kotlin { } } - sharedLib([RELEASE]) - staticLib([RELEASE]) + sharedLib([RELEASE]) { + export project(':exported') + } + staticLib([RELEASE]) { + export project(':exported') + } } // Check that we can access binaries/tasks: // Just by name: diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-native-binaries/kotlin-dsl/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-native-binaries/kotlin-dsl/build.gradle.kts index d30d90837bc..2ad3d6217df 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-native-binaries/kotlin-dsl/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-native-binaries/kotlin-dsl/build.gradle.kts @@ -51,8 +51,12 @@ kotlin { } } - sharedLib(listOf(RELEASE)) - staticLib(listOf(RELEASE)) + sharedLib(listOf(RELEASE)) { + export(project(":exported")) + } + staticLib(listOf(RELEASE)) { + export(project(":exported")) + } } // Check that we can access binaries/tasks: // Just by name: diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt index d9f3ef3bc77..01cdf9cef1a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt @@ -304,7 +304,7 @@ open class KotlinNativeTargetConfigurator( } } - target.binaries.withType(Framework::class.java).all { framework -> + target.binaries.withType(AbstractNativeLibrary::class.java).all { framework -> val exportConfiguration = project.configurations.maybeCreate(framework.exportConfigurationName).apply { isVisible = false isTransitive = false diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt index ec3b538595a..1e7e84c104b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt @@ -155,37 +155,13 @@ class TestExecutable( get() = NativeOutputKind.TEST } -class StaticLibrary( - name: String, - baseName: String, - buildType: NativeBuildType, - compilation: KotlinNativeCompilation -) : NativeBinary(name, baseName, buildType, compilation) { - override val outputKind: NativeOutputKind - get() = NativeOutputKind.STATIC -} - -class SharedLibrary( - name: String, - baseName: String, - buildType: NativeBuildType, - compilation: KotlinNativeCompilation -) : NativeBinary(name, baseName, buildType, compilation) { - override val outputKind: NativeOutputKind - get() = NativeOutputKind.DYNAMIC -} - -class Framework( +abstract class AbstractNativeLibrary( name: String, baseName: String, buildType: NativeBuildType, compilation: KotlinNativeCompilation ) : NativeBinary(name, baseName, buildType, compilation) { - override val outputKind: NativeOutputKind - get() = NativeOutputKind.FRAMEWORK - - // Export symbols from klibraries. val exportConfigurationName: String get() = target.disambiguateName(lowerCamelCaseName(name, "export")) @@ -220,6 +196,37 @@ class Framework( configure.execute(it) } } +} + +class StaticLibrary( + name: String, + baseName: String, + buildType: NativeBuildType, + compilation: KotlinNativeCompilation +) : AbstractNativeLibrary(name, baseName, buildType, compilation) { + override val outputKind: NativeOutputKind + get() = NativeOutputKind.STATIC +} + +class SharedLibrary( + name: String, + baseName: String, + buildType: NativeBuildType, + compilation: KotlinNativeCompilation +) : AbstractNativeLibrary(name, baseName, buildType, compilation) { + override val outputKind: NativeOutputKind + get() = NativeOutputKind.DYNAMIC +} + +class Framework( + name: String, + baseName: String, + buildType: NativeBuildType, + compilation: KotlinNativeCompilation +) : AbstractNativeLibrary(name, baseName, buildType, compilation) { + + override val outputKind: NativeOutputKind + get() = NativeOutputKind.FRAMEWORK // Embedding bitcode. /** diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt index 195993703d0..496f7cd3ebb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt @@ -493,7 +493,7 @@ open class KotlinNativeLink : AbstractKotlinNativeCompile