Skip to content

Commit 2fb9be2

Browse files
committed
Add linuxArm64 target
1 parent e81310f commit 2fb9be2

File tree

9 files changed

+89
-17
lines changed

9 files changed

+89
-17
lines changed

.github/workflows/ci.yml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,10 @@ jobs:
164164
sudo apt-get install gcc-9 g++-9 -y
165165
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-9
166166
sudo update-alternatives --config gcc
167-
sudo apt-get install ninja-build fontconfig libfontconfig1-dev libglu1-mesa-dev libxrandr-dev libdbus-1-dev zip xvfb -y
167+
sudo apt-get install ninja-build fontconfig libfontconfig1-dev libglu1-mesa-dev libxrandr-dev libdbus-1-dev zip multistrap xvfb -y
168+
sudo apt-get install gcc-9-aarch64-linux-gnu g++-9-aarch64-linux-gnu -y
169+
sudo update-alternatives --install /usr/bin/aarch64-linux-gnu-gcc aarch64-linux-gnu-gcc /usr/bin/aarch64-linux-gnu-gcc-9 60 --slave /usr/bin/aarch64-linux-gnu-g++ aarch64-linux-gnu-g++ /usr/bin/aarch64-linux-gnu-g++-9
170+
sudo update-alternatives --config aarch64-linux-gnu-gcc
168171
sudo Xvfb :0 -screen 0 1280x720x24 &
169172
170173
- shell: bash
@@ -173,6 +176,13 @@ jobs:
173176
export DISPLAY=:0
174177
./gradlew --no-daemon --stacktrace --info -Pskiko.native.enabled=true -Pkotlin.native.cacheKind.linuxX64=none -Pskiko.test.onci=true :skiko:linuxX64Test
175178
179+
# Linux arm64 tests cannot be run but are tested for building
180+
- shell: bash
181+
name: 'Compile Linux arm64 tests'
182+
run: |
183+
export DISPLAY=:0
184+
./gradlew --no-daemon --stacktrace --info -Pskiko.native.enabled=true -Pkotlin.native.cacheKind.linuxX64=none -Pskiko.test.onci=true :skiko:linuxArm64TestBinaries
185+
176186
- shell: bash
177187
name: 'Compile and run AWT tests'
178188
run: |

.github/workflows/docs.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ jobs:
3737
sudo apt-get install gcc-9 g++-9 -y
3838
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-9
3939
sudo update-alternatives --config gcc
40-
sudo apt-get install ninja-build fontconfig libfontconfig1-dev libglu1-mesa-dev libxrandr-dev libdbus-1-dev zip xvfb -y
40+
sudo apt-get install ninja-build fontconfig libfontconfig1-dev libglu1-mesa-dev libxrandr-dev libdbus-1-dev zip multistrap xvfb -y
41+
sudo apt-get install gcc-9-aarch64-linux-gnu g++-9-aarch64-linux-gnu -y
42+
sudo update-alternatives --install /usr/bin/aarch64-linux-gnu-gcc aarch64-linux-gnu-gcc /usr/bin/aarch64-linux-gnu-gcc-9 60 --slave /usr/bin/aarch64-linux-gnu-g++ aarch64-linux-gnu-g++ /usr/bin/aarch64-linux-gnu-g++-9
43+
sudo update-alternatives --config aarch64-linux-gnu-gcc
4144
sudo Xvfb :0 -screen 0 1280x720x24 &
4245
4346
- name: 'Build Dokka documentation'

DEVELOPMENT.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* `macOs` Install Xcode Command Line Tools
55
* `Linux` Install these tools:
66
```
7-
sudo apt-get install ninja-build fontconfig libfontconfig1-dev libglu1-mesa-dev libxrandr-dev libdbus-1-dev zip libx11-dev
7+
sudo apt-get install ninja-build fontconfig libfontconfig1-dev libglu1-mesa-dev libxrandr-dev libdbus-1-dev zip multistrap libx11-dev
88
```
99
* `Windows`
1010
1. Download [Visual Studio Build Tools 2019](https://learn.microsoft.com/en-us/visualstudio/releases/2019/history) (search "BuildTools" on the page).

skiko/build.gradle.kts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ kotlin {
142142
}
143143
if (supportNativeLinux) {
144144
skikoProjectContext.configureNativeTarget(OS.Linux, Arch.X64, linuxX64())
145+
skikoProjectContext.configureNativeTarget(OS.Linux, Arch.Arm64, linuxArm64())
145146
}
146147
if (supportNativeIosArm64) {
147148
skikoProjectContext.configureNativeTarget(OS.IOS, Arch.Arm64, iosArm64())
@@ -292,6 +293,12 @@ kotlin {
292293
val linuxX64Test by getting {
293294
dependsOn(linuxTest)
294295
}
296+
val linuxArm64Main by getting {
297+
dependsOn(linuxMain)
298+
}
299+
val linuxArm64Test by getting {
300+
dependsOn(linuxTest)
301+
}
295302
}
296303
if (supportAnyNativeIos || supportNativeMac) {
297304
val darwinMain by creating {

skiko/buildSrc/src/main/kotlin/properties.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ fun compilerForTarget(os: OS, arch: Arch): String =
3939
when (os) {
4040
OS.Linux -> when (arch) {
4141
Arch.X64 -> "g++"
42-
Arch.Arm64 -> "clang++"
42+
Arch.Arm64 -> if (hostArch == Arch.Arm64) "g++" else "aarch64-linux-gnu-g++"
4343
Arch.Wasm -> "Unexpected combination: $os & $arch"
4444
}
4545
OS.Android -> "clang++"

skiko/buildSrc/src/main/kotlin/tasks/configuration/NativeTasksConfiguration.kt

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import SkiaBuildType
77
import SkikoProjectContext
88
import WriteCInteropDefFile
99
import compilerForTarget
10+
import hostArch
1011
import isCompatibleWithHost
1112
import joinToTitleCamelCase
1213
import 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+
311344
fun KotlinMultiplatformExtension.configureIOSTestsWithMetal(project: Project) {
312345
val metalTestTargets = listOf("iosX64", "iosSimulatorArm64")
313346
metalTestTargets.forEach { target: String ->

skiko/ci/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ val skikoArtifactIds: List<String> =
1919
SkikoArtifacts.jsArtifactId,
2020
SkikoArtifacts.wasmArtifactId,
2121
SkikoArtifacts.nativeArtifactIdFor(OS.Linux, Arch.X64),
22+
SkikoArtifacts.nativeArtifactIdFor(OS.Linux, Arch.Arm64),
2223
SkikoArtifacts.nativeArtifactIdFor(OS.MacOS, Arch.Arm64),
2324
SkikoArtifacts.nativeArtifactIdFor(OS.MacOS, Arch.X64),
2425
SkikoArtifacts.nativeArtifactIdFor(OS.IOS, Arch.X64),

skiko/docker/linux-amd64/Dockerfile

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,17 @@ RUN apt-get update -y && \
1010
apt-get update && \
1111
apt-get install gcc-9 g++-9 -y && \
1212
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-9 && \
13-
update-alternatives --config gcc
13+
update-alternatives --config gcc \
14+
apt-get install gcc-9-aarch64-linux-gnu g++-9-aarch64-linux-gnu -y \
15+
update-alternatives --install /usr/bin/aarch64-linux-gnu-gcc aarch64-linux-gnu-gcc /usr/bin/aarch64-linux-gnu-gcc-9 60 --slave /usr/bin/aarch64-linux-gnu-g++ aarch64-linux-gnu-g++ /usr/bin/aarch64-linux-gnu-g++-9 \
16+
update-alternatives --config aarch64-linux-gnu-gcc
1417
ENV PATH=/usr/lib/binutils-2.26/bin:$PATH
1518

1619
# Install libs & tools
1720
ENV DEPOT_TOOLS=/usr/depot_tools
1821
ENV PATH=$DEPOT_TOOLS:$PATH
1922
RUN apt-get install git python wget -y && \
20-
apt-get install fontconfig libfontconfig1-dev libglu1-mesa-dev libxrandr-dev libdbus-1-dev curl zip -y && \
23+
apt-get install fontconfig libfontconfig1-dev libglu1-mesa-dev libxrandr-dev libdbus-1-dev curl zip multistrap -y && \
2124
git clone 'https://chromium.googlesource.com/chromium/tools/depot_tools.git' $DEPOT_TOOLS
2225

2326
# Install Java

skiko/multistrap-config-arm64

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
[General]
2+
arch=arm64
3+
directory=build/multistrap-arm64
4+
cleanup=true
5+
noauth=false
6+
unpack=true
7+
cleanup=true
8+
aptsources=Ubuntu
9+
bootstrap=Ubuntu
10+
11+
[Ubuntu]
12+
packages=fontconfig libfontconfig1-dev libglu1-mesa-dev
13+
source=https://ports.ubuntu.com/
14+
keyring=ubuntu-keyring
15+
suite=jammy

0 commit comments

Comments
 (0)