From 003cb156bf2111971caeeb4d98a50ce39e9c2bd8 Mon Sep 17 00:00:00 2001 From: "konstantin.tskhovrebov" Date: Tue, 7 Dec 2021 18:05:37 +0100 Subject: [PATCH] KT-50106 Add gradle property with global K/N linker flags --- .../gradle/native/NativeLibraryDslIT.kt | 33 ++++++++++++++++++ .../gradle/native/NativePlatformLibsIT.kt | 34 +++++++++++++++++++ .../shared/build.gradle.kts | 3 ++ .../kotlin/gradle/plugin/KotlinProperties.kt | 6 ++++ .../targets/native/tasks/KotlinNativeTasks.kt | 3 +- .../artifact/KotlinNativeLinkArtifactTask.kt | 2 +- 6 files changed, 79 insertions(+), 2 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeLibraryDslIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeLibraryDslIT.kt index 16729e1885e..cc5e3631fed 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeLibraryDslIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeLibraryDslIT.kt @@ -7,8 +7,11 @@ package org.jetbrains.kotlin.gradle.native import org.jetbrains.kotlin.gradle.BaseGradleIT import org.jetbrains.kotlin.gradle.GradleVersionRequired +import org.jetbrains.kotlin.gradle.native.GeneralNativeIT.Companion.withNativeCommandLineArguments import org.jetbrains.kotlin.konan.target.HostManager import org.junit.Assume +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue import kotlin.test.Test class NativeLibraryDslIT : BaseGradleIT() { @@ -70,6 +73,36 @@ class NativeLibraryDslIT : BaseGradleIT() { assertTasksNotExecuted( ":lib:compileKotlinLinuxX64" ) + withNativeCommandLineArguments(":shared:assembleMylibDebugSharedLibraryLinuxX64") { + assertFalse(it.contains("-Xfoo=bar")) + assertFalse(it.contains("-Xbaz=qux")) + assertTrue(it.contains("-Xmen=pool")) + } + assertFileExists("/shared/build/out/dynamic/linux_x64/debug/libmylib.so") + assertFileExists("/shared/build/out/dynamic/linux_x64/debug/libmylib_api.h") + } + } + } + + @Test + fun `link shared library from single gradle module with additional link args`() { + with(Project("new-kn-library-dsl")) { + setupWorkingDir() + gradleProperties().appendText("\nkotlin.native.linkArgs=-Xfoo=bar -Xbaz=qux") + build(":shared:assembleMylibDebugSharedLibraryLinuxX64") { + assertSuccessful() + assertTasksExecuted( + ":shared:compileKotlinLinuxX64", + ":shared:assembleMylibDebugSharedLibraryLinuxX64" + ) + assertTasksNotExecuted( + ":lib:compileKotlinLinuxX64" + ) + withNativeCommandLineArguments(":shared:assembleMylibDebugSharedLibraryLinuxX64") { + assertTrue(it.contains("-Xfoo=bar")) + assertTrue(it.contains("-Xbaz=qux")) + assertTrue(it.contains("-Xmen=pool")) + } assertFileExists("/shared/build/out/dynamic/linux_x64/debug/libmylib.so") assertFileExists("/shared/build/out/dynamic/linux_x64/debug/libmylib_api.h") } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativePlatformLibsIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativePlatformLibsIT.kt index d7c01f69458..a0e99707fac 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativePlatformLibsIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativePlatformLibsIT.kt @@ -158,6 +158,40 @@ class NativePlatformLibsIT : BaseGradleIT() { } } + @Test + fun testLinkerArgsViaGradleProperties() { + with(Project("native-platform-libraries")) { + setupWorkingDir() + gradleProperties().apply { + configureJvmMemory() + appendText("\nkotlin.native.linkArgs=-Xfoo=bar -Xbaz=qux") + } + gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) + gradleBuildScript().appendText(""" + kotlin.linuxX64() { + binaries.sharedLib { + freeCompilerArgs += "-Xmen=pool" + } + } + """.trimIndent()) + build("linkDebugSharedLinuxX64") { + assertSuccessful() + assertTasksExecuted( + ":compileKotlinLinuxX64", + ":linkDebugSharedLinuxX64" + ) + assertContains("-Xfoo=bar") + assertContains("-Xbaz=qux") + assertContains("-Xmen=pool") + assertContains("w: Flag is not supported by this version of the compiler: -Xfoo=bar") + assertContains("w: Flag is not supported by this version of the compiler: -Xbaz=qux") + assertContains("w: Flag is not supported by this version of the compiler: -Xmen=pool") + assertFileExists("/build/bin/linuxX64/debugShared/libnative_platform_libraries.so") + assertFileExists("/build/bin/linuxX64/debugShared/libnative_platform_libraries_api.h") + } + } + } + @Test fun testNoGenerationForUnsupportedHost() { deleteInstalledCompilers() diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-kn-library-dsl/shared/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-kn-library-dsl/shared/build.gradle.kts index 336ce3b28a8..3a4bdb35369 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-kn-library-dsl/shared/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-kn-library-dsl/shared/build.gradle.kts @@ -12,6 +12,9 @@ kotlin { kotlinArtifacts { Native.Library("mylib") { target = linuxX64 + kotlinOptions { + freeCompilerArgs += "-Xmen=pool" + } } Native.Library("myslib") { target = linuxX64 diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt index 621c6a68727..5fcddf59087 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt @@ -292,6 +292,12 @@ internal class PropertiesProvider private constructor(private val project: Proje val nativeJvmArgs: String? get() = propertyWithDeprecatedVariant("kotlin.native.jvmArgs", "org.jetbrains.kotlin.native.jvmArgs") + /** + * Allows a user to specify free compiler arguments for K/N linker. + */ + val nativeLinkArgs: List + get() = property("kotlin.native.linkArgs").orEmpty().split(' ').filterNot { it.isBlank() } + /** * Forces to run a compilation in a separate JVM. */ 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 0b7953644c6..90695884cc3 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 @@ -520,7 +520,8 @@ constructor( override val additionalCompilerOptions: Provider> = project.provider { kotlinOptions.freeCompilerArgs + compilation.kotlinOptions.freeCompilerArgs + - ((languageSettings as? DefaultLanguageSettingsBuilder)?.freeCompilerArgs ?: emptyList()) + ((languageSettings as? DefaultLanguageSettingsBuilder)?.freeCompilerArgs ?: emptyList()) + + PropertiesProvider(project).nativeLinkArgs } override val kotlinOptions: KotlinCommonToolOptions = NativeLinkOptions() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinNativeLinkArtifactTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinNativeLinkArtifactTask.kt index 95426dbcb65..90fec44ca99 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinNativeLinkArtifactTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinNativeLinkArtifactTask.kt @@ -111,7 +111,7 @@ open class KotlinNativeLinkArtifactTask @Inject constructor( override var allWarningsAsErrors: Boolean = false override var suppressWarnings: Boolean = false override var verbose: Boolean = false - override var freeCompilerArgs: List = listOf() + override var freeCompilerArgs: List = PropertiesProvider(project).nativeLinkArgs } fun kotlinOptions(fn: KotlinCommonToolOptions.() -> Unit) {