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 { } 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) +
@@ -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.