diff --git a/.github/actions/setup-harmonyos-toolchain/action.yml b/.github/actions/setup-harmonyos-toolchain/action.yml new file mode 100644 index 0000000000..1ed07be2a6 --- /dev/null +++ b/.github/actions/setup-harmonyos-toolchain/action.yml @@ -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 + + diff --git a/.github/workflows/create-test-plan.py b/.github/workflows/create-test-plan.py index 8d72c06d25..4a94ad2265 100755 --- a/.github/workflows/create-test-plan.py +++ b/.github/workflows/create-test-plan.py @@ -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}") diff --git a/.github/workflows/generic.yml b/.github/workflows/generic.yml index fbf4208956..ef98a59802 100644 --- a/.github/workflows/generic.yml +++ b/.github/workflows/generic.yml @@ -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: |