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 9ded1509519..64db88a3386 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 @@ -492,7 +492,7 @@ open class KotlinNativeTargetConfigurator( } } else { group = RUN_GROUP - description = "Executes Kotlin/Native executable ${binary.baseName} for target ${binary.target.name}" + description = "Executes Kotlin/Native executable ${binary.name} for target ${binary.target.name}" } enabled = binary.target.konanTarget.isCurrentHost diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/NativeBinaries.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/NativeBinaries.kt index 7de11172ecd..ec0332afa79 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/NativeBinaries.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/NativeBinaries.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinNativeCompile import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName +import org.jetbrains.kotlin.konan.target.Family import java.io.File // TODO: Should the baseName be a var? @@ -42,8 +43,8 @@ sealed class NativeBinary( abstract val outputKind: NativeOutputKind // Configuration DSL. - var debuggable: Boolean = false - var optimized: Boolean = false + var debuggable: Boolean = buildType.debuggable + var optimized: Boolean = buildType.optimized var linkerOpts: MutableList = mutableListOf() @@ -149,22 +150,68 @@ class Framework( override val outputKind: NativeOutputKind get() = NativeOutputKind.FRAMEWORK + // Export symbols from klibraries. val exportConfigurationName: String get() = target.disambiguateName(lowerCamelCaseName(name, "export")) + /** + * If dependencies added by the [export] method are resolved transitively or not. + */ var transitiveExport: Boolean get() = project.configurations.maybeCreate(exportConfigurationName).isTransitive set(value) { project.configurations.maybeCreate(exportConfigurationName).isTransitive = value } + /** + * Add a dependency to be exported in the framework. + */ fun export(dependency: Any) { project.dependencies.add(exportConfigurationName, dependency) } + /** + * Add a dependency to be exported in the framework. + */ fun export(dependency: Any, configure: Closure<*>) { project.dependencies.add(exportConfigurationName, dependency, configure) } + + // Embedding bitcode. + /** + * Embed bitcode for the framework or not. See [BitcodeEmbeddingMode]. + */ + var embedBitcode: BitcodeEmbeddingMode = if (target.konanTarget.family == Family.IOS) { + buildType.iosEmbedBitcode + } else { + BitcodeEmbeddingMode.DISABLE + } + + /** + * Enable or disable embedding bitcode for the framework. See [BitcodeEmbeddingMode]. + */ + fun embedBitcode(mode: BitcodeEmbeddingMode) { + embedBitcode = mode + } + + /** + * Enable or disable embedding bitcode for the framework. + * + * @param mode - one of the following string constants: + * disable - Don't embed LLVM IR bitcode. + * bitcode - Embed LLVM IR bitcode as data. Has the same effect as the -Xembed-bitcode command line option. + * marker - Embed placeholder LLVM IR data as a marker. Has the same effect as the -Xembed-bitcode-marker command line option. + */ + fun embedBitcode(mode: String) = embedBitcode(BitcodeEmbeddingMode.valueOf(mode.toUpperCase())) + + enum class BitcodeEmbeddingMode { + /** Don't embed LLVM IR bitcode. */ + DISABLE, + /** Embed LLVM IR bitcode as data. */ + BITCODE, + /** Embed placeholder LLVM IR data as a marker. */ + MARKER, + } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/NativeBinaryTypes.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/NativeBinaryTypes.kt index 65565ede859..ea36bf2f362 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/NativeBinaryTypes.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/NativeBinaryTypes.kt @@ -5,14 +5,13 @@ import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.Family import org.jetbrains.kotlin.konan.target.KonanTarget -object KotlinNativeUsage { - const val KLIB = "kotlin-native-klib" - const val FRAMEWORK = "kotlin-native-framework" -} - -enum class NativeBuildType(val optimized: Boolean, val debuggable: Boolean) : Named { - RELEASE(true, false), - DEBUG(false, true); +enum class NativeBuildType( + val optimized: Boolean, + val debuggable: Boolean, + internal val iosEmbedBitcode: Framework.BitcodeEmbeddingMode +) : Named { + RELEASE(true, false, Framework.BitcodeEmbeddingMode.BITCODE), + DEBUG(false, true, Framework.BitcodeEmbeddingMode.MARKER); override fun getName(): String = name.toLowerCase() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinNativeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinNativeTasks.kt index 076a466afd4..87dca6570dc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinNativeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinNativeTasks.kt @@ -370,11 +370,20 @@ open class KotlinNativeLink : AbstractKotlinNativeCompile() { } } + @get:Input + val embedBitcode: Framework.BitcodeEmbeddingMode + get() = (binary as? Framework)?.embedBitcode ?: Framework.BitcodeEmbeddingMode.DISABLE + override fun buildArgs(defaultsOnly: Boolean): List { val superArgs = super.buildArgs(defaultsOnly) return mutableListOf().apply { addAll(superArgs) addArgIfNotNull("-entry", entryPoint) + when (embedBitcode) { + Framework.BitcodeEmbeddingMode.MARKER -> add("-Xembed-bitcode-marker") + Framework.BitcodeEmbeddingMode.BITCODE -> add("-Xembed-bitcode") + else -> { /* Do nothing. */ } + } addListArg("-linker-options", linkerOpts) exportLibraries.files.filterExternalKlibs(project).forEach { add("-Xexport-library=${it.absolutePath}")