mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-09-17 02:32:04 +00:00
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.
210 lines
5.2 KiB
Bash
Executable File
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
|
|
|