Improve produced framework layout on mac

This commit is contained in:
Svyatoslav Scherbina
2017-12-04 14:50:32 +03:00
committed by SvyatoslavScherbina
parent b5e81a8008
commit d51e0e0a30
3 changed files with 38 additions and 9 deletions
@@ -338,9 +338,15 @@ internal class LinkStage(val context: Context) {
} else {
val framework = File(context.config.outputFile)
val dylibName = framework.name.removeSuffix(".framework")
frameworkLinkerArgs = listOf("-install_name", "@rpath/${framework.name}/$dylibName")
framework.mkdirs()
executable = framework.child(dylibName).absolutePath
val dylibRelativePath = when (target) {
KonanTarget.IPHONE, KonanTarget.IPHONE_SIM -> dylibName
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) +
@@ -42,7 +42,13 @@ internal class ObjCExport(val context: Context) {
val mapper = headerGenerator.mapper
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 headerName = frameworkName + ".h"
@@ -50,7 +56,7 @@ internal class ObjCExport(val context: Context) {
headers.mkdirs()
header.writeLines(headerGenerator.build())
val modules = framework.child("Modules")
val modules = frameworkContents.child("Modules")
modules.mkdirs()
val moduleMap = """
@@ -64,17 +70,24 @@ internal class ObjCExport(val context: Context) {
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)
objCCodeGenerator.emitRtti(headerGenerator.generatedClasses, headerGenerator.topLevel)
}
private fun emitInfoPlist(framework: File, name: String) {
private fun emitInfoPlist(frameworkContents: File, name: String) {
val directory = when (target) {
KonanTarget.IPHONE,
KonanTarget.IPHONE_SIM -> framework
KonanTarget.MACBOOK -> framework.child("Resources").also { it.mkdirs() }
KonanTarget.IPHONE_SIM -> frameworkContents
KonanTarget.MACBOOK -> frameworkContents.child("Resources").also { it.mkdirs() }
else -> error(target)
}
@@ -39,6 +39,8 @@ data class File constructor(internal val javaPath: Path) {
get() = javaPath.fileName.toString()
val parent: String
get() = javaPath.parent.toString()
val parentFile: File
get() = File(javaPath.parent)
val exists
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
// TODO: Consider removeing these after konanazing java.util.Properties.