2019-08-11 19:30:35 +00:00
#!/usr/bin/env bash
2016-02-01 06:43:46 +00:00
2023-04-02 19:00:45 +00:00
ANSI_GREEN="\033[32;1m"
ANSI_RED="\033[31;1m"
2020-07-10 14:05:54 +00:00
is_mac() {
if [ "$(uname -s)" != "Darwin" ]; then
echo "You need a mac to build this package"
exit 1
fi
}
2017-04-11 09:28:01 +00:00
CURDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
2020-12-18 17:26:32 +00:00
VERSION="$(git describe HEAD)"
2018-10-31 22:34:11 +00:00
# Only append date if we're not on a whole version, like v2018.11
2020-12-18 17:26:32 +00:00
if echo "${VERSION}" | grep -q -- "-"; then
VERSION="${VERSION}_$(git describe HEAD | xargs git show -s --format=format:"%cd" --date=short)"
2018-10-31 22:34:11 +00:00
fi
2016-02-01 06:43:46 +00:00
2017-10-13 19:43:58 +00:00
# Default Android build to arm.
2018-07-01 15:35:12 +00:00
ANDROID_ARCH="${ANDROID_ARCH:-arm}"
2019-08-29 19:59:00 +00:00
2019-03-02 12:28:04 +00:00
# Default android flavor
2020-12-18 17:26:32 +00:00
ANDROID_FLAVOR="${ANDROID_FLAVOR:-rocks}"
2019-03-02 12:28:04 +00:00
export ANDROID_FLAVOR
2017-04-11 09:28:01 +00:00
function assert_ret_zero() {
2018-07-01 15:35:12 +00:00
if [ "${1}" -ne 0 ]; then
2018-11-02 10:42:34 +00:00
if [ -n "${2}" ]; then
2018-07-01 15:35:12 +00:00
echo "${2}"
2016-02-04 07:37:00 +00:00
fi
exit 1
fi
}
2017-04-11 09:28:01 +00:00
function check_submodules() {
2023-02-03 12:45:23 +00:00
if git submodule status | grep -qE '^-'; then
2017-04-09 08:42:16 +00:00
kodev-fetch-thirdparty
fi
2016-05-30 05:57:04 +00:00
}
2017-09-16 15:01:31 +00:00
# Takes two arguments:
# $1 arguments to pass to pgrep
# $2 process name to pgrep for
function gnuplot_wrapper() {
# inspired by https://gist.github.com/nicolasazrak/32d68ed6c845a095f75f037ecc2f0436
trap capture_ctrl_c INT
2020-12-18 17:26:32 +00:00
TEMP_DIR="$(mktemp --directory /tmp/tmp.koreaderXXX)"
2020-02-02 19:35:21 +00:00
LOG="${TEMP_DIR}/memory.log"
SCRIPT_PNG="${TEMP_DIR}/script_png.p"
SCRIPT_SHOW="${TEMP_DIR}/script_show.p"
IMAGE_PNG="${TEMP_DIR}/graph.png"
2017-09-16 15:01:31 +00:00
2020-02-02 19:35:21 +00:00
echo "Memory plot output to ${TEMP_DIR}"
2017-09-16 15:01:31 +00:00
2020-02-02 19:35:21 +00:00
cat >"${SCRIPT_PNG}" <<EOL
2017-09-16 15:01:31 +00:00
set term pngcairo size 1600,1200
2020-02-02 19:35:21 +00:00
set output "${IMAGE_PNG}"
2017-09-16 15:01:31 +00:00
set ylabel "RSS"
set y2label "VSZ"
set ytics nomirror
set y2tics nomirror in
set yrange [0:*]
set y2range [0:*]
2020-02-02 19:35:21 +00:00
plot "${LOG}" using 3 with lines axes x1y1 title "RSS", "${LOG}" using 2 with lines axes x1y2 title "VSZ"
2017-09-16 15:01:31 +00:00
EOL
2020-02-02 19:35:21 +00:00
cat >"${SCRIPT_SHOW}" <<EOL
2017-09-16 15:01:31 +00:00
set term wxt noraise
set ylabel "RSS"
set y2label "VSZ"
set ytics nomirror
set y2tics nomirror in
set yrange [0:*]
set y2range [0:*]
2020-02-02 19:35:21 +00:00
plot "${LOG}" using 3 with lines axes x1y1 title "RSS", "${LOG}" using 2 with lines axes x1y2 title "VSZ"
2017-09-16 15:01:31 +00:00
pause 1
reread
EOL
function capture_ctrl_c() {
2020-02-02 19:35:21 +00:00
kill "${LOOP_PID}"
kill "${GNUPLOT_PID}"
gnuplot "${SCRIPT_PNG}"
2017-09-16 15:01:31 +00:00
exit
}
# initialize at 0 so gnuplot has something to show
echo "0 0 0" >"${LOG}"
while true; do
# shellcheck disable=SC2086
ps -p "$(pgrep --delimiter ' ' $1 "$2")" -o pid=,vsz=,rss= >>"${LOG}"
sleep 1
done &
LOOP_PID=$!
2020-02-02 19:35:21 +00:00
gnuplot "${SCRIPT_SHOW}" &
2017-09-16 15:01:31 +00:00
GNUPLOT_PID=$!
}
2017-04-11 09:28:01 +00:00
function setup_env() {
2020-12-02 16:44:59 +00:00
SETUP_ENV_GREP_COMMAND="grep -z -v debug"
2018-07-01 15:35:12 +00:00
if [ -n "${KODEBUG}" ]; then
2020-12-02 16:44:59 +00:00
SETUP_ENV_GREP_COMMAND="grep -z debug"
2017-10-27 18:36:36 +00:00
fi
2020-12-02 16:44:59 +00:00
local files=()
while IFS= read -r -d $'\0'; do
files+=("${REPLY}")
done < <(find . -maxdepth 1 -name 'koreader-emulator-*' -print0 | ${SETUP_ENV_GREP_COMMAND})
test ${#files[@]} -gt 0
2017-10-27 18:36:36 +00:00
assert_ret_zero $? "Emulator not found. Please build it first."
2020-12-02 16:44:59 +00:00
local idx=0
# Warn if multiple matches were found
if [ ${#files[@]} -gt 1 ]; then
echo "Multiple emulator builds found:"
local ts=()
# Store list of ts at the same index
for i in "${!files[@]}"; do
local file="${files[${i}]}/koreader"
if [ -d "${file}" ]; then
echo "${file} (last modified on $(stat -c %y "${file}"))"
ts[${i}]="$(stat -c %Y "${file}")"
fi
done
# Sort the list of ts
local sorted_ts=()
IFS=$'\n' read -d '' -r -a sorted_ts < <(printf '%s\n' "${ts[@]}" | sort -r)
# Find the id of the most recent ts (spoiler: it's going to be the one currently targeted by this invocation of kodev)
for i in "${!ts[@]}"; do
if [ "${ts[${i}]}" == "${sorted_ts[0]}" ]; then
idx="${i}"
break
fi
done
# Recap
echo "Picking the most recent one: ${files[${idx}]}/koreader"
fi
EMU_DIR="${files[${idx}]}/koreader"
2019-11-18 14:24:44 +00:00
export EMU_DIR
2016-02-01 06:43:46 +00:00
}
2017-04-11 09:28:01 +00:00
function kodev-fetch-thirdparty() {
2016-02-01 06:43:46 +00:00
make fetchthirdparty
}
SUPPORTED_TARGETS="
2018-04-22 13:22:11 +00:00
kindle Compatible with all Kindle models >= Kindle4
kindlepw2 With compiler optimizations for Kindle models >= Paperwhite 2
kindle-legacy Needed only for Kindle2/3/DXG
2016-02-01 06:43:46 +00:00
kobo
2018-10-31 22:48:36 +00:00
cervantes
2020-02-08 00:58:10 +00:00
remarkable
2018-09-07 23:37:04 +00:00
sony-prstux
2022-10-24 23:54:18 +00:00
android Supports ANDROID_ARCH arm, arm64, x86 & x86_64
2016-02-01 06:43:46 +00:00
pocketbook
ubuntu-touch
2018-04-08 20:39:52 +00:00
appimage
2019-01-03 17:21:35 +00:00
debian Debian package for current arch
debian-armel Debian package for generic armel devices
debian-armhf Debian package for generic armhf devices
2020-12-11 22:22:00 +00:00
debian-arm64 Debian package for generic 64 bits arm devices
2020-07-10 14:05:54 +00:00
macos MacOS app bundle. You need a mac to build this package
2016-02-01 06:43:46 +00:00
emu (*default) If no TARGET is given, assume emulator
win32
"
2017-04-11 09:28:01 +00:00
function kodev-build() {
2016-02-01 06:43:46 +00:00
BUILD_HELP_MSG="
2016-02-19 17:38:00 +00:00
usage: build <OPTIONS> <TARGET>
OPTIONS:
2020-12-18 17:26:32 +00:00
-v, --verbose make the buildsystem more verbose
-d, --debug include debugging symbols (default for emulator)
-n, --no-debug no debugging symbols (default for target devices)
2016-02-01 06:43:46 +00:00
TARGET:
${SUPPORTED_TARGETS}"
2020-12-18 17:26:32 +00:00
declare opt
declare -r E_OPTERR=85
declare -r short_opts="vhnd"
declare -r long_opts="verbose,help,no-debug,debug"
if ! opt=$(getopt -o "${short_opts}" --long "${long_opts}" --name "kodev" -- "${@}"); then
echo "${BUILD_HELP_MSG}"
exit ${E_OPTERR}
fi
eval set -- "${opt}"
while true; do
PARAM="${1}"
# Support using an = assignment with short options (e.g., -f=blah instead of -f blah).
VALUE="${2/#=/}"
2018-07-01 15:35:12 +00:00
case "${PARAM}" in
2016-02-19 17:38:00 +00:00
-v | --verbose)
2017-04-11 09:28:01 +00:00
export VERBOSE=1
;;
2016-02-19 17:38:00 +00:00
-h | --help)
2017-04-11 09:28:01 +00:00
echo "${BUILD_HELP_MSG}"
exit 0
;;
2020-12-18 17:26:32 +00:00
-n | --no-debug)
2018-01-04 17:35:02 +00:00
export KODEBUG=
KODEBUG_NO_DEFAULT=1
;;
2020-12-18 17:26:32 +00:00
-d | --debug)
2018-01-04 17:35:02 +00:00
export KODEBUG=1
KODEBUG_NO_DEFAULT=1
;;
2020-12-18 17:26:32 +00:00
--)
break
;;
2016-02-19 17:38:00 +00:00
*)
2020-02-02 19:35:21 +00:00
echo "ERROR: unknown option \"${PARAM}\""
2016-02-19 17:38:00 +00:00
echo "${BUILD_HELP_MSG}"
2020-12-18 17:26:32 +00:00
exit 8
2017-04-11 09:28:01 +00:00
;;
2016-02-19 17:38:00 +00:00
esac
2020-12-18 17:26:32 +00:00
shift
2016-02-19 17:38:00 +00:00
done
2020-12-18 17:26:32 +00:00
shift
2016-02-19 17:38:00 +00:00
2016-10-02 04:42:00 +00:00
check_submodules
2018-07-01 15:35:12 +00:00
case "${1}" in
2018-10-31 22:48:36 +00:00
cervantes)
make TARGET=cervantes
assert_ret_zero $?
;;
2016-02-01 06:43:46 +00:00
kindle)
2017-04-11 09:28:01 +00:00
make TARGET=kindle
assert_ret_zero $?
;;
2016-10-10 06:52:19 +00:00
kindlepw2)
2017-04-11 09:28:01 +00:00
make TARGET=kindlepw2
assert_ret_zero $?
;;
2016-02-01 06:43:46 +00:00
kobo)
2017-04-11 09:28:01 +00:00
make TARGET=kobo
assert_ret_zero $?
;;
2020-02-08 00:58:10 +00:00
remarkable)
make TARGET=remarkable
assert_ret_zero $?
;;
2018-09-07 23:37:04 +00:00
sony-prstux)
make TARGET=sony-prstux
assert_ret_zero $?
;;
2016-02-01 06:43:46 +00:00
kindle-legacy)
2017-04-11 09:28:01 +00:00
make TARGET=kindle-legacy
assert_ret_zero $?
;;
2016-02-01 06:43:46 +00:00
android)
2023-07-10 17:47:45 +00:00
make android-ndk || exit $?
2017-04-11 09:28:01 +00:00
make TARGET=android
assert_ret_zero $?
;;
2016-02-01 06:43:46 +00:00
pocketbook)
2017-04-11 09:28:01 +00:00
make TARGET=pocketbook
assert_ret_zero $?
;;
2016-02-01 06:43:46 +00:00
ubuntu-touch)
2017-04-11 09:28:01 +00:00
make TARGET=ubuntu-touch
assert_ret_zero $?
;;
2018-04-08 20:39:52 +00:00
appimage)
make TARGET=appimage
assert_ret_zero $?
;;
2019-01-03 17:21:35 +00:00
debian)
make TARGET=debian
assert_ret_zero $?
;;
debian-armel)
make TARGET=debian-armel
assert_ret_zero $?
;;
debian-armhf)
make TARGET=debian-armhf
assert_ret_zero $?
;;
2020-12-11 22:22:00 +00:00
debian-arm64)
make TARGET=debian-arm64
assert_ret_zero $?
;;
2020-07-10 14:05:54 +00:00
macos)
is_mac
make TARGET=macos
assert_ret_zero $?
;;
2016-02-01 06:43:46 +00:00
win32)
2017-04-11 09:28:01 +00:00
make TARGET=win32
assert_ret_zero $?
;;
2016-02-01 06:43:46 +00:00
*)
2018-07-01 15:35:12 +00:00
if [ -z "${KODEBUG_NO_DEFAULT}" ]; then # no explicit --debug / --no-debug
2018-01-04 17:35:02 +00:00
# builds a debug build by default, like kodev-run
export KODEBUG=1
fi
2016-02-01 06:43:46 +00:00
make
2016-07-10 22:52:24 +00:00
assert_ret_zero $? "Failed to build emulator! Try run with -v for more information."
2017-04-11 09:28:01 +00:00
setup_env
;;
2016-02-01 06:43:46 +00:00
esac
}
2017-04-11 09:28:01 +00:00
function kodev-clean() {
2016-02-01 06:43:46 +00:00
CLEAN_HELP_MSG="
usage: clean <TARGET>
TARGET:
${SUPPORTED_TARGETS}"
2020-12-18 17:26:32 +00:00
declare opt
declare -r E_OPTERR=85
declare -r short_opts="nd"
declare -r long_opts="no-debug,debug"
if ! opt=$(getopt -o "${short_opts}" --long "${long_opts}" --name "kodev" -- "${@}"); then
echo "${CLEAN_HELP_MSG}"
exit ${E_OPTERR}
fi
eval set -- "${opt}"
while true; do
PARAM="${1}"
# Support using an = assignment with short options (e.g., -f=blah instead of -f blah).
VALUE="${2/#=/}"
2018-10-14 06:49:37 +00:00
case "${PARAM}" in
2020-12-18 17:26:32 +00:00
-n | --no-debug)
2018-10-14 06:49:37 +00:00
export KODEBUG=
KODEBUG_NO_DEFAULT=1
;;
2020-12-18 17:26:32 +00:00
-d | --debug)
2018-10-14 06:49:37 +00:00
export KODEBUG=1
KODEBUG_NO_DEFAULT=1
;;
2020-12-18 17:26:32 +00:00
--)
break
;;
2018-10-14 06:49:37 +00:00
*)
2020-02-02 19:35:21 +00:00
echo "ERROR: unknown option \"${PARAM}\""
2018-10-14 06:49:37 +00:00
echo "${BUILD_HELP_MSG}"
2020-12-18 17:26:32 +00:00
exit 8
2018-10-14 06:49:37 +00:00
;;
esac
2020-12-18 17:26:32 +00:00
shift
2018-10-14 06:49:37 +00:00
done
2020-12-18 17:26:32 +00:00
shift
2018-10-14 06:49:37 +00:00
2018-07-01 15:35:12 +00:00
case "${1}" in
2016-02-01 06:43:46 +00:00
-h | --help)
2017-04-11 09:28:01 +00:00
echo "${CLEAN_HELP_MSG}"
exit 0
;;
2018-10-31 22:48:36 +00:00
cervantes)
make TARGET=cervantes clean
;;
2016-02-01 06:43:46 +00:00
kindle)
2017-04-11 09:28:01 +00:00
make TARGET=kindle clean
;;
2016-10-10 06:52:19 +00:00
kindlepw2)
2017-04-11 09:28:01 +00:00
make TARGET=kindlepw2 clean
;;
2016-02-01 06:43:46 +00:00
kobo)
2017-04-11 09:28:01 +00:00
make TARGET=kobo clean
;;
2020-02-08 00:58:10 +00:00
remarkable)
make TARGET=remarkable clean
;;
2018-09-07 23:37:04 +00:00
sony-prstux)
make TARGET=sony-prstux clean
;;
2016-02-01 06:43:46 +00:00
kindle-legacy)
2017-04-11 09:28:01 +00:00
make TARGET=kindle-legacy clean
;;
2016-02-01 06:43:46 +00:00
android)
make TARGET=android clean
2017-04-11 09:28:01 +00:00
rm -f ./*.apk
;;
2016-02-01 06:43:46 +00:00
pocketbook)
2017-04-11 09:28:01 +00:00
make TARGET=pocketbook clean
;;
2016-02-01 06:43:46 +00:00
ubuntu-touch)
2017-04-11 09:28:01 +00:00
make TARGET=ubuntu-touch clean
;;
2018-04-08 20:39:52 +00:00
appimage)
make TARGET=appimage clean
;;
2019-01-03 17:21:35 +00:00
debian)
make TARGET=debian clean
;;
debian-armel)
make TARGET=debian-armel clean
;;
debian-armhf)
make TARGET=debian-armhf clean
;;
2020-12-11 22:22:00 +00:00
debian-arm64)
make TARGET=debian-arm64 clean
;;
2020-07-10 14:05:54 +00:00
macos)
is_mac
make TARGET=macos clean
;;
2016-02-01 06:43:46 +00:00
win32)
2017-04-11 09:28:01 +00:00
make TARGET=win32 clean
;;
2016-02-01 06:43:46 +00:00
*)
2020-12-18 17:26:32 +00:00
if [ -z "${KODEBUG_NO_DEFAULT}" ]; then
# No explicit --debug / --no-debug
# Builds a debug build by default, like kodev-run
2018-10-14 06:49:37 +00:00
export KODEBUG=1
fi
2017-04-11 09:28:01 +00:00
make clean
;;
2016-02-01 06:43:46 +00:00
esac
}
2017-04-11 09:28:01 +00:00
function kodev-release() {
2016-02-01 06:43:46 +00:00
# SUPPORTED_RELEASE_TARGETS=$(echo ${SUPPORTED_TARGETS} | sed 's/win32//')
SUPPORTED_RELEASE_TARGETS="${SUPPORTED_TARGETS/emu*/""}"
RELEASE_HELP_MSG="
2017-05-08 09:37:29 +00:00
usage: release <OPTIONS> <TARGET>
OPTIONS:
2020-12-18 17:26:32 +00:00
-d, --debug debug-enabled release (for remote gdb)
-i, --ignore-translation do not fetch translation for release
-v, --verbose make the buildsystem more verbose
2016-02-01 06:43:46 +00:00
TARGET:
${SUPPORTED_RELEASE_TARGETS}"
2017-04-11 09:28:01 +00:00
[ $# -lt 1 ] && {
echo "${RELEASE_HELP_MSG}"
exit 1
}
2016-02-01 06:43:46 +00:00
2020-12-18 17:26:32 +00:00
# Defaults
2017-05-08 09:37:29 +00:00
ignore_translation=0
2020-12-18 17:26:32 +00:00
declare opt
declare -r E_OPTERR=85
declare -r short_opts="divh"
declare -r long_opts="debug,ignore-translation,verbose,help"
if ! opt=$(getopt -o "${short_opts}" --long "${long_opts}" --name "kodev" -- "${@}"); then
echo "${RELEASE_HELP_MSG}"
exit ${E_OPTERR}
fi
eval set -- "${opt}"
while true; do
PARAM="${1}"
# Support using an = assignment with short options (e.g., -f=blah instead of -f blah).
VALUE="${2/#=/}"
2018-07-01 15:35:12 +00:00
case "${PARAM}" in
2020-12-18 17:26:32 +00:00
-d | --debug)
2017-10-20 13:59:53 +00:00
export KODEBUG=1
;;
2020-12-18 17:26:32 +00:00
-i | --ignore-translation)
2017-05-08 09:37:29 +00:00
ignore_translation=1
;;
2016-10-12 05:02:51 +00:00
-v | --verbose)
2017-04-11 09:28:01 +00:00
export VERBOSE=1
;;
2016-10-12 05:02:51 +00:00
-h | --help)
2017-04-11 09:28:01 +00:00
echo "${RELEASE_HELP_MSG}"
exit 0
;;
2020-12-18 17:26:32 +00:00
--)
break
;;
2016-10-12 05:02:51 +00:00
*)
2020-02-02 19:35:21 +00:00
echo "ERROR: unknown option \"${PARAM}\""
2017-04-11 09:28:01 +00:00
echo "${RELEASE_HELP_MSG}"
exit 1
;;
2016-10-12 05:02:51 +00:00
esac
2020-12-18 17:26:32 +00:00
shift
2016-10-12 05:02:51 +00:00
done
2020-12-18 17:26:32 +00:00
shift
2016-10-12 05:02:51 +00:00
2019-10-19 15:45:49 +00:00
check_submodules
2017-05-08 09:37:29 +00:00
if [ "${ignore_translation}" -eq 0 ]; then
2020-01-01 20:18:09 +00:00
make po || {
echo "ERROR: failed to fetch translation."
echo "Tip: Use --ignore-translation OPTION if you want to build a release without translation."
exit 1
}
2017-05-08 09:37:29 +00:00
fi
2016-10-12 05:02:51 +00:00
2018-07-01 15:35:12 +00:00
case "${1}" in
2016-02-01 06:43:46 +00:00
kindle)
kodev-build kindle
2017-04-11 09:28:01 +00:00
make TARGET=kindle update
;;
2016-10-10 06:52:19 +00:00
kindlepw2)
kodev-build kindlepw2
2017-04-11 09:28:01 +00:00
make TARGET=kindlepw2 update
;;
2016-02-01 06:43:46 +00:00
kobo)
kodev-build kobo
2017-04-11 09:28:01 +00:00
make TARGET=kobo update
;;
2020-02-08 00:58:10 +00:00
remarkable)
kodev-build remarkable
make TARGET=remarkable update
;;
2018-09-07 23:37:04 +00:00
sony-prstux)
kodev-build sony-prstux
make TARGET=sony-prstux update
;;
2018-10-31 22:48:36 +00:00
cervantes)
kodev-build cervantes
make TARGET=cervantes update
;;
2016-02-01 06:43:46 +00:00
kindle-legacy)
kodev-build kindle-legacy
2017-04-11 09:28:01 +00:00
make TARGET=kindle-legacy update
;;
2016-02-01 06:43:46 +00:00
android)
2023-07-10 17:47:45 +00:00
make android-sdk || exit $?
2016-02-01 06:43:46 +00:00
kodev-build android
2017-04-11 09:28:01 +00:00
make TARGET=android update
;;
2016-02-01 06:43:46 +00:00
pocketbook)
kodev-build pocketbook
2017-04-11 09:28:01 +00:00
make TARGET=pocketbook update
;;
2016-02-01 06:43:46 +00:00
ubuntu-touch)
2018-04-08 20:39:52 +00:00
kodev-build ubuntu-touch
2017-04-11 09:28:01 +00:00
make TARGET=ubuntu-touch update
;;
2018-04-08 20:39:52 +00:00
appimage)
kodev-build appimage
make TARGET=appimage update
;;
2019-01-03 17:21:35 +00:00
debian)
kodev-build debian
make TARGET=debian update
;;
debian-armel)
kodev-build debian-armel
make TARGET=debian-armel update
;;
debian-armhf)
kodev-build debian-armhf
make TARGET=debian-armhf update
;;
2020-12-11 22:22:00 +00:00
debian-arm64)
kodev-build debian-arm64
make TARGET=debian-arm64 update
;;
2020-07-10 14:05:54 +00:00
macos)
is_mac
kodev-build macos
make TARGET=macos update
;;
2016-02-01 06:43:46 +00:00
*)
echo "Unsupported target for release: $1."
2017-04-11 09:28:01 +00:00
echo "${RELEASE_HELP_MSG}"
exit 1
;;
2016-02-01 06:43:46 +00:00
esac
}
2017-04-11 09:28:01 +00:00
function kodev-wbuilder() {
2016-02-01 06:43:46 +00:00
kodev-build
echo "[*] Running wbuilder.lua..."
2017-04-11 09:28:01 +00:00
pushd "${EMU_DIR}" && {
2016-11-25 14:57:02 +00:00
EMULATE_READER_W=540 EMULATE_READER_H=720 ./luajit ./tools/wbuilder.lua
2017-09-16 15:01:31 +00:00
} && popd || exit
2016-02-01 06:43:46 +00:00
}
2017-04-11 09:28:01 +00:00
function kodev-run() {
2016-02-01 06:43:46 +00:00
RUN_HELP_MSG="
2017-10-04 09:46:13 +00:00
usage: run <OPTIONS> <TARGET>
2016-02-01 06:43:46 +00:00
OPTIONS:
2020-12-18 17:26:32 +00:00
-h X, --screen-height=X set height of the emulator screen (default: 720)
-w X, --screen-width=X set width of the emulator screen (default: 540)
-d X, --screen-dpi=X set DPI of the emulator screen (default: 160)
-b, --no-build run reader without rebuilding
-n, --no-debug no debugging symbols (requires rebuilding)
-t, --disable-touch use this if you want to simulate keyboard only devices
-s FOO --simulate=FOO simulate dimension and other specs for a given device model
supported model: hidpi, kobo-forma, kobo-aura-one, kobo-clara, kindle-paperwhite, kobo-h2o, legacy-paperwhite, kindle
-g X, --gdb=X run with debugger (default: nemiver)
-p, --graph graph memory use (requires gnuplot)
-v X, --valgrind=X run with valgrind (default: \"valgrind --tool=memcheck --trace-children=yes --leak-check=full --track-origins=yes --show-reachable=yes\")
-c, --callgrind run with valgrind's callgrind (valgrind --tool=callgrind --trace-children=yes)
2020-12-24 23:38:31 +00:00
-S, --no-catchsegv prevents wrapping by catchsegv
2017-10-04 09:46:13 +00:00
TARGET:
android install and run KOReader on an Android device connected through ADB
2016-02-01 06:43:46 +00:00
"
2020-12-18 17:26:32 +00:00
# NOTE: Speaking of Valgrind, if your libdrm/mesa isn't built w/ valgrind markings, there's a Valgrind suppression file for AMD cards in the tools folder.
# Just append --suppressions=${PWD/tools/valgrind_amd.supp to your valgrind command.
# Defaults
2016-03-17 06:05:09 +00:00
screen_width=540
screen_height=720
2017-10-20 13:59:53 +00:00
export KODEBUG=1
2020-12-18 17:26:32 +00:00
declare opt
declare -r E_OPTERR=85
2020-12-24 23:38:31 +00:00
declare -r short_opts="tbng::pv::cw:h:d:s:SH"
declare -r long_opts="disable-touch,no-build,gdb::,graph,valgrind::,callgrind,screen-width:,screen-height:,screen-dpi:,simulate:,no-catchsegv,help"
2020-12-18 17:26:32 +00:00
if ! opt=$(getopt -o "${short_opts}" --long "${long_opts}" --name "kodev" -- "${@}"); then
echo "${RUN_HELP_MSG}"
exit ${E_OPTERR}
fi
eval set -- "${opt}"
while true; do
PARAM="${1}"
# Support using an = assignment with short options (e.g., -f=blah instead of -f blah).
VALUE="${2/#=/}"
2018-07-01 15:35:12 +00:00
case "${PARAM}" in
2020-12-18 17:26:32 +00:00
-t | --disable-touch)
2017-04-11 09:28:01 +00:00
export DISABLE_TOUCH=1
;;
2020-12-18 17:26:32 +00:00
-b | --no-build)
2018-07-01 15:35:12 +00:00
no_build=1
2017-04-11 09:28:01 +00:00
;;
2020-12-18 17:26:32 +00:00
-n | --no-debug)
2017-10-20 13:59:53 +00:00
export KODEBUG=
;;
2020-12-18 17:26:32 +00:00
-g | --gdb)
2018-11-02 10:42:34 +00:00
if [ -n "${VALUE}" ]; then
2020-12-18 17:26:32 +00:00
gdb="${VALUE}"
2017-10-20 13:59:53 +00:00
else
# Try to use friendly defaults for gdb
if command -v nemiver >/dev/null; then
# Nemiver is a nice GUI
2020-12-18 17:26:32 +00:00
gdb="nemiver"
2017-10-20 13:59:53 +00:00
elif command -v ddd >/dev/null; then
# DDD is a slightly less nice GUI
2020-12-18 17:26:32 +00:00
gdb="ddd"
2017-10-20 13:59:53 +00:00
elif command -v cgdb >/dev/null; then
# cgdb is a nice curses-based gdb front
2020-12-18 17:26:32 +00:00
gdb="cgdb"
2017-10-20 13:59:53 +00:00
elif command -v gdb >/dev/null; then
# gdb -tui is a slightly less nice terminal user interface
gdb="gdb -tui"
else
echo "Couldn't find gdb."
exit 1
fi
fi
2020-12-18 17:26:32 +00:00
shift
2017-10-20 13:59:53 +00:00
;;
2020-12-18 17:26:32 +00:00
-p | --graph)
2018-07-01 15:35:12 +00:00
graph_memory=1
2017-09-16 15:01:31 +00:00
;;
2020-12-18 17:26:32 +00:00
-v | --valgrind)
2018-11-02 10:42:34 +00:00
if [ -n "${VALUE}" ]; then
2020-12-18 17:26:32 +00:00
valgrind="${VALUE}"
2017-10-20 13:59:53 +00:00
else
# Try to use sensible defaults for valgrind
if command -v valgrind >/dev/null; then
2020-12-18 17:26:32 +00:00
valgrind="valgrind --tool=memcheck --trace-children=yes --leak-check=full --track-origins=yes --show-reachable=yes"
2017-10-20 13:59:53 +00:00
else
echo "Couldn't find valgrind."
exit 1
fi
fi
2020-12-18 17:26:32 +00:00
shift
;;
-c | --callgrind)
# Try to use sensible defaults for valgrind
if command -v valgrind >/dev/null; then
valgrind="valgrind --tool=callgrind --trace-children=yes"
else
echo "Couldn't find valgrind."
exit 1
fi
2017-10-20 13:59:53 +00:00
;;
2016-03-17 06:05:09 +00:00
-w | --screen-width)
2017-04-11 09:28:01 +00:00
screen_width=${VALUE}
2020-12-18 17:26:32 +00:00
shift
2017-04-11 09:28:01 +00:00
;;
2016-03-17 06:05:09 +00:00
-h | --screen-height)
2017-10-01 15:13:47 +00:00
# simple numeric check due to overlap between -h for help and height
2018-11-02 10:42:34 +00:00
if [ -n "${VALUE##*[!0-9]*}" ]; then
2017-10-01 15:13:47 +00:00
screen_height=${VALUE}
else
2020-12-18 17:26:32 +00:00
echo "ERROR: Invalid value: \"${VALUE}\""
2017-10-01 15:13:47 +00:00
echo "${RUN_HELP_MSG}"
2017-10-20 13:59:53 +00:00
exit 1
2017-10-01 15:13:47 +00:00
fi
2020-12-18 17:26:32 +00:00
shift
2017-04-11 09:28:01 +00:00
;;
2017-09-14 11:19:20 +00:00
-d | --screen-dpi)
screen_dpi=${VALUE}
2020-12-18 17:26:32 +00:00
shift
2017-09-14 11:19:20 +00:00
;;
2017-04-23 04:32:58 +00:00
-s | --simulate)
2020-12-18 17:26:32 +00:00
device_model="${VALUE}"
2018-07-01 15:35:12 +00:00
case "${device_model}" in
2020-12-18 17:26:32 +00:00
kindle)
2017-04-23 04:32:58 +00:00
screen_width=600
screen_height=800
2020-12-18 17:26:32 +00:00
screen_dpi=167
;;
legacy-paperwhite)
screen_width=758
screen_height=1024
screen_dpi=212
;;
kobo-forma)
screen_width=1440
screen_height=1920
screen_dpi=300
2017-04-23 04:32:58 +00:00
;;
kobo-aura-one)
screen_width=1404
screen_height=1872
2017-09-14 11:19:20 +00:00
screen_dpi=300
;;
2020-12-18 17:26:32 +00:00
kobo-clara | kindle-paperwhite)
screen_width=1072
screen_height=1448
screen_dpi=300
;;
kobo-h2o)
screen_width=1080
screen_height=1429
screen_dpi=265
;;
2017-09-14 11:19:20 +00:00
hidpi)
screen_width=1500
screen_height=2000
screen_dpi=600
2017-04-23 04:32:58 +00:00
;;
*)
echo "ERROR: spec unknown for ${device_model}."
;;
esac
2020-12-18 17:26:32 +00:00
shift
2017-04-23 04:32:58 +00:00
;;
2020-12-24 23:38:31 +00:00
-S | --no-catchsegv)
no_catchsegv=1
2020-12-18 17:26:32 +00:00
;;
-H | --help)
2017-04-11 09:28:01 +00:00
echo "${RUN_HELP_MSG}"
exit 0
;;
2020-12-18 17:26:32 +00:00
--)
break
;;
2016-02-01 06:43:46 +00:00
*)
2020-02-02 19:35:21 +00:00
echo "ERROR: unknown option \"${PARAM}\""
2017-04-11 09:28:01 +00:00
echo "${RUN_HELP_MSG}"
2020-12-18 17:26:32 +00:00
exit 8
2017-04-11 09:28:01 +00:00
;;
2016-02-01 06:43:46 +00:00
esac
shift
done
2020-12-18 17:26:32 +00:00
shift
2016-02-01 06:43:46 +00:00
2018-07-01 15:35:12 +00:00
case "${1}" in
2017-10-04 09:46:13 +00:00
android)
command -v adb >/dev/null && {
2018-07-01 15:35:12 +00:00
if [ -z "${no_build}" ]; then
2022-10-24 23:54:18 +00:00
echo "[*] Building KOReader for Android ${ANDROID_ARCH}…"
2017-10-04 09:46:13 +00:00
kodev-release --ignore-translation android
2017-10-27 18:36:36 +00:00
assert_ret_zero $?
2017-10-04 09:46:13 +00:00
fi
2023-05-10 21:56:57 +00:00
if [ -n "${KODEBUG}" ]; then
KODEBUG_SUFFIX=-debug
fi
2017-10-04 09:46:13 +00:00
# clear logcat to get rid of useless cruft
adb logcat -c
# uninstall existing package to make sure *everything* is gone from memory
2017-10-27 18:36:36 +00:00
# no assert_ret_zero; uninstall is allowed to fail if there's nothing to uninstall
2023-05-10 21:56:57 +00:00
adb uninstall "org.koreader.launcher${KODEBUG_SUFFIX/-/.}"
2019-08-29 19:59:00 +00:00
adb install "koreader-android-${ANDROID_ARCH}${KODEBUG_SUFFIX}-${VERSION}.apk"
2017-10-27 18:36:36 +00:00
assert_ret_zero $?
2017-10-04 09:46:13 +00:00
# there's no adb run so we do this…
2023-05-10 21:56:57 +00:00
adb shell monkey -p org.koreader.launcher${KODEBUG_SUFFIX/-/.} -c android.intent.category.LAUNCHER 1
2017-10-27 18:36:36 +00:00
assert_ret_zero $?
2023-07-10 17:47:45 +00:00
adb logcat KOReader:V luajit-launcher:V dlopen:V "*:E"
2017-10-04 09:46:13 +00:00
} || echo "Failed to find adb in PATH to interact with Android device."
;;
*)
2018-07-01 15:35:12 +00:00
if [ -z "${no_build}" ]; then
2017-10-04 09:46:13 +00:00
echo "[*] Building KOReader…"
2018-07-01 15:35:12 +00:00
if [ -z "${KODEBUG}" ]; then
kodev-build --no-debug
else
kodev-build
fi
2017-10-04 09:46:13 +00:00
else
setup_env
fi
2016-02-01 06:43:46 +00:00
2017-10-04 09:46:13 +00:00
if [ ! -d "${EMU_DIR}" ]; then
echo "Failed to find emulator directory! Please try build command first."
exit 1
fi
2016-02-04 04:34:10 +00:00
2018-07-01 15:35:12 +00:00
if [ -n "${graph_memory}" ]; then
2017-10-04 09:46:13 +00:00
gnuplot_wrapper "--parent $$" "reader.lua"
fi
2017-09-16 15:01:31 +00:00
2020-12-24 23:38:31 +00:00
KOREADER_ARGS="-d"
2023-07-16 01:51:57 +00:00
KOREADER_COMMAND="./reader.lua ${KOREADER_ARGS}"
2017-10-20 13:59:53 +00:00
2020-12-24 23:38:31 +00:00
# run with catchsegv by default when it is available (unless no-catchsegv is enabled, c.f., #7036)
2020-12-18 17:26:32 +00:00
# see https://github.com/koreader/koreader/issues/2878#issuecomment-326796777
2020-12-24 23:38:31 +00:00
if [ -z "${no_catchsegv}" ]; then
if command -v catchsegv >/dev/null; then
KOREADER_COMMAND="$(command -v catchsegv) ${KOREADER_COMMAND}"
fi
2017-10-20 13:59:53 +00:00
fi
2018-11-02 10:42:34 +00:00
if [ -n "${valgrind}" ]; then
2023-07-16 01:51:57 +00:00
KOREADER_COMMAND="${valgrind} ./luajit reader.lua ${KOREADER_ARGS}"
2017-10-20 13:59:53 +00:00
fi
2021-01-07 19:38:10 +00:00
echo "[*] Running KOReader with arguments: $* ..."
2017-10-04 09:46:13 +00:00
pushd "${EMU_DIR}" && {
2021-01-07 19:38:10 +00:00
if [ $# -ge 1 ]; then
2017-10-04 09:46:13 +00:00
args="$*"
2018-07-01 15:35:12 +00:00
[[ "${args}" != /* ]] && args="${CURDIR}/${args}"
2017-10-04 09:46:13 +00:00
fi
2020-12-18 17:26:32 +00:00
if [ -n "${gdb}" ]; then
# We don't want to stack valgrind/catchsegv on top of GDB ;).
if [[ "${gdb}" == gdb* ]]; then
# The standard CLI needs a little hand holding to properly pass arguments to the process it'll monitor
2023-07-16 01:51:57 +00:00
KOREADER_COMMAND="${gdb} --args ./luajit reader.lua ${KOREADER_ARGS} ${args}"
2020-12-18 17:26:32 +00:00
else
2023-07-16 01:51:57 +00:00
KOREADER_COMMAND="${gdb} ./luajit reader.lua ${KOREADER_ARGS} ${args}"
2020-12-18 17:26:32 +00:00
fi
else
KOREADER_COMMAND="${KOREADER_COMMAND} ${args}"
fi
2016-02-01 06:43:46 +00:00
2017-10-04 09:46:13 +00:00
RETURN_VALUE=85
2018-07-01 15:35:12 +00:00
while [ "${RETURN_VALUE}" -eq 85 ]; do
2020-12-18 17:26:32 +00:00
# shellcheck disable=SC2086
env EMULATE_READER_W="${screen_width}" EMULATE_READER_H="${screen_height}" EMULATE_READER_DPI="${screen_dpi}" \
2017-10-20 13:59:53 +00:00
${KOREADER_COMMAND}
2017-10-04 09:46:13 +00:00
RETURN_VALUE=$?
done
} && popd || exit
2017-09-16 15:01:31 +00:00
2018-07-01 15:35:12 +00:00
if [ -n "${graph_memory}" ]; then
2017-10-04 09:46:13 +00:00
capture_ctrl_c
fi
2020-12-18 17:26:32 +00:00
exit ${RETURN_VALUE}
2017-10-04 09:46:13 +00:00
;;
esac
2016-02-01 06:43:46 +00:00
}
2017-04-11 09:28:01 +00:00
function kodev-test() {
2016-02-04 07:37:00 +00:00
TEST_HELP_MSG="
2016-02-16 06:34:48 +00:00
usage: test <OPTIONS> [front|base] <TEST_NAME>
2016-02-04 07:37:00 +00:00
TEST_NAME is optional. If no TEST_NAME is given, all tests will be run.
2016-02-16 06:34:48 +00:00
OPTIONS:
2020-12-18 17:26:32 +00:00
-p, --graph graph memory use (requires gnuplot)
-n, --no-debug no debugging symbols (default for target devices)
-t, --tags=TAGS only run tests with given tags
2016-02-04 07:37:00 +00:00
"
2020-12-18 17:26:32 +00:00
declare opt
declare -r E_OPTERR=85
declare -r short_opts="pt:nh"
declare -r long_opts="graph,tags:,no-debug,help"
if ! opt=$(getopt -o "${short_opts}" --long "${long_opts}" --name "kodev" -- "${@}"); then
echo "${TEST_HELP_MSG}"
exit ${E_OPTERR}
fi
eval set -- "${opt}"
while true; do
PARAM="${1}"
# Support using an = assignment with short options (e.g., -f=blah instead of -f blah).
VALUE="${2/#=/}"
2018-07-01 15:35:12 +00:00
case "${PARAM}" in
2020-12-18 17:26:32 +00:00
-p | --graph)
2018-07-01 15:35:12 +00:00
graph_memory=1
2017-09-16 15:01:31 +00:00
;;
2020-12-18 17:26:32 +00:00
-n | --no-debug)
2019-04-25 15:40:42 +00:00
export KODEBUG=
KODEBUG_NO_DEFAULT=1
;;
2020-12-18 17:26:32 +00:00
-t | --tags)
2017-04-11 09:28:01 +00:00
opts="--tags=${VALUE}"
2020-12-18 17:26:32 +00:00
shift
2017-04-11 09:28:01 +00:00
;;
2016-02-16 06:34:48 +00:00
-h | --help)
2017-04-11 09:28:01 +00:00
echo "${TEST_HELP_MSG}"
exit 0
;;
2020-12-18 17:26:32 +00:00
--)
break
;;
2016-02-16 06:34:48 +00:00
*)
2020-02-02 19:35:21 +00:00
echo "ERROR: unknown option \"${PARAM}\""
2017-04-11 09:28:01 +00:00
echo "${TEST_HELP_MSG}"
2020-12-18 17:26:32 +00:00
exit 8
2017-04-11 09:28:01 +00:00
;;
2016-02-16 06:34:48 +00:00
esac
shift
done
2020-12-18 17:26:32 +00:00
shift
2016-02-04 07:37:00 +00:00
2017-04-11 09:28:01 +00:00
[ $# -lt 1 ] && {
echo "${TEST_HELP_MSG}"
exit 1
}
2018-07-01 15:35:12 +00:00
[[ "${1}" != "front" && "${1}" != "base" ]] && {
2016-10-28 07:26:56 +00:00
echo "Invalid test suite: $1!"
echo "${TEST_HELP_MSG}"
exit 1
}
2016-02-04 07:37:00 +00:00
2019-04-23 05:41:27 +00:00
set -e
2019-04-25 15:40:42 +00:00
check_submodules && kodev-build
2016-02-04 07:37:00 +00:00
setup_env
2017-09-16 15:01:31 +00:00
2016-05-06 12:06:48 +00:00
make "${EMU_DIR}/.busted"
2017-04-11 09:28:01 +00:00
pushd "${EMU_DIR}" && {
2019-04-27 10:24:42 +00:00
test_path_basedir="./spec/$1/unit"
rm -rf "${test_path_basedir}"/data/*.sdr
2016-02-04 07:37:00 +00:00
2019-04-27 10:24:42 +00:00
test_path="${test_path_basedir}"
2018-11-02 10:42:34 +00:00
if [ -n "${2}" ]; then
2019-04-27 10:24:42 +00:00
test_path="${test_path_basedir}/$2"
2016-10-02 04:42:00 +00:00
fi
2016-02-04 07:37:00 +00:00
2017-03-05 13:23:25 +00:00
echo "Running tests in" "${test_path}"
2023-07-16 01:51:57 +00:00
busted --lua="./luajit" "${opts}" \
2017-10-11 12:22:11 +00:00
--output=gtest \
2019-04-27 10:24:42 +00:00
--lpath="${test_path_basedir}/?.lua" \
2016-10-02 04:42:00 +00:00
--exclude-tags=notest "${test_path}"
2017-09-16 15:01:31 +00:00
} && popd || exit
2016-02-04 07:37:00 +00:00
}
2023-04-02 19:00:45 +00:00
function kodev-check() {
exit_code=0
check_submodules
# shellcheck disable=2016
2023-04-27 13:45:28 +00:00
mapfile -t shellscript_locations < <({ git -c submodule.recurse=0 grep -lE '^#!(/usr)?/bin/(env )?(bash|sh)' | sed "/^plugins\/terminal.koplugin\/shfm$/d" && git submodule --quiet foreach '[ "$path" = "base" -o "$path" = "platform/android/luajit-launcher" ] || git grep -lE "^#!(/usr)?/bin/(env )?(bash|sh)" | sed "s|^|$path/|"' && git ls-files ./*.sh; } | sort | uniq)
2023-04-02 19:00:45 +00:00
SHFMT_OPTIONS="-i 4 -ci"
for shellscript in "${shellscript_locations[@]}"; do
echo -e "${ANSI_GREEN}Running shellcheck on ${shellscript}"
shellcheck "${shellscript}" || exit_code=1
echo -e "${ANSI_GREEN}Running shfmt on ${shellscript}"
# shellcheck disable=2086
if ! shfmt ${SHFMT_OPTIONS} -kp "${shellscript}" >/dev/null 2>&1; then
echo -e "${ANSI_RED}Warning: ${shellscript} contains the following problem:"
# shellcheck disable=2086
shfmt ${SHFMT_OPTIONS} -kp "${shellscript}" || exit_code=1
continue
fi
# shellcheck disable=2086
if [ "$(cat "${shellscript}")" != "$(shfmt ${SHFMT_OPTIONS} "${shellscript}")" ]; then
echo -e "${ANSI_RED}Warning: ${shellscript} does not abide by coding style, diff for expected style:"
# shellcheck disable=2086
shfmt ${SHFMT_OPTIONS} -d "${shellscript}" || exit_code=1
fi
done
echo -e "\\n${ANSI_GREEN}Checking for unscaled sizes"
# stick `|| true` at the end to prevent exit on failed command
unscaled_size_check=$(grep -nr --include=*.lua --exclude=koptoptions.lua --exclude-dir=base --exclude-dir=luajit-rocks --exclude-dir=install --exclude-dir=keyboardlayouts --exclude-dir=*arm* "\\(padding\\|margin\\|bordersize\\|width\\|height\\|radius\\|linesize\\) = [0-9]\\{1,2\\}" | grep -v '= 0' | grep -v '= [0-9]/[0-9]' | grep -Ev '(default_option_height|default_option_padding)' | grep -v scaleBySize | grep -v 'unscaled_size_check: ignore' || true)
# Also check Geom objects; for legibility two regular expressions rather than
# one enormous indecipharable blob.
unscaled_size_check_geom=$(grep -E -nr --include=*.lua --exclude=gesturerange_spec.lua --exclude-dir=base --exclude-dir=luajit-rocks --exclude-dir=*arm* 'Geom:new{.+ [wh] = [0-9]{1,4}' | grep -Ev '[wh] = 0' | grep -v '= [0-9]/[0-9]' | grep -v scaleBySize || true)
if [ "${unscaled_size_check}" ] || [ "${unscaled_size_check_geom}" ]; then
echo -e "\\n${ANSI_RED}Warning: it looks like you might be using unscaled sizes.\\nIt is almost always preferable to defer to one of the predefined sizes in ui.size in the following files:"
echo "${unscaled_size_check}"
echo "${unscaled_size_check_geom}"
exit_code=1
fi
tab_detected=$(grep -P "\\t" --include \*.lua --exclude={dateparser.lua,xml.lua} --recursive {reader,setupkoenv,datastorage}.lua frontend plugins spec || true)
if [ "${tab_detected}" ]; then
echo -e "\\n${ANSI_RED}Warning: tab character detected. Please use spaces."
echo "${tab_detected}"
exit_code=1
fi
untagged_todo=$(grep -Pin "[^\-]\-\-(\s+)?@?(todo|fixme|warning)" --include \*.lua --exclude={dateparser.lua,xml.lua} --recursive {reader,setupkoenv,datastorage}.lua frontend plugins spec || true)
if [ "${untagged_todo}" ]; then
echo -e "\\n${ANSI_RED}Warning: possible improperly tagged todo, fixme or warning detected."
echo -e "\\n${ANSI_RED} use --- followed by @todo, @fixme or @warning."
echo "${untagged_todo}"
exit_code=1
fi
echo -e "\n${ANSI_GREEN}Luacheck results"
$(command -v luacheck) -q {reader,setupkoenv,datastorage}.lua frontend plugins spec
exit "${exit_code}"
}
2017-04-11 09:28:01 +00:00
function kodev-cov() {
2017-02-02 11:13:39 +00:00
COV_HELP_MSG="
usage: cov <OPTIONS>
OPTIONS:
2020-12-18 17:26:32 +00:00
-f, --full show full coverage report (down to each line)
-s, --show-previous show coverage stats from previous run
-n, --no-debug no debugging symbols (default for target devices)
2017-02-02 11:13:39 +00:00
"
2020-12-18 17:26:32 +00:00
# Defaults
2017-02-02 11:13:39 +00:00
show_full=0
show_previous=0
2020-12-18 17:26:32 +00:00
declare opt
declare -r E_OPTERR=85
declare -r short_opts="fsn"
declare -r long_opts="full,show-previous,no-debug"
if ! opt=$(getopt -o "${short_opts}" --long "${long_opts}" --name "kodev" -- "${@}"); then
echo "${COV_HELP_MSG}"
exit ${E_OPTERR}
fi
eval set -- "${opt}"
while true; do
PARAM="${1}"
# Support using an = assignment with short options (e.g., -f=blah instead of -f blah).
VALUE="${2/#=/}"
2018-07-01 15:35:12 +00:00
case "${PARAM}" in
2020-12-18 17:26:32 +00:00
-f | --full)
2017-04-11 09:28:01 +00:00
show_full=1
;;
2020-12-18 17:26:32 +00:00
-s | --show-previous)
2017-04-11 09:28:01 +00:00
show_previous=1
;;
2020-12-18 17:26:32 +00:00
-n | --no-debug)
2020-07-02 09:45:12 +00:00
export KODEBUG=
KODEBUG_NO_DEFAULT=1
;;
2017-02-02 11:13:39 +00:00
-h | --help)
2017-04-11 09:28:01 +00:00
echo "${COV_HELP_MSG}"
exit 0
;;
2020-12-18 17:26:32 +00:00
--)
break
;;
2017-02-02 11:13:39 +00:00
*)
2020-02-02 19:35:21 +00:00
echo "ERROR: unknown option \"${PARAM}\""
2017-04-11 09:28:01 +00:00
echo "${COV_HELP_MSG}"
2020-12-18 17:26:32 +00:00
exit 8
2017-04-11 09:28:01 +00:00
;;
2017-02-02 11:13:39 +00:00
esac
shift
done
2020-12-18 17:26:32 +00:00
shift
2017-02-02 11:13:39 +00:00
2020-07-02 09:45:12 +00:00
set -e
check_submodules && kodev-build
2017-02-02 11:13:39 +00:00
setup_env
make "${EMU_DIR}/.busted"
2017-04-11 09:28:01 +00:00
pushd "${EMU_DIR}" && {
2017-02-02 11:13:39 +00:00
target=front
test_path="./spec/${target}/unit"
2018-07-01 15:35:12 +00:00
if [ "${show_previous}" -eq 0 ]; then
2017-02-02 11:13:39 +00:00
echo "Running tests in" ${test_path}
2023-07-16 01:51:57 +00:00
busted --lua="./luajit" \
2017-02-02 11:13:39 +00:00
--sort-files \
-o "./spec/${target}/unit/verbose_print" \
--coverage \
--exclude-tags=nocov "${test_path}" || {
2020-02-02 19:35:21 +00:00
echo "Failed to run tests!" && exit 1
}
2017-02-02 11:13:39 +00:00
fi
2018-07-01 15:35:12 +00:00
if [ "${show_full}" -eq 1 ]; then
2017-02-02 11:13:39 +00:00
cat luacov.report.out
else
2017-04-27 08:25:17 +00:00
LUACOV_REPORT_SUMMARY=$(grep -nm1 -e '^Summary$' luacov.report.out | cut -d: -f1)
2017-02-02 11:13:39 +00:00
tail -n \
2017-04-27 08:25:17 +00:00
+$((LUACOV_REPORT_SUMMARY - 1)) \
2017-02-02 11:13:39 +00:00
luacov.report.out
fi
2017-09-16 15:01:31 +00:00
} && popd || exit
2017-02-02 11:13:39 +00:00
}
2017-04-11 09:28:01 +00:00
function kodev-log() {
2016-02-28 20:16:32 +00:00
LOG_HELP_MSG="
2021-01-02 02:00:39 +00:00
usage: log <OPTIONS> <TARGET>
OPTIONS:
-d, --debug more verbose logs (e.g., debug builds)
2016-02-28 20:16:32 +00:00
TARGET:
android
"
2017-04-11 09:28:01 +00:00
[ $# -lt 1 ] && {
echo "${LOG_HELP_MSG}"
exit 1
}
2016-02-28 20:16:32 +00:00
2021-01-02 02:00:39 +00:00
# Defaults
ignore_translation=0
declare opt
declare -r E_OPTERR=85
declare -r short_opts="dh"
declare -r long_opts="debug, help"
if ! opt=$(getopt -o "${short_opts}" --long "${long_opts}" --name "kodev" -- "${@}"); then
echo "${LOG_HELP_MSG}"
exit ${E_OPTERR}
fi
eval set -- "${opt}"
while true; do
PARAM="${1}"
# Support using an = assignment with short options (e.g., -f=blah instead of -f blah).
VALUE="${2/#=/}"
case "${PARAM}" in
-d | --debug)
export KODEBUG=1
;;
-h | --help)
echo "${LOG_HELP_MSG}"
exit 0
;;
--)
break
;;
*)
echo "ERROR: unknown option \"${PARAM}\""
echo "${RELEASE_HELP_MSG}"
exit 1
;;
esac
shift
done
shift
2018-07-01 15:35:12 +00:00
case "${1}" in
2016-02-28 20:16:32 +00:00
android)
2021-06-07 15:13:34 +00:00
if command -v pidcat >/dev/null; then
if [ -n "${KODEBUG}" ]; then
pidcat "org.koreader.launcher"
else
pidcat org.koreader.launcher --min-level=I
fi
2021-01-02 02:00:39 +00:00
else
2021-06-07 15:13:34 +00:00
if [ -n "${KODEBUG}" ]; then
2023-05-13 18:39:11 +00:00
adb logcat 'KOReader:V ApkUpdater:V Assets:V Device:V dlopen:V EPD:V EventReceiver:V Lights:V Surface:V LuaJIT:V MainActivity:V NativeGlue:V NativeThread:V Timeout:V ActivityManager:V AndroidRuntime:V DEBUG:* *:F'
2021-06-07 15:13:34 +00:00
else
adb logcat 'KOReader:I MainActivity:V NativeGlue:V NativeThread:V ActivityManager:W AndroidRuntime:E DEBUG:* *:F'
fi
2021-01-02 02:00:39 +00:00
fi
2017-04-11 09:28:01 +00:00
;;
2016-02-28 20:16:32 +00:00
*)
echo "Unsupported target: $1."
2017-04-11 09:28:01 +00:00
echo "${LOG_HELP_MSG}"
exit 1
;;
2016-02-28 20:16:32 +00:00
esac
}
2016-02-01 06:43:46 +00:00
HELP_MSG="
usage: $0 COMMAND <ARGS>
Supported commands:
2016-03-28 00:18:45 +00:00
activate Bootstrap shell environment for kodev
2016-02-11 06:27:41 +00:00
build Build KOReader
clean Clean KOReader build
2016-03-28 00:18:45 +00:00
fetch-thirdparty Fetch thirdparty dependencies for build
log Tail log stream for a running KOReader app
2016-02-11 06:27:41 +00:00
release Build KOReader release package
run Run KOReader
2020-07-02 09:45:12 +00:00
test Run busted tests
check Run luacheck static-analysis
cov Run busted tests for coverage
2016-03-28 00:18:45 +00:00
wbuilder Run wbuilder.lua script (useful for building new UI widget)
2020-12-18 17:26:32 +00:00
prompt Run a LuaJIT shell within KOReader's environment
2016-02-01 06:43:46 +00:00
"
2017-04-11 09:28:01 +00:00
[ $# -lt 1 ] && {
echo "Missing command."
echo "${HELP_MSG}"
exit 1
}
2016-02-01 06:43:46 +00:00
2018-07-01 15:35:12 +00:00
case "${1}" in
2016-03-28 00:18:45 +00:00
activate)
2016-04-10 07:35:48 +00:00
echo "adding ${CURDIR} to \$PATH..."
2016-03-28 00:18:45 +00:00
export PATH="${PATH}:${CURDIR}"
2017-03-05 13:23:25 +00:00
eval "$(luarocks path --bin)"
2017-04-11 09:28:01 +00:00
exec "${SHELL}"
;;
2016-02-01 06:43:46 +00:00
fetch-thirdparty)
2017-04-11 09:28:01 +00:00
kodev-fetch-thirdparty
;;
2016-02-01 06:43:46 +00:00
clean)
2017-04-11 09:28:01 +00:00
shift 1
kodev-clean "$@"
;;
2016-02-01 06:43:46 +00:00
build)
2017-04-11 09:28:01 +00:00
shift 1
kodev-build "$@"
;;
2016-02-01 06:43:46 +00:00
release)
2017-04-11 09:28:01 +00:00
shift 1
kodev-release "$@"
;;
2016-02-01 06:43:46 +00:00
wbuilder)
2017-04-11 09:28:01 +00:00
kodev-wbuilder
;;
2016-02-01 06:43:46 +00:00
run)
2017-04-11 09:28:01 +00:00
shift 1
kodev-run "$@"
;;
2016-02-04 07:37:00 +00:00
test)
2017-04-11 09:28:01 +00:00
shift 1
kodev-test "$@"
;;
2019-02-11 00:59:55 +00:00
check)
2023-04-02 19:00:45 +00:00
shift 1
kodev-check "$@"
2019-02-11 00:59:55 +00:00
;;
2017-02-02 11:13:39 +00:00
cov)
2017-04-11 09:28:01 +00:00
shift 1
kodev-cov "$@"
;;
2016-11-13 07:44:06 +00:00
prompt)
kodev-build
2017-04-11 09:28:01 +00:00
pushd "${EMU_DIR}" && {
2023-07-16 01:51:57 +00:00
./luajit -i setupkoenv.lua
2017-09-16 15:01:31 +00:00
} && popd || exit
2016-11-13 07:44:06 +00:00
;;
2016-02-28 20:16:32 +00:00
log)
2017-04-11 09:28:01 +00:00
shift 1
kodev-log "$@"
;;
2020-12-18 17:26:32 +00:00
-h | --help)
2017-04-11 09:28:01 +00:00
echo "${HELP_MSG}"
exit 0
;;
2016-02-01 06:43:46 +00:00
*)
echo "Unknown command: $1."
2017-04-11 09:28:01 +00:00
echo "${HELP_MSG}"
2020-12-18 17:26:32 +00:00
exit 8
2017-04-11 09:28:01 +00:00
;;
2016-02-01 06:43:46 +00:00
esac