ci: Add HarmonyOS/OpenHarmony builds to Github Actions.

This builds SDL with CMake, like a normal library, and a small app with
"hvigor", which is HarmonyOS's equivalent to Android's gradle, to test the
parts that CMake doesn't touch.

This is added to the non-priority builds.

[sdl-ci-filter *]
This commit is contained in:
Ryan C. Gordon committed 2026-10-08 14:49:35 -04:00
1 parent 47f8ad78a3
commit c314de7ce9
3 files changed
+84

No files matched your search

@@ -0,0 +1,61 @@
name: 'Setup HarmonyOS toolchain'
description: 'Download HarmonyOS command line tools and setup CMake toolchain'
runs:
using: 'composite'
steps:
- name: 'Calculate variables'
id: calc
shell: sh
run: |
version="6.1.1.280"
case "${{ runner.os }}-${{ runner.arch }}" in
"Linux-X64")
archive="commandline-tools-linux-x64-${version}.zip"
;;
"macOS-X86" | "macOS-X64")
archive="commandline-tools-mac-x86-${version}.zip"
;;
"macOS-ARM64")
archive="commandline-tools-mac-arm64-${version}.zip"
;;
"Windows-X64")
archive="commandline-tools-windows-x64-${version}.zip"
;;
*)
echo "Unsupported ${{ runner.os }}-${{ runner.arch }}"
exit 1;
;;
esac
echo "url=https://libsdl.org/harmonyos-devtools/${archive}" >> ${GITHUB_OUTPUT}
echo "archive=${archive}" >> ${GITHUB_OUTPUT}
echo "version=${version}" >> ${GITHUB_OUTPUT}
echo "cache-key=${archive}-${{ runner.os }}-${{ runner.arch }}" >> ${GITHUB_OUTPUT}
- name: 'Restore cached ${{ steps.calc.outputs.archive }}'
id: cache-restore
uses: actions/cache/restore@v5
with:
path: '${{ runner.temp }}/${{ steps.calc.outputs.archive }}'
key: ${{ steps.calc.outputs.cache-key }}
- name: 'Download HarmonyOS command line tools ${{ steps.calc.outputs.version }} for ${{ runner.os }} (${{ runner.arch }})'
if: ${{ !steps.cache-restore.outputs.cache-hit || steps.cache-restore.outputs.cache-hit == 'false' }}
shell: pwsh
run: |
Invoke-WebRequest "${{ steps.calc.outputs.url }}" -OutFile "${{ runner.temp }}/${{ steps.calc.outputs.archive }}"
- name: 'Cache ${{ steps.calc.outputs.archive }}'
if: ${{ !steps.cache-restore.outputs.cache-hit || steps.cache-restore.outputs.cache-hit == 'false' }}
uses: actions/cache/save@v5
with:
path: '${{ runner.temp }}/${{ steps.calc.outputs.archive }}'
key: ${{ steps.calc.outputs.cache-key }}
- name: 'Extract HarmonyOS command line tools archive'
shell: pwsh
run: |
unzip "${{ runner.temp }}/${{ steps.calc.outputs.archive }}" -d "${{ runner.temp }}"
- name: 'Set output variables'
id: final
shell: pwsh
run: |
echo "${{ runner.temp }}/command-line-tools/sdk/default/openharmony/toolchains" >> $env:GITHUB_PATH
echo "${{ runner.temp }}/command-line-tools/bin" >> $env:GITHUB_PATH
+12
View File
@@ -85,6 +85,7 @@ class SdlPlatform(Enum):
OpenBSD = "openbsd"
NGage = "ngage"
DJGPP = "djgpp"
HarmonyOS = "harmonyos"
class Msys2Platform(Enum):
@@ -116,10 +117,12 @@ class JobSpec:
xcode: bool = False
android_mk: bool = False
android_gradle: bool = False
harmonyos_hvigor: bool = False
lean: bool = False
android_arch: Optional[str] = None
android_abi: Optional[str] = None
android_platform: Optional[int] = None
openharmony_platform: Optional[str] = None
msys2_platform: Optional[Msys2Platform] = None
intel: Optional[IntelCompiler] = None
apple_framework: Optional[bool] = None
@@ -179,6 +182,7 @@ JOB_SPECS = {
"freebsd": JobSpec(name="FreeBSD", priority=False, os=JobOs.UbuntuLatest, platform=SdlPlatform.FreeBSD, artifact="SDL-freebsd-x64", ),
"ngage": JobSpec(name="N-Gage", priority=False, os=JobOs.WindowsLatest, platform=SdlPlatform.NGage, artifact="SDL-ngage", ),
"djgpp": JobSpec(name="DOS (DJGPP)", priority=False, os=JobOs.UbuntuLatest, platform=SdlPlatform.DJGPP, artifact="SDL-djgpp", ),
"harmonyos-hvigor": JobSpec(name="HarmonyOS/OpenHarmony (hvigor)", priority=False, os=JobOs.UbuntuLatest, platform=SdlPlatform.HarmonyOS, artifact=None, no_cmake=True, harmonyos_hvigor=True ),
}
@@ -241,6 +245,7 @@ class JobDetails:
android_ndk: bool = False
android_mk: bool = False
android_gradle: bool = False
harmonyos_hvigor: bool = False
minidump: bool = False
intel: bool = False
msys2_msystem: str = ""
@@ -316,6 +321,7 @@ class JobDetails:
"android-apks": my_shlex_join(self.android_apks),
"android-gradle": self.android_gradle,
"android-mk": self.android_mk,
"harmonyos-hvigor": self.harmonyos_hvigor,
"werror": self.werror,
"sudo": self.sudo,
"msvc-vcvars-arch": self.msvc_vcvars_arch,
@@ -912,6 +918,12 @@ def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool, ctest_args
job.run_tests = False
job.test_pkg_config = False
job.cmake_toolchain_file = "$GITHUB_WORKSPACE/build-scripts/i586-pc-msdosdjgpp.cmake"
case SdlPlatform.HarmonyOS:
job.harmonyos_hvigor = spec.harmonyos_hvigor
job.run_tests = False
job.shared_lib = SharedLibType.SO
job.static_lib = StaticLibType.A
job.apt_packages = []
case _:
raise ValueError(f"Unsupported platform={spec.platform}")
+11
View File
@@ -110,6 +110,10 @@ jobs:
uses: ./.github/actions/setup-djgpp-toolchain
id: setup-djgpp-toolchain
if: ${{ matrix.platform.platform == 'djgpp' }}
- name: 'Set up HarmonyOS toolchain'
uses: ./.github/actions/setup-harmonyos-toolchain
id: setup-harmonyos-toolchain
if: ${{ matrix.platform.platform == 'harmonyos' }}
- name: 'Setup Intel oneAPI toolchain'
id: intel
if: ${{ matrix.platform.intel }}
@@ -395,6 +399,13 @@ jobs:
run: |
cd build-cmake/org.libsdl.testspriteminimal
./gradlew -i assembleRelease -PBUILD_WITH_CMAKE=1
- name: 'Build HarmonyOS app (hvigor)'
if: ${{ matrix.platform.harmonyos-hvigor }}
# the unmodified openharmony-project tries to compile "myapp.c" and expects the root of the SDL source tree to be located at "SDL" inside that project tree. Add symlinks to make this work out, then build with our helper script, which runs hvigorw.
run: |
ln -sf ../../../../.. openharmony-project/entry/src/main/cpp/SDL
ln -sf SDL/test/testdynaudioreopen.c openharmony-project/entry/src/main/cpp/myapp.c
./build-scripts/harmonyos-tool.sh openharmony-project --clean --build
- name: 'Build (xcode)'
if: ${{ matrix.platform.xcode-sdk != '' }}
run: |