Unverified Commit 2021a5a8 authored by Nikolay Igotti's avatar Nikolay Igotti Committed by GitHub

Include x86 libs to arm64 Skiko jar (#445)

parent 492996b2
...@@ -5,7 +5,6 @@ import org.jetbrains.compose.internal.publishing.MavenCentralProperties ...@@ -5,7 +5,6 @@ import org.jetbrains.compose.internal.publishing.MavenCentralProperties
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile
import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestExceptionFormat
plugins { plugins {
...@@ -205,6 +204,11 @@ val Project.supportWasm: Boolean ...@@ -205,6 +204,11 @@ val Project.supportWasm: Boolean
val Project.supportAndroid: Boolean val Project.supportAndroid: Boolean
get() = findProperty("skiko.android.enabled") == "true" get() = findProperty("skiko.android.enabled") == "true"
val skikoAwtJar by project.tasks.registering(Jar::class) {
archiveBaseName.set("skiko-awt")
from(kotlin.jvm("awt").compilations["main"].output.allOutputs)
}
kotlin { kotlin {
jvm("awt") { jvm("awt") {
compilations.all { compilations.all {
...@@ -618,9 +622,33 @@ fun createSkikoJvmJarTask(os: OS, arch: Arch): TaskProvider<Jar> { ...@@ -618,9 +622,33 @@ fun createSkikoJvmJarTask(os: OS, arch: Arch): TaskProvider<Jar> {
val objcCompile = if (os == OS.MacOS) createObjcCompileTask(os, arch, skiaBindingsDir) else null val objcCompile = if (os == OS.MacOS) createObjcCompileTask(os, arch, skiaBindingsDir) else null
val linkBindings = val linkBindings =
createLinkJvmBindings(os, arch, skiaBindingsDir, compileBindings, objcCompile) createLinkJvmBindings(os, arch, skiaBindingsDir, compileBindings, objcCompile)
val maybeSign = maybeSignTask(os, arch, linkBindings) val maybeSign = maybeSignOrSealTask(os, arch, linkBindings)
val createChecksums = createChecksumsTask(os, arch, maybeSign, skiaBindingsDir) val nativeLib = maybeSign.map { it.outputFiles.get().single() }
val skikoJvmRuntimeJar = skikoJvmRuntimeJarTask(os, arch, maybeSign, createChecksums, skiaBindingsDir) val createChecksums = createChecksumsTask(os, arch, nativeLib)
val nativeFiles = mutableListOf(
nativeLib,
createChecksums.map { it.outputs.files.singleFile }
)
if (os == OS.Windows) {
val target = targetId(os, arch)
// Add ICU data files.
nativeFiles.add(skiaBindingsDir.map { file(it.resolve("out/${buildType.id}-$target/icudtl.dat")) })
}
// For ARM macOS add x86 native code for compatibility.
if (os == OS.MacOS && arch == Arch.Arm64) {
val altArch = Arch.X64
val skiaBindingsDir2 = registerOrGetSkiaDirProvider(os, altArch)
val compileBindings2 = createCompileJvmBindingsTask(os, altArch, skiaBindingsDir2)
val objcCompile2 = createObjcCompileTask(os, altArch, skiaBindingsDir2)
val linkBindings2 =
createLinkJvmBindings(os, altArch, skiaBindingsDir2, compileBindings2, objcCompile2)
val maybeSign2 = maybeSignOrSealTask(os, altArch, linkBindings2)
val nativeLib2 = maybeSign2.map { it.outputFiles.get().single() }
val createChecksums2 = createChecksumsTask(os, altArch, nativeLib2)
nativeFiles.add(nativeLib2)
nativeFiles.add(createChecksums2.map { it.outputs.files.singleFile })
}
val skikoJvmRuntimeJar = skikoJvmRuntimeJarTask(os, arch, skikoAwtJar, nativeFiles)
allJvmRuntimeJars[os to arch] = skikoJvmRuntimeJar allJvmRuntimeJars[os to arch] = skikoJvmRuntimeJar
return skikoJvmRuntimeJar return skikoJvmRuntimeJar
} }
...@@ -729,6 +757,7 @@ fun createCompileJvmBindingsTask( ...@@ -729,6 +757,7 @@ fun createCompileJvmBindingsTask(
osFlags = arrayOf( osFlags = arrayOf(
*targetOs.clangFlags, *targetOs.clangFlags,
*buildType.clangFlags, *buildType.clangFlags,
"-arch", if (targetArch == Arch.Arm64) "arm64" else "x86_64",
"-fPIC", "-fPIC",
"-stdlib=libc++", "-stdlib=libc++",
"-fvisibility=hidden", "-fvisibility=hidden",
...@@ -921,12 +950,7 @@ fun KotlinTarget.generateVersion( ...@@ -921,12 +950,7 @@ fun KotlinTarget.generateVersion(
} }
} }
val skikoJvmJar by project.tasks.registering(Jar::class) { fun maybeSignOrSealTask(
archiveBaseName.set("skiko-awt")
from(kotlin.jvm("awt").compilations["main"].output.allOutputs)
}
fun maybeSignTask(
targetOs: OS, targetOs: OS,
targetArch: Arch, targetArch: Arch,
linkJvmBindings: Provider<LinkSkikoTask> linkJvmBindings: Provider<LinkSkikoTask>
...@@ -937,7 +961,8 @@ fun maybeSignTask( ...@@ -937,7 +961,8 @@ fun maybeSignTask(
task.outDir.get().asFile.walk().single { it.name.endsWith(targetOs.dynamicLibExt) }.absoluteFile task.outDir.get().asFile.walk().single { it.name.endsWith(targetOs.dynamicLibExt) }.absoluteFile
} }
libFile.set(project.layout.file(linkOutputFile)) libFile.set(project.layout.file(linkOutputFile))
outDir.set(project.layout.buildDirectory.dir("maybe-signed")) val target = targetId(targetOs, targetArch)
outDir.set(project.layout.buildDirectory.dir("maybe-signed-$target"))
val toolsDir = project.layout.projectDirectory.dir("tools") val toolsDir = project.layout.projectDirectory.dir("tools")
if (targetOs == OS.Linux) { if (targetOs == OS.Linux) {
...@@ -961,37 +986,24 @@ fun maybeSignTask( ...@@ -961,37 +986,24 @@ fun maybeSignTask(
fun createChecksumsTask( fun createChecksumsTask(
targetOs: OS, targetOs: OS,
targetArch: Arch, targetArch: Arch,
maybeSign: Provider<SealAndSignSharedLibraryTask>, fileToChecksum: Provider<File>
bindingsDir: Provider<File>
) = project.registerSkikoTask<Checksum>("createChecksums", targetOs, targetArch) { ) = project.registerSkikoTask<Checksum>("createChecksums", targetOs, targetArch) {
val skiaBinSubdir = "out/${buildType.id}-${targetOs.id}-${targetArch.id}" files = project.files(fileToChecksum)
dependsOn(maybeSign)
files = project.files(maybeSign.flatMap { it.outputFiles }) +
if (targetOs.isWindows) files(bindingsDir.map { it.resolve("${skiaBinSubdir}/icudtl.dat") }) else files()
algorithm = Checksum.Algorithm.SHA256 algorithm = Checksum.Algorithm.SHA256
outputDir = file("$buildDir/checksums-${targetOs.id}-${targetArch.id}") outputDir = file("$buildDir/checksums-${targetId(targetOs, targetArch)}")
} }
fun skikoJvmRuntimeJarTask( fun skikoJvmRuntimeJarTask(
targetOs: OS, targetOs: OS,
targetArch: Arch, targetArch: Arch,
maybeSign: Provider<SealAndSignSharedLibraryTask>, awtJar: TaskProvider<Jar>,
createChecksums: Provider<Checksum>, nativeFiles: List<Provider<File>>
bindingsDir: Provider<File>
) = project.registerSkikoTask<Jar>("skikoJvmRuntimeJar", targetOs, targetArch) { ) = project.registerSkikoTask<Jar>("skikoJvmRuntimeJar", targetOs, targetArch) {
dependsOn(maybeSign)
dependsOn(createChecksums)
dependsOn(skikoJvmJar)
val target = targetId(targetOs, targetArch) val target = targetId(targetOs, targetArch)
val skiaBinSubdir = "out/${buildType.id}-$target"
archiveBaseName.set("skiko-$target") archiveBaseName.set("skiko-$target")
from(skikoJvmJar.map { zipTree(it.archiveFile) }) from(awtJar.map { zipTree(it.archiveFile) })
from(maybeSign.flatMap { it.outputFiles }) nativeFiles.forEach { provider -> from(provider) }
if (targetOs.isWindows) {
from(files(bindingsDir.map { it.resolve("${skiaBinSubdir}/icudtl.dat") }))
}
from(createChecksums.map { it.outputs.files })
} }
fun skikoRuntimeDirForTestsTask( fun skikoRuntimeDirForTestsTask(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment