@@ -7,6 +7,7 @@ import SkiaBuildType
77import SkikoProjectContext
88import WriteCInteropDefFile
99import compilerForTarget
10+ import hostArch
1011import isCompatibleWithHost
1112import joinToTitleCamelCase
1213import listOfFrameworks
@@ -51,12 +52,20 @@ fun SkikoProjectContext.compileNativeBridgesTask(
5152): TaskProvider <CompileSkikoCppTask > = with (this .project) {
5253 val skiaNativeDir = registerOrGetSkiaDirProvider(os, arch, isUikitSim = isUikitSim)
5354
55+ val setupMultistrapTask = if (os == OS .Linux && arch == Arch .Arm64 && hostArch != Arch .Arm64 ) {
56+ setupMultistrapTask(os, arch, isUikitSim = isUikitSim)
57+ } else {
58+ null
59+ }
60+
5461 val actionName = " compileNativeBridges" .withSuffix(isUikitSim = isUikitSim)
5562
5663 return project.registerSkikoTask<CompileSkikoCppTask >(actionName, os, arch) {
5764 dependsOn(skiaNativeDir)
5865 val unpackedSkia = skiaNativeDir.get()
5966
67+ setupMultistrapTask?.let { dependsOn(it) }
68+
6069 compiler.set(compilerForTarget(os, arch))
6170 buildTargetOS.set(os)
6271 if (isUikitSim) {
@@ -128,6 +137,7 @@ fun SkikoProjectContext.compileNativeBridgesTask(
128137 OS .Linux -> {
129138 flags.set(listOf (
130139 * buildType.clangFlags,
140+ " -fPIC" ,
131141 " -fno-rtti" ,
132142 " -fno-exceptions" ,
133143 " -fvisibility=hidden" ,
@@ -239,17 +249,24 @@ fun SkikoProjectContext.configureNativeTarget(os: OS, arch: Arch, target: Kotlin
239249 configureCinterop(" uikit" , os, arch, target, targetString, tvosFrameworks)
240250 mutableListOfLinkerOptions(tvosFrameworks)
241251 }
242- OS .Linux -> mutableListOfLinkerOptions(
243- " -L/usr/lib/x86_64-linux-gnu" ,
244- " -lfontconfig" ,
245- " -lGL" ,
246- // TODO: an ugly hack, Linux linker searches only unresolved symbols.
247- " $skiaBinDir /libsksg.a" ,
248- " $skiaBinDir /libskshaper.a" ,
249- " $skiaBinDir /libskunicode_core.a" ,
250- " $skiaBinDir /libskunicode_icu.a" ,
251- " $skiaBinDir /libskia.a"
252- )
252+ OS .Linux -> {
253+ val options = mutableListOf (
254+ " -L/usr/lib/${if (arch == Arch .Arm64 ) " aarch64" else " x86_64" } -linux-gnu" ,
255+ " -lfontconfig" ,
256+ " -lGL" ,
257+ // TODO: an ugly hack, Linux linker searches only unresolved symbols.
258+ " $skiaBinDir /libsksg.a" ,
259+ " $skiaBinDir /libskshaper.a" ,
260+ " $skiaBinDir /libskunicode_core.a" ,
261+ " $skiaBinDir /libskunicode_icu.a" ,
262+ " $skiaBinDir /libskia.a"
263+ )
264+ if (arch == Arch .Arm64 && hostArch != Arch .Arm64 ) {
265+ options.add(0 , " -L$buildDir /multistrap-arm64/usr/lib" )
266+ options.add(1 , " -L$buildDir /multistrap-arm64/usr/lib/aarch64-linux-gnu" )
267+ }
268+ mutableListOfLinkerOptions(options)
269+ }
253270 else -> mutableListOf ()
254271 }
255272 if (skiko.includeTestHelpers) {
@@ -308,6 +325,22 @@ fun SkikoProjectContext.configureNativeTarget(os: OS, arch: Arch, target: Kotlin
308325 }
309326}
310327
328+ fun SkikoProjectContext.setupMultistrapTask (
329+ os : OS , arch : Arch , isUikitSim : Boolean
330+ ): TaskProvider <Exec > = with (this .project) {
331+ require(os == OS .Linux )
332+ require(arch == Arch .Arm64 )
333+
334+ val skiaNativeDir = registerOrGetSkiaDirProvider(os, arch, isUikitSim = isUikitSim)
335+
336+ val actionName = " setupMultistrap" .withSuffix(isUikitSim = isUikitSim)
337+
338+ return project.registerSkikoTask<Exec >(actionName, os, arch) {
339+ workingDir(projectDir)
340+ commandLine(" multistrap" , " -f" , " multistrap-config-${arch.id} " )
341+ }
342+ }
343+
311344fun KotlinMultiplatformExtension.configureIOSTestsWithMetal (project : Project ) {
312345 val metalTestTargets = listOf (" iosX64" , " iosSimulatorArm64" )
313346 metalTestTargets.forEach { target: String ->
0 commit comments