Support static ObjC frameworks

This commit is contained in:
Ilya Matveev
2019-02-06 17:46:22 +03:00
committed by Ilya Matveev
parent eb9965d2c8
commit 0647194a45
4 changed files with 38 additions and 6 deletions
@@ -149,6 +149,7 @@ class K2Native : CLICompiler<K2NativeCompilerArguments>() {
put(LIST_TARGETS, arguments.listTargets)
put(OPTIMIZATION, arguments.optimization)
put(DEBUG, arguments.debug)
put(STATIC_FRAMEWORK, selectFrameworkType(configuration, arguments, outputKind))
put(PRINT_IR, arguments.printIr)
put(PRINT_IR_WITH_DESCRIPTORS, arguments.printIrWithDescriptors)
@@ -219,6 +220,23 @@ class K2Native : CLICompiler<K2NativeCompilerArguments>() {
}
}
private fun selectFrameworkType(
configuration: CompilerConfiguration,
arguments: K2NativeCompilerArguments,
outputKind: CompilerOutputKind
): Boolean {
return if (outputKind != CompilerOutputKind.FRAMEWORK && arguments.staticFramework) {
configuration.report(
STRONG_WARNING,
"'$STATIC_FRAMEWORK_FLAG' is only supported when producing frameworks, " +
"but the compiler is producing ${outputKind.name.toLowerCase()}"
)
false
} else {
arguments.staticFramework
}
}
private fun selectBitcodeEmbeddingMode(
configuration: CompilerConfiguration,
arguments: K2NativeCompilerArguments,
@@ -134,6 +134,9 @@ class K2NativeCompilerArguments : CommonCompilerArguments() {
@Argument(value = "-Xruntime", deprecatedName = "--runtime", valueDescription = "<path>", description = "Override standard 'runtime.bc' location")
var runtimeFile: String? = null
@Argument(value = STATIC_FRAMEWORK_FLAG, description = "Create a framework with a static library instead of a dynamic one")
var staticFramework: Boolean = false
@Argument(value = "-Xtemporary-files-dir", deprecatedName = "--temporary_files_dir", valueDescription = "<path>", description = "Save temporary files to the given directory")
var temporaryFilesDir: String? = null
@@ -168,3 +171,4 @@ class K2NativeCompilerArguments : CommonCompilerArguments() {
const val EMBED_BITCODE_FLAG = "-Xembed-bitcode"
const val EMBED_BITCODE_MARKER_FLAG = "-Xembed-bitcode-marker"
const val STATIC_FRAMEWORK_FLAG = "-Xstatic-framework"
@@ -88,6 +88,8 @@ class KonanConfigKeys {
= CompilerConfigurationKey.create("override default runtime file path")
val SOURCE_MAP: CompilerConfigurationKey<List<String>>
= CompilerConfigurationKey.create("generate source map")
val STATIC_FRAMEWORK: CompilerConfigurationKey<Boolean>
= CompilerConfigurationKey.create("Produce a static library for a framework")
val TARGET: CompilerConfigurationKey<String?>
= CompilerConfigurationKey.create("target we compile for")
val TEMPORARY_FILES_DIR: CompilerConfigurationKey<String?>
@@ -15,6 +15,18 @@ typealias BitcodeFile = String
typealias ObjectFile = String
typealias ExecutableFile = String
private fun determineLinkerOutput(context: Context): LinkerOutputKind =
when (context.config.produce) {
CompilerOutputKind.FRAMEWORK -> {
val staticFramework = context.config.configuration.getBoolean(KonanConfigKeys.STATIC_FRAMEWORK)
if (staticFramework) LinkerOutputKind.STATIC_LIBRARY else LinkerOutputKind.DYNAMIC_LIBRARY
}
CompilerOutputKind.DYNAMIC -> LinkerOutputKind.DYNAMIC_LIBRARY
CompilerOutputKind.STATIC -> LinkerOutputKind.STATIC_LIBRARY
CompilerOutputKind.PROGRAM -> LinkerOutputKind.EXECUTABLE
else -> TODO("${context.config.produce} should not reach native linker stage")
}
internal class LinkStage(val context: Context) {
private val config = context.config.configuration
@@ -24,12 +36,8 @@ internal class LinkStage(val context: Context) {
private val optimize = context.shouldOptimize()
private val debug = context.config.debug
private val linkerOutput = when (context.config.produce) {
CompilerOutputKind.DYNAMIC, CompilerOutputKind.FRAMEWORK -> LinkerOutputKind.DYNAMIC_LIBRARY
CompilerOutputKind.STATIC -> LinkerOutputKind.STATIC_LIBRARY
CompilerOutputKind.PROGRAM -> LinkerOutputKind.EXECUTABLE
else -> TODO("${context.config.produce} should not reach native linker stage")
}
private val linkerOutput = determineLinkerOutput(context)
private val nomain = config.get(KonanConfigKeys.NOMAIN) ?: false
private val emitted = context.bitcodeFileName
private val libraries = context.llvm.librariesToLink