Files
SDL/build-scripts/harmonyos-tool.sh
Ryan C. Gordon a24429c192 harmonyos: Port SDL3 to HarmonyOS/OpenHarmony.
This is my port of SDL3 to HarmonyOS/OpenHarmony. It has been tested on real
hardware from Huawei, and commercial games are being prepped to ship with it
already.

There is _heavy_ documentation in docs/README-harmonyos.md, including how to
set up a development environment and project, build, and debug, for the
completely uninitiated.

This work was sponsored by Outfit7: https://outfit7.com/

Fixes #9837.
2026-09-15 12:33:00 -04:00

210 lines
5.2 KiB
Bash
Executable File

#!/usr/bin/bash
HVIGORWPATH=`which hvigorw 2>/dev/null`
if [ "x$HVIGORWPATH" == "x" ]; then
echo "Couldn't find hvigorw!"
echo "Please make sure the HarmonyOS command line tools are in your PATH." 1>&2
exit 1
fi
HDCPATH=`which hdc 2>/dev/null`
if [ "x$HDCPATH" == "x" ]; then
echo "Couldn't find hdc!"
echo "Please make sure the HarmonyOS command line tools are in your PATH." 1>&2
exit 1
fi
CLTBINPATH=`dirname "$HVIGORWPATH"`
CLTPATH=`dirname "$CLTBINPATH"`
CLT=`realpath "$CLTPATH"`
#echo "CLT is '$CLT'"
need_usage=0
APPJSON=""
PROJDIR="$1"
if [ "x$PROJDIR" == "x" ]; then
need_usage=1
else
PROJDIR=`realpath "$PROJDIR"`
APPJSON="$PROJDIR/AppScope/app.json5"
if [ ! -f "$APPJSON" ]; then
echo "Can't find '$APPJSON'. Is project directory correct?" 1>&2
echo "" 1>&2
need_usage=1
fi
fi
do_clean=0
do_build=0
do_uninstall=0
do_install=0
do_kill=0
do_launch=0
do_log=0
do_debug=0
do_anything=0
shift # dump projectdir
while [ $# -gt 0 ]; do
do_anything=1
case $1 in
--clean)
do_clean=1
shift
;;
--build)
do_build=1
shift
;;
--install)
do_install=1
shift
;;
--uninstall)
do_uninstall=1
shift
;;
--kill)
do_kill=1
shift
;;
--launch)
do_launch=1
shift
;;
--log)
do_log=1
shift
;;
--debug)
do_launch=1
do_debug=1
shift
;;
*)
echo "Unknown option '$1'" 1>&2
need_usage=1
shift
;;
esac
done
if [ "$do_anything" == "0" ]; then
need_usage=1
fi
if [ "$need_usage" == "1" ]; then
echo "USAGE: $0 <project_dir> [--kill] [--uninstall] [--build] [--install] [--launch] [--debug] [--log]" 1>&2
echo "" 1>&2
exit 1
fi
if [ "$do_build" == "1" ]; then
if [ "$do_debug" == "1" ]; then
do_install=1
elif [ "$do_launch" == "1" ]; then
do_install=1
fi
fi
# Here we go!
BUNDLE=`grep -F bundleName "$PROJDIR/AppScope/app.json5" |perl -w -p -e 's/\A\s*\"bundleName\"\s*\:\s*\"(.*?)\".*?\Z/$1/i;'`
if [ "x$BUNDLE" == "x" ]; then
echo "Failed to determine bundle name! Aborting!" 1>&2
exit 1
fi
echo "BUNDLE is '$BUNDLE'"
#set -x
cd "$PROJDIR"
if [ "$do_kill" == "1" ]; then
echo "KILLING..."
hdc shell aa force-stop $BUNDLE || exit 1
fi
if [ "$do_uninstall" == "1" ]; then
echo "UNINSTALLING..."
hdc uninstall $BUNDLE || exit 1
fi
if [ "$do_clean" == "1" ]; then
echo "CLEANING..."
hvigorw clean || exit 1
fi
if [ "$do_build" == "1" ]; then
echo "BUILDING..."
hvigorw assembleHap || exit 1
fi
if [ "$do_debug" == "1" ]; then
hdc shell mkdir -p data/local/tmp/debugserver/$BUNDLE
hdc file send "$CLT/sdk/default/hms/native/lldb/aarch64-linux-ohos/lldb-server" data/local/tmp/debugserver/$BUNDLE
hdc shell chmod 755 data/local/tmp/debugserver/$BUNDLE/lldb-server
fi
if [ "$do_install" == "1" ]; then
echo "INSTALLING..."
hdc install "$PROJDIR/entry/build/default/outputs/default/entry-default-signed.hap" || exit 1
fi
# Catch sigint, kill the backgrounded `hdc hilog` then exit.
trap_sigint() {
if [ "$HILOGPID" != "" ]; then
kill -9 "$HILOGPID"
fi
wait "$HILOGPID" 2>/dev/null
echo ""
#echo "Killed $HILOGPID"
exit 0
}
HILOGPID=""
if [ "$do_log" == "1" ]; then
trap trap_sigint INT
# This wild bash syntax puts `hdc` in the background, and pipes its output through `grep`, but `$!` will have hdc's process ID.
# The ridiculous perl regular expression basically filters out a ton of garbage from each line of the log. You can remove it entirely and just grep for the bundle name, though!
hdc hilog > >(grep -F --line-buffered "/$BUNDLE/" |perl -w -p -e 's/\A\d+\-\d+\s+(\d+\:\d+\:\d+)\.\d+\s+\d+\s+\d+\s+(.)\s+.*?\/.*?\/(.*?)\:\s+/$1 $2 $3: /;') & HILOGPID="$!"
fi
if [ "$do_launch" == "1" ]; then
echo "LAUNCHING..."
# !!! FIXME: maybe this makes the process wait on launch until debugger is attached?
#hdc shell aa appdebug -b $BUNDLE
hdc shell aa start -a EntryAbility -b $BUNDLE || exit 1
fi
if [ "$do_debug" == "1" ]; then
echo "DEBUGGING..."
hdc shell aa attach -b $BUNDLE
hdc shell aa process -a EntryAbility -b $BUNDLE -D "/data/local/tmp/debugserver/$BUNDLE/lldb-server platform --listen unix-abstract:///lldb-server/platform.sock"
PID=`hdc shell ps -w -o PID,ARGS |grep -F "$BUNDLE" |head -n 1 |awk '{print $1}'`
if [ "x$PID" == "x" ]; then
echo "Failed to determine PID! Aborting!" 1>&2
exit 1
fi
echo "PID is $PID"
trap - INT
"$CLT/sdk/default/openharmony/native/llvm/bin/lldb" \
-O "platform select remote-ohos" \
-O "platform connect unix-abstract-connect:///lldb-server/platform.sock" \
-O "settings append target.exec-search-paths \"$PROJDIR/entry/build/default/intermediates/cmake/default/obj/arm64-v8a\"" \
-O "attach $PID"
trap trap_sigint INT
fi
if [ "$HILOGPID" != "" ]; then
#echo "$0: WAITING ON $HILOGPID"
wait "$HILOGPID"
fi