Improve produced framework layout on mac
This commit is contained in:
committed by
SvyatoslavScherbina
parent
b5e81a8008
commit
d51e0e0a30
+9
-3
@@ -338,9 +338,15 @@ internal class LinkStage(val context: Context) {
|
|||||||
} else {
|
} else {
|
||||||
val framework = File(context.config.outputFile)
|
val framework = File(context.config.outputFile)
|
||||||
val dylibName = framework.name.removeSuffix(".framework")
|
val dylibName = framework.name.removeSuffix(".framework")
|
||||||
frameworkLinkerArgs = listOf("-install_name", "@rpath/${framework.name}/$dylibName")
|
val dylibRelativePath = when (target) {
|
||||||
framework.mkdirs()
|
KonanTarget.IPHONE, KonanTarget.IPHONE_SIM -> dylibName
|
||||||
executable = framework.child(dylibName).absolutePath
|
KonanTarget.MACBOOK -> "Versions/A/$dylibName"
|
||||||
|
else -> error(target)
|
||||||
|
}
|
||||||
|
frameworkLinkerArgs = listOf("-install_name", "@rpath/${framework.name}/$dylibRelativePath")
|
||||||
|
val dylibPath = framework.child(dylibRelativePath)
|
||||||
|
dylibPath.parentFile.mkdirs()
|
||||||
|
executable = dylibPath.absolutePath
|
||||||
}
|
}
|
||||||
|
|
||||||
val linkCommand = platform.linkCommand(objectFiles, executable, optimize, debug, dynamic) +
|
val linkCommand = platform.linkCommand(objectFiles, executable, optimize, debug, dynamic) +
|
||||||
|
|||||||
+19
-6
@@ -42,7 +42,13 @@ internal class ObjCExport(val context: Context) {
|
|||||||
val mapper = headerGenerator.mapper
|
val mapper = headerGenerator.mapper
|
||||||
|
|
||||||
val framework = File(context.config.outputFile)
|
val framework = File(context.config.outputFile)
|
||||||
val headers = framework.child("Headers")
|
val frameworkContents = when (target) {
|
||||||
|
KonanTarget.IPHONE, KonanTarget.IPHONE_SIM -> framework
|
||||||
|
KonanTarget.MACBOOK -> framework.child("Versions/A")
|
||||||
|
else -> error(target)
|
||||||
|
}
|
||||||
|
|
||||||
|
val headers = frameworkContents.child("Headers")
|
||||||
|
|
||||||
val frameworkName = framework.name.removeSuffix(".framework")
|
val frameworkName = framework.name.removeSuffix(".framework")
|
||||||
val headerName = frameworkName + ".h"
|
val headerName = frameworkName + ".h"
|
||||||
@@ -50,7 +56,7 @@ internal class ObjCExport(val context: Context) {
|
|||||||
headers.mkdirs()
|
headers.mkdirs()
|
||||||
header.writeLines(headerGenerator.build())
|
header.writeLines(headerGenerator.build())
|
||||||
|
|
||||||
val modules = framework.child("Modules")
|
val modules = frameworkContents.child("Modules")
|
||||||
modules.mkdirs()
|
modules.mkdirs()
|
||||||
|
|
||||||
val moduleMap = """
|
val moduleMap = """
|
||||||
@@ -64,17 +70,24 @@ internal class ObjCExport(val context: Context) {
|
|||||||
|
|
||||||
modules.child("module.modulemap").writeBytes(moduleMap.toByteArray())
|
modules.child("module.modulemap").writeBytes(moduleMap.toByteArray())
|
||||||
|
|
||||||
emitInfoPlist(framework, frameworkName)
|
emitInfoPlist(frameworkContents, frameworkName)
|
||||||
|
|
||||||
|
if (target == KonanTarget.MACBOOK) {
|
||||||
|
framework.child("Versions/Current").createAsSymlink("A")
|
||||||
|
for (child in listOf(frameworkName, "Headers", "Modules", "Resources")) {
|
||||||
|
framework.child(child).createAsSymlink("Versions/Current/$child")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val objCCodeGenerator = ObjCExportCodeGenerator(CodeGenerator(context), namer, mapper)
|
val objCCodeGenerator = ObjCExportCodeGenerator(CodeGenerator(context), namer, mapper)
|
||||||
objCCodeGenerator.emitRtti(headerGenerator.generatedClasses, headerGenerator.topLevel)
|
objCCodeGenerator.emitRtti(headerGenerator.generatedClasses, headerGenerator.topLevel)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun emitInfoPlist(framework: File, name: String) {
|
private fun emitInfoPlist(frameworkContents: File, name: String) {
|
||||||
val directory = when (target) {
|
val directory = when (target) {
|
||||||
KonanTarget.IPHONE,
|
KonanTarget.IPHONE,
|
||||||
KonanTarget.IPHONE_SIM -> framework
|
KonanTarget.IPHONE_SIM -> frameworkContents
|
||||||
KonanTarget.MACBOOK -> framework.child("Resources").also { it.mkdirs() }
|
KonanTarget.MACBOOK -> frameworkContents.child("Resources").also { it.mkdirs() }
|
||||||
else -> error(target)
|
else -> error(target)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,8 @@ data class File constructor(internal val javaPath: Path) {
|
|||||||
get() = javaPath.fileName.toString()
|
get() = javaPath.fileName.toString()
|
||||||
val parent: String
|
val parent: String
|
||||||
get() = javaPath.parent.toString()
|
get() = javaPath.parent.toString()
|
||||||
|
val parentFile: File
|
||||||
|
get() = File(javaPath.parent)
|
||||||
|
|
||||||
val exists
|
val exists
|
||||||
get() = Files.exists(javaPath)
|
get() = Files.exists(javaPath)
|
||||||
@@ -121,6 +123,14 @@ data class File constructor(internal val javaPath: Path) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun createAsSymlink(target: String) {
|
||||||
|
val targetPath = Paths.get(target)
|
||||||
|
if (Files.isSymbolicLink(this.javaPath) && Files.readSymbolicLink(javaPath) == targetPath) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Files.createSymbolicLink(this.javaPath, targetPath)
|
||||||
|
}
|
||||||
|
|
||||||
override fun toString() = path
|
override fun toString() = path
|
||||||
|
|
||||||
// TODO: Consider removeing these after konanazing java.util.Properties.
|
// TODO: Consider removeing these after konanazing java.util.Properties.
|
||||||
|
|||||||
Reference in New Issue
Block a user