Unverified Commit b6c8e6aa authored by Oleksandr Karpovich's avatar Oleksandr Karpovich Committed by GitHub

add iosSimulatorArm64 target (#566)

* add iosSimulatorArm64 target
Co-authored-by: 's avatarOleksandr Karpovich <oleksandr.karpovich@jetbrains.com>
parent c2f2093f
...@@ -52,6 +52,8 @@ jobs: ...@@ -52,6 +52,8 @@ jobs:
- shell: bash - shell: bash
run: | run: |
./gradlew --stacktrace --info -Pskiko.native.enabled=true -Pskiko.test.onci=true :skiko:iosX64Test ./gradlew --stacktrace --info -Pskiko.native.enabled=true -Pskiko.test.onci=true :skiko:iosX64Test
# iosSimulatorArm64Test will build the binary but the tests will be skipped due to X64 host machine
./gradlew --stacktrace --info -Pskiko.native.enabled=true -Pskiko.test.onci=true :skiko:iosSimulatorArm64Test
./gradlew --stacktrace --info -Pskiko.native.enabled=true :skiko:publishToMavenLocal ./gradlew --stacktrace --info -Pskiko.native.enabled=true :skiko:publishToMavenLocal
# TODO run iOS specific tests on iPhone simulator # TODO run iOS specific tests on iPhone simulator
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v2
......
...@@ -37,6 +37,12 @@ val windowsSdkPaths: WindowsSdkPaths by lazy { ...@@ -37,6 +37,12 @@ val windowsSdkPaths: WindowsSdkPaths by lazy {
findWindowsSdkPathsForCurrentOS(gradle) findWindowsSdkPathsForCurrentOS(gradle)
} }
fun KotlinTarget.isIosSimArm64() =
name.contains("iosSimulatorArm64", ignoreCase = true)
fun String.withSuffix(isIosSim: Boolean = false) =
this + if (isIosSim) "Sim" else ""
if (supportWasm) { if (supportWasm) {
val skiaWasmDir = registerOrGetSkiaDirProvider(OS.Wasm, Arch.Wasm) val skiaWasmDir = registerOrGetSkiaDirProvider(OS.Wasm, Arch.Wasm)
...@@ -127,10 +133,12 @@ if (supportWasm) { ...@@ -127,10 +133,12 @@ if (supportWasm) {
} }
} }
fun compileNativeBridgesTask(os: OS, arch: Arch): TaskProvider<CompileSkikoCppTask> { fun compileNativeBridgesTask(os: OS, arch: Arch, isArm64Simulator: Boolean): TaskProvider<CompileSkikoCppTask> {
val skiaNativeDir = registerOrGetSkiaDirProvider(os, arch) val skiaNativeDir = registerOrGetSkiaDirProvider(os, arch, isIosSim = isArm64Simulator)
return project.registerSkikoTask<CompileSkikoCppTask>("compileNativeBridges", os, arch) { val actionName = "compileNativeBridges".withSuffix(isIosSim = isArm64Simulator)
return project.registerSkikoTask<CompileSkikoCppTask>(actionName, os, arch) {
dependsOn(skiaNativeDir) dependsOn(skiaNativeDir)
val unpackedSkia = skiaNativeDir.get() val unpackedSkia = skiaNativeDir.get()
...@@ -142,16 +150,18 @@ fun compileNativeBridgesTask(os: OS, arch: Arch): TaskProvider<CompileSkikoCppTa ...@@ -142,16 +150,18 @@ fun compileNativeBridgesTask(os: OS, arch: Arch): TaskProvider<CompileSkikoCppTa
when (os) { when (os) {
OS.IOS -> { OS.IOS -> {
val sdkRoot = "/Applications/Xcode.app/Contents/Developer/Platforms" val sdkRoot = "/Applications/Xcode.app/Contents/Developer/Platforms"
val iphoneOsSdk = "$sdkRoot/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk"
val iphoneSimSdk = "$sdkRoot/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk"
val iosArchFlags = when (arch) { val iosArchFlags = when (arch) {
Arch.Arm64 -> arrayOf( Arch.Arm64 -> arrayOf(
"-target", "arm64-apple-ios", "-target", if (isArm64Simulator) "arm64-apple-ios-simulator" else "arm64-apple-ios",
"-mios-version-min=11.0", "-isysroot", if (isArm64Simulator) iphoneSimSdk else iphoneOsSdk,
"-isysroot", "$sdkRoot/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk" "-miphoneos-version-min=11.0"
) )
Arch.X64 -> arrayOf( Arch.X64 -> arrayOf(
"-target", "x86_64-apple-ios-simulator", "-target", "x86_64-apple-ios-simulator",
"-mios-version-min=11.0", "-mios-version-min=11.0",
"-isysroot", "$sdkRoot/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk" "-isysroot", iphoneSimSdk
) )
else -> throw GradleException("Unsupported arch: $arch") else -> throw GradleException("Unsupported arch: $arch")
} }
...@@ -250,6 +260,7 @@ kotlin { ...@@ -250,6 +260,7 @@ kotlin {
configureNativeTarget(OS.Linux, Arch.X64, linuxX64()) configureNativeTarget(OS.Linux, Arch.X64, linuxX64())
configureNativeTarget(OS.IOS, Arch.Arm64, iosArm64()) configureNativeTarget(OS.IOS, Arch.Arm64, iosArm64())
configureNativeTarget(OS.IOS, Arch.X64, iosX64()) configureNativeTarget(OS.IOS, Arch.X64, iosX64())
configureNativeTarget(OS.IOS, Arch.Arm64, iosSimulatorArm64())
} }
sourceSets { sourceSets {
...@@ -399,6 +410,12 @@ kotlin { ...@@ -399,6 +410,12 @@ kotlin {
val iosArm64Test by getting { val iosArm64Test by getting {
dependsOn(iosTest) dependsOn(iosTest)
} }
val iosSimulatorArm64Main by getting {
dependsOn(iosMain)
}
val iosSimulatorArm64Test by getting {
dependsOn(iosTest)
}
} }
} }
} }
...@@ -408,10 +425,11 @@ fun configureNativeTarget(os: OS, arch: Arch, target: KotlinNativeTarget) { ...@@ -408,10 +425,11 @@ fun configureNativeTarget(os: OS, arch: Arch, target: KotlinNativeTarget) {
if (!os.isCompatibleWithHost) return if (!os.isCompatibleWithHost) return
target.generateVersion(os, arch) target.generateVersion(os, arch)
val isArm64Simulator = target.isIosSimArm64()
val targetString = "${os.id}-${arch.id}" val targetString = "${os.idWithSuffix(isIosSim = isArm64Simulator)}-${arch.id}"
val unzipper = registerOrGetSkiaDirProvider(os, arch) val unzipper = registerOrGetSkiaDirProvider(os, arch, isArm64Simulator)
val unpackedSkia = unzipper.get() val unpackedSkia = unzipper.get()
val skiaDir = unpackedSkia.absolutePath val skiaDir = unpackedSkia.absolutePath
...@@ -456,10 +474,11 @@ fun configureNativeTarget(os: OS, arch: Arch, target: KotlinNativeTarget) { ...@@ -456,10 +474,11 @@ fun configureNativeTarget(os: OS, arch: Arch, target: KotlinNativeTarget) {
} }
} }
val crossCompileTask = compileNativeBridgesTask(os, arch) val crossCompileTask = compileNativeBridgesTask(os, arch, isArm64Simulator = isArm64Simulator)
// TODO: move to LinkSkikoTask. // TODO: move to LinkSkikoTask.
val linkTask = project.registerSkikoTask<Exec>("linkNativeBridges", os, arch) { val actionName = "linkNativeBridges".withSuffix(isIosSim = isArm64Simulator)
val linkTask = project.registerSkikoTask<Exec>(actionName, os, arch) {
dependsOn(crossCompileTask) dependsOn(crossCompileTask)
val objectFilesDir = crossCompileTask.map { it.outDir.get() } val objectFilesDir = crossCompileTask.map { it.outDir.get() }
val objectFiles = project.fileTree(objectFilesDir) { val objectFiles = project.fileTree(objectFilesDir) {
...@@ -973,9 +992,10 @@ fun KotlinTarget.generateVersion( ...@@ -973,9 +992,10 @@ fun KotlinTarget.generateVersion(
targetArch: Arch targetArch: Arch
) { ) {
val targetName = this.name val targetName = this.name
val isArm64Simulator = isIosSimArm64()
val generatedDir = project.layout.buildDirectory.dir("generated/$targetName") val generatedDir = project.layout.buildDirectory.dir("generated/$targetName")
val generateVersionTask = project.registerSkikoTask<DefaultTask>( val generateVersionTask = project.registerSkikoTask<DefaultTask>(
"generateVersion${toTitleCase(platformType.name)}", "generateVersion${toTitleCase(platformType.name)}".withSuffix(isIosSim = isArm64Simulator),
targetOs, targetOs,
targetArch targetArch
) { ) {
...@@ -1252,9 +1272,9 @@ if (skiko.isCIBuild || mavenCentral.signArtifacts) { ...@@ -1252,9 +1272,9 @@ if (skiko.isCIBuild || mavenCentral.signArtifacts) {
* Do not call inside tasks.register or tasks.call callback * Do not call inside tasks.register or tasks.call callback
* (tasks' registration during other task's registration is prohibited) * (tasks' registration during other task's registration is prohibited)
*/ */
fun registerOrGetSkiaDirProvider(os: OS, arch: Arch): Provider<File> { fun registerOrGetSkiaDirProvider(os: OS, arch: Arch, isIosSim: Boolean = false): Provider<File> {
val taskNameSuffix = joinToTitleCamelCase(buildType.id, os.id, arch.id) val taskNameSuffix = joinToTitleCamelCase(buildType.id, os.idWithSuffix(isIosSim = isIosSim), arch.id)
val skiaRelease = skiko.skiaReleaseFor(os, arch, buildType) val skiaRelease = skiko.skiaReleaseFor(os, arch, buildType, isIosSim)
val downloadSkia = tasks.registerOrGetTask<Download>("downloadSkia$taskNameSuffix") { val downloadSkia = tasks.registerOrGetTask<Download>("downloadSkia$taskNameSuffix") {
onlyIf { !dest.exists() } onlyIf { !dest.exists() }
onlyIfModified(true) onlyIfModified(true)
......
...@@ -15,6 +15,10 @@ enum class OS( ...@@ -15,6 +15,10 @@ enum class OS(
val isWindows val isWindows
get() = this == Windows get() = this == Windows
fun idWithSuffix(isIosSim: Boolean = false): String {
return id + if (isIosSim) "Sim" else ""
}
} }
val OS.isCompatibleWithHost: Boolean val OS.isCompatibleWithHost: Boolean
...@@ -126,11 +130,11 @@ class SkikoProperties(private val myProject: Project) { ...@@ -126,11 +130,11 @@ class SkikoProperties(private val myProject: Project) {
val includeTestHelpers: Boolean val includeTestHelpers: Boolean
get() = !isRelease get() = !isRelease
fun skiaReleaseFor(os: OS, arch: Arch, buildType: SkiaBuildType): String { fun skiaReleaseFor(os: OS, arch: Arch, buildType: SkiaBuildType, isIosSim: Boolean = false): String {
val target = "${os.id}-${arch.id}" val target = "${os.idWithSuffix(isIosSim = isIosSim)}-${arch.id}"
val tag = myProject.property("dependencies.skia.$target") as String val tag = myProject.property("dependencies.skia.$target") as String
val suffix = if (os == OS.Linux && arch == Arch.X64) "-ubuntu18" else "" val suffix = if (os == OS.Linux && arch == Arch.X64) "-ubuntu18" else ""
return "${tag}/Skia-${tag}-${os.id}-${buildType.id}-${arch.id}$suffix" return "${tag}/Skia-${tag}-${os.idWithSuffix(isIosSim = isIosSim)}-${buildType.id}-${arch.id}$suffix"
} }
val releaseGithubVersion: String val releaseGithubVersion: String
...@@ -187,6 +191,6 @@ object SkikoArtifacts { ...@@ -187,6 +191,6 @@ object SkikoArtifacts {
// does not seem possible (at least without adding a dash to a target's tasks), // does not seem possible (at least without adding a dash to a target's tasks),
// so we're using the default naming pattern instead. // so we're using the default naming pattern instead.
// See https://youtrack.jetbrains.com/issue/KT-50001. // See https://youtrack.jetbrains.com/issue/KT-50001.
fun nativeArtifactIdFor(os: OS, arch: Arch) = fun nativeArtifactIdFor(os: OS, arch: Arch, isIosSim: Boolean = false) =
"skiko-${os.id}${arch.id}" "skiko-${os.id + if (isIosSim) "simulator" else ""}${arch.id}"
} }
...@@ -42,4 +42,4 @@ fun toTitleCase(s: String): String = ...@@ -42,4 +42,4 @@ fun toTitleCase(s: String): String =
fun Task.projectDirs(vararg relativePaths: String): List<Directory> { fun Task.projectDirs(vararg relativePaths: String): List<Directory> {
val projectDir = project.layout.projectDirectory val projectDir = project.layout.projectDirectory
return relativePaths.map { path -> projectDir.dir(path) } return relativePaths.map { path -> projectDir.dir(path) }
} }
\ No newline at end of file
...@@ -20,6 +20,7 @@ val skikoArtifactIds: List<String> = ...@@ -20,6 +20,7 @@ val skikoArtifactIds: List<String> =
SkikoArtifacts.nativeArtifactIdFor(OS.MacOS, Arch.X64), SkikoArtifacts.nativeArtifactIdFor(OS.MacOS, Arch.X64),
SkikoArtifacts.nativeArtifactIdFor(OS.IOS, Arch.X64), SkikoArtifacts.nativeArtifactIdFor(OS.IOS, Arch.X64),
SkikoArtifacts.nativeArtifactIdFor(OS.IOS, Arch.Arm64), SkikoArtifacts.nativeArtifactIdFor(OS.IOS, Arch.Arm64),
SkikoArtifacts.nativeArtifactIdFor(OS.IOS, Arch.Arm64, isIosSim = true),
) )
val downloadSkikoArtifactsFromComposeDev by tasks.registering(DownloadFromSpaceMavenRepoTask::class) { val downloadSkikoArtifactsFromComposeDev by tasks.registering(DownloadFromSpaceMavenRepoTask::class) {
...@@ -98,4 +99,4 @@ fun Project.skikoMavenModules(version: String): Provider<List<ModuleToUpload>> = ...@@ -98,4 +99,4 @@ fun Project.skikoMavenModules(version: String): Provider<List<ModuleToUpload>> =
fun connectToGitHub() = fun connectToGitHub() =
GitHubBuilder() GitHubBuilder()
.withOAuthToken(System.getenv("SKIKO_GH_RELEASE_TOKEN")) .withOAuthToken(System.getenv("SKIKO_GH_RELEASE_TOKEN"))
.build() .build()
\ No newline at end of file
...@@ -11,6 +11,8 @@ dependencies.skia.macos-arm64=m105-f204b137b9-5 ...@@ -11,6 +11,8 @@ dependencies.skia.macos-arm64=m105-f204b137b9-5
dependencies.skia.wasm-wasm=m105-f204b137b9-5 dependencies.skia.wasm-wasm=m105-f204b137b9-5
dependencies.skia.ios-x64=m105-f204b137b9-5 dependencies.skia.ios-x64=m105-f204b137b9-5
dependencies.skia.ios-arm64=m105-f204b137b9-5 dependencies.skia.ios-arm64=m105-f204b137b9-5
dependencies.skia.iosSim-arm64=m105-f204b137b9-5
dependencies.skia.iosSim-x64=m105-f204b137b9-5
dependencies.skia.android-x64=m105-f204b137b9-5 dependencies.skia.android-x64=m105-f204b137b9-5
dependencies.skia.android-arm64=m105-f204b137b9-5 dependencies.skia.android-arm64=m105-f204b137b9-5
......
...@@ -56,4 +56,4 @@ Java_org_jetbrains_skia_RuntimeEffectKt__1nMakeForColorFilter(JNIEnv* env, ...@@ -56,4 +56,4 @@ Java_org_jetbrains_skia_RuntimeEffectKt__1nMakeForColorFilter(JNIEnv* env,
env->ThrowNew(java::lang::RuntimeException::cls, result.errorText.c_str()); env->ThrowNew(java::lang::RuntimeException::cls, result.errorText.c_str());
return 0; return 0;
} }
} }
\ No newline at end of file
...@@ -475,4 +475,4 @@ private: ...@@ -475,4 +475,4 @@ private:
jobject callback; jobject callback;
}; };
typedef JCallback<jboolean> JBooleanCallback; typedef JCallback<jboolean> JBooleanCallback;
\ No newline at end of file
...@@ -55,4 +55,4 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_paragraph_ParagraphBu ...@@ -55,4 +55,4 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_paragraph_ParagraphBu
ParagraphBuilder* instance = reinterpret_cast<ParagraphBuilder*>(static_cast<uintptr_t>(ptr)); ParagraphBuilder* instance = reinterpret_cast<ParagraphBuilder*>(static_cast<uintptr_t>(ptr));
Paragraph* paragraph = instance->Build().release(); Paragraph* paragraph = instance->Build().release();
return reinterpret_cast<jlong>(paragraph); return reinterpret_cast<jlong>(paragraph);
} }
\ No newline at end of file
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