2
0
mirror of https://github.com/koreader/koreader synced 2024-11-10 01:10:34 +00:00
koreader/kodev

932 lines
26 KiB
Plaintext
Raw Normal View History

#!/usr/bin/env bash
2016-02-01 06:43:46 +00:00
CURDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
VERSION=$(git describe HEAD)
# Only append date if we're not on a whole version, like v2018.11
if echo "${VERSION}" | grep -; then
VERSION=${VERSION}_$(git describe HEAD | xargs git show -s --format=format:"%cd" --date=short)
fi
2016-02-01 06:43:46 +00:00
# Default Android build to arm.
ANDROID_ARCH="${ANDROID_ARCH:-arm}"
2019-08-29 19:59:00 +00:00
# Default to Android 4.0+; required for NDK 15 but with a custom NDK the strict minimum is 9.
NDKABI=${NDKABI:-14}
export NDKABI
2019-03-02 12:28:04 +00:00
# Default android flavor
ANDROID_FLAVOR=${ANDROID_FLAVOR:-rocks}
export ANDROID_FLAVOR
function assert_ret_zero() {
if [ "${1}" -ne 0 ]; then
if [ -n "${2}" ]; then
echo "${2}"
2016-02-04 07:37:00 +00:00
fi
exit 1
fi
}
function check_submodules() {
if git submodule status | grep -qE '^\-'; then
kodev-fetch-thirdparty
fi
}
# 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
TEMP_DIR=$(mktemp --directory /tmp/tmp.koreaderXXX)
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"
echo "Memory plot output to $TEMP_DIR"
cat >"$SCRIPT_PNG" <<EOL
set term pngcairo size 1600,1200
set output "$IMAGE_PNG"
set ylabel "RSS"
set y2label "VSZ"
set ytics nomirror
set y2tics nomirror in
set yrange [0:*]
set y2range [0:*]
plot "$LOG" using 3 with lines axes x1y1 title "RSS", "$LOG" using 2 with lines axes x1y2 title "VSZ"
EOL
cat >"$SCRIPT_SHOW" <<EOL
set term wxt noraise
set ylabel "RSS"
set y2label "VSZ"
set ytics nomirror
set y2tics nomirror in
set yrange [0:*]
set y2range [0:*]
plot "$LOG" using 3 with lines axes x1y1 title "RSS", "$LOG" using 2 with lines axes x1y2 title "VSZ"
pause 1
reread
EOL
function capture_ctrl_c() {
kill "$LOOP_PID"
kill "$GNUPLOT_PID"
gnuplot "$SCRIPT_PNG"
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=$!
gnuplot "$SCRIPT_SHOW" &
GNUPLOT_PID=$!
}
function setup_env() {
SETUP_ENV_GREP_COMMAND="grep -v debug"
if [ -n "${KODEBUG}" ]; then
SETUP_ENV_GREP_COMMAND="grep debug"
# for android adb install
KODEBUG_SUFFIX=-debug
fi
files=$(find . -maxdepth 1 -name 'koreader-emulator-*' | ${SETUP_ENV_GREP_COMMAND})/koreader
assert_ret_zero $? "Emulator not found. Please build it first."
EMU_DIR=${files[0]}
export EMU_DIR
LD_LIBRARY_PATH=$(realpath "${EMU_DIR}")/libs:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH
2016-02-01 06:43:46 +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
cervantes
sony-prstux
2016-02-01 06:43:46 +00:00
android
pocketbook
ubuntu-touch
appimage
debian Debian package for current arch
debian-armel Debian package for generic armel devices
debian-armhf Debian package for generic armhf devices
2016-02-01 06:43:46 +00:00
emu (*default) If no TARGET is given, assume emulator
win32
"
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:
-v, --verbose Build in verbose mode.
--debug include debugging symbols (default for emulator)
--no-debug no debugging symbols (default for target devices)
2016-02-01 06:43:46 +00:00
TARGET:
${SUPPORTED_TARGETS}"
while [[ "${1}" == '-'* ]]; do
PARAM=$(echo "${1}" | awk -F= '{print $1}')
VALUE=$(echo "${1}" | awk -F= '{print $2}')
case "${PARAM}" in
2016-02-19 17:38:00 +00:00
-v | --verbose)
export VERBOSE=1
;;
2016-02-19 17:38:00 +00:00
-h | --help)
echo "${BUILD_HELP_MSG}"
exit 0
;;
--no-debug)
export KODEBUG=
KODEBUG_NO_DEFAULT=1
;;
--debug)
export KODEBUG=1
KODEBUG_NO_DEFAULT=1
;;
2016-02-19 17:38:00 +00:00
*)
echo "ERROR: unknown option \"$PARAM\""
echo "${BUILD_HELP_MSG}"
exit 1
;;
2016-02-19 17:38:00 +00:00
esac
shift 1
2016-02-19 17:38:00 +00:00
done
2016-10-02 04:42:00 +00:00
check_submodules
case "${1}" in
cervantes)
make TARGET=cervantes
assert_ret_zero $?
;;
2016-02-01 06:43:46 +00:00
kindle)
make TARGET=kindle
assert_ret_zero $?
;;
2016-10-10 06:52:19 +00:00
kindlepw2)
make TARGET=kindlepw2
assert_ret_zero $?
;;
2016-02-01 06:43:46 +00:00
kobo)
make TARGET=kobo
assert_ret_zero $?
;;
sony-prstux)
make TARGET=sony-prstux
assert_ret_zero $?
;;
2016-02-01 06:43:46 +00:00
kindle-legacy)
make TARGET=kindle-legacy
assert_ret_zero $?
;;
2016-02-01 06:43:46 +00:00
android)
if [ -z "${NDK}" ]; then
if [ -n "${ANDROID_NDK_HOME}" ]; then
# some distributions use `ANDROID_NDK` instead, fall back to it
export NDK="${ANDROID_NDK_HOME}"
else
export NDK="${CURDIR}/base/toolchain/android-ndk-r15c"
fi
fi
[ -e "${CURDIR}/base/toolchain/android-toolchain-${ANDROID_ARCH}/bin/" ] || {
{ [ -e "${NDK}" ] || make -C "${CURDIR}/base/toolchain" android-ndk; }
assert_ret_zero $?
make android-toolchain
assert_ret_zero $?
2016-10-02 04:42:00 +00:00
}
echo "Using NDK: ${NDK}..."
make TARGET=android
assert_ret_zero $?
;;
2016-02-01 06:43:46 +00:00
pocketbook)
if ! command -v arm-obreey-linux-gnueabi-gcc>/dev/null && [ ! -d "${CURDIR}/base/toolchain/pocketbook-toolchain" ]; then
make pocketbook-toolchain
assert_ret_zero $?
2016-02-01 06:43:46 +00:00
fi
make TARGET=pocketbook
assert_ret_zero $?
;;
2016-02-01 06:43:46 +00:00
ubuntu-touch)
make TARGET=ubuntu-touch
assert_ret_zero $?
;;
appimage)
make TARGET=appimage
assert_ret_zero $?
;;
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 $?
;;
2016-02-01 06:43:46 +00:00
win32)
make TARGET=win32
assert_ret_zero $?
;;
2016-02-01 06:43:46 +00:00
*)
if [ -z "${KODEBUG_NO_DEFAULT}" ]; then # no explicit --debug / --no-debug
# 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."
setup_env
;;
2016-02-01 06:43:46 +00:00
esac
}
function kodev-clean() {
2016-02-01 06:43:46 +00:00
CLEAN_HELP_MSG="
usage: clean <TARGET>
TARGET:
${SUPPORTED_TARGETS}"
while [[ "${1}" == '-'* ]]; do
PARAM=$(echo "${1}" | awk -F= '{print $1}')
VALUE=$(echo "${1}" | awk -F= '{print $2}')
case "${PARAM}" in
--no-debug)
export KODEBUG=
KODEBUG_NO_DEFAULT=1
;;
--debug)
export KODEBUG=1
KODEBUG_NO_DEFAULT=1
;;
*)
echo "ERROR: unknown option \"$PARAM\""
echo "${BUILD_HELP_MSG}"
exit 1
;;
esac
shift 1
done
case "${1}" in
2016-02-01 06:43:46 +00:00
-h | --help)
echo "${CLEAN_HELP_MSG}"
exit 0
;;
cervantes)
make TARGET=cervantes clean
;;
2016-02-01 06:43:46 +00:00
kindle)
make TARGET=kindle clean
;;
2016-10-10 06:52:19 +00:00
kindlepw2)
make TARGET=kindlepw2 clean
;;
2016-02-01 06:43:46 +00:00
kobo)
make TARGET=kobo clean
;;
sony-prstux)
make TARGET=sony-prstux clean
;;
2016-02-01 06:43:46 +00:00
kindle-legacy)
make TARGET=kindle-legacy clean
;;
2016-02-01 06:43:46 +00:00
android)
make TARGET=android clean
rm -f ./*.apk
;;
2016-02-01 06:43:46 +00:00
pocketbook)
make TARGET=pocketbook clean
;;
2016-02-01 06:43:46 +00:00
ubuntu-touch)
make TARGET=ubuntu-touch clean
;;
appimage)
make TARGET=appimage clean
;;
debian)
make TARGET=debian clean
;;
debian-armel)
make TARGET=debian-armel clean
;;
debian-armhf)
make TARGET=debian-armhf clean
;;
2016-02-01 06:43:46 +00:00
win32)
make TARGET=win32 clean
;;
2016-02-01 06:43:46 +00:00
*)
if [ -z "${KODEBUG_NO_DEFAULT}" ]; then # no explicit --debug / --no-debug
# builds a debug build by default, like kodev-run
export KODEBUG=1
fi
make clean
;;
2016-02-01 06:43:46 +00:00
esac
}
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="
usage: release <OPTIONS> <TARGET>
OPTIONS:
--debug debug-enabled release (for remote gdb)
--ignore-translation do not fetch translation for release
2016-02-01 06:43:46 +00:00
TARGET:
${SUPPORTED_RELEASE_TARGETS}"
[ $# -lt 1 ] && {
echo "${RELEASE_HELP_MSG}"
exit 1
}
2016-02-01 06:43:46 +00:00
ignore_translation=0
while [[ "${1}" == '-'* ]]; do
PARAM=$(echo "${1}" | awk -F= '{print $1}')
VALUE=$(echo "${1}" | awk -F= '{print $2}')
case "${PARAM}" in
--debug)
export KODEBUG=1
;;
--ignore-translation)
ignore_translation=1
;;
-v | --verbose)
export VERBOSE=1
;;
-h | --help)
echo "${RELEASE_HELP_MSG}"
exit 0
;;
*)
echo "ERROR: unknown option \"$PARAM\""
echo "${RELEASE_HELP_MSG}"
exit 1
;;
esac
shift 1
done
check_submodules
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
}
fi
case "${1}" in
2016-02-01 06:43:46 +00:00
kindle)
kodev-build kindle
make TARGET=kindle update
;;
2016-10-10 06:52:19 +00:00
kindlepw2)
kodev-build kindlepw2
make TARGET=kindlepw2 update
;;
2016-02-01 06:43:46 +00:00
kobo)
kodev-build kobo
make TARGET=kobo update
;;
sony-prstux)
kodev-build sony-prstux
make TARGET=sony-prstux update
;;
cervantes)
kodev-build cervantes
make TARGET=cervantes update
;;
2016-02-01 06:43:46 +00:00
kindle-legacy)
kodev-build kindle-legacy
make TARGET=kindle-legacy update
;;
2016-02-01 06:43:46 +00:00
android)
kodev-build android
2016-10-02 04:42:00 +00:00
export PATH=$PATH:${CURDIR}/base/toolchain/android-sdk-linux/tools
command -v android &>/dev/null || {
make -C "${CURDIR}/base/toolchain" android-sdk
2016-10-02 04:42:00 +00:00
}
ANDROID_HOME=$(dirname "$(dirname "$(command -v android)")")
export ANDROID_HOME
2016-10-02 04:42:00 +00:00
export PATH=$PATH:${NDK}
make TARGET=android update
;;
2016-02-01 06:43:46 +00:00
pocketbook)
kodev-build pocketbook
make TARGET=pocketbook update
;;
2016-02-01 06:43:46 +00:00
ubuntu-touch)
kodev-build ubuntu-touch
make TARGET=ubuntu-touch update
;;
appimage)
kodev-build appimage
make TARGET=appimage update
;;
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
;;
2016-02-01 06:43:46 +00:00
*)
echo "Unsupported target for release: $1."
echo "${RELEASE_HELP_MSG}"
exit 1
;;
2016-02-01 06:43:46 +00:00
esac
}
function kodev-wbuilder() {
2016-02-01 06:43:46 +00:00
kodev-build
echo "[*] Running wbuilder.lua..."
pushd "${EMU_DIR}" && {
EMULATE_READER_W=540 EMULATE_READER_H=720 ./luajit ./tools/wbuilder.lua
} && popd || exit
2016-02-01 06:43:46 +00:00
}
function kodev-run() {
2016-02-01 06:43:46 +00:00
RUN_HELP_MSG="
usage: run <OPTIONS> <TARGET>
2016-02-01 06:43:46 +00:00
OPTIONS:
-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)
--no-build run reader without rebuilding
--no-debug no debugging symbols (requires rebuilding)
--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: kobo-aura-one, kindle3, hidpi
--gdb=X run with debugger (default: nemiver)
--graph graph memory use (requires gnuplot)
--valgrind=X run with valgrind (default: valgrind --trace-children=yes)
TARGET:
android install and run KOReader on an Android device connected through ADB
2016-02-01 06:43:46 +00:00
"
screen_width=540
screen_height=720
export KODEBUG=1
while [[ "${1}" == '-'* ]]; do
PARAM=$(echo "${1}" | awk -F= '{print $1}')
VALUE=$(echo "${1}" | awk -F= '{print $2}')
case "${PARAM}" in
2016-02-01 06:43:46 +00:00
--disable-touch)
export DISABLE_TOUCH=1
;;
2016-02-01 06:43:46 +00:00
--no-build)
no_build=1
;;
--no-debug)
export KODEBUG=
;;
--gdb)
if [ -n "${VALUE}" ]; then
gdb=${VALUE}
else
# Try to use friendly defaults for gdb
if command -v nemiver >/dev/null; then
# Nemiver is a nice GUI
gdb=nemiver
elif command -v ddd >/dev/null; then
# DDD is a slightly less nice GUI
gdb=ddd
elif command -v cgdb >/dev/null; then
# cgdb is a nice curses-based gdb front
gdb=cgdb
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
;;
--graph)
graph_memory=1
;;
--valgrind)
if [ -n "${VALUE}" ]; then
valgrind=${VALUE}
else
# Try to use sensible defaults for valgrind
if command -v valgrind >/dev/null; then
valgrind="valgrind --trace-children=yes"
else
echo "Couldn't find valgrind."
exit 1
fi
fi
;;
-w | --screen-width)
screen_width=${VALUE}
;;
-h | --screen-height)
# simple numeric check due to overlap between -h for help and height
if [ -n "${VALUE##*[!0-9]*}" ]; then
screen_height=${VALUE}
else
echo "${RUN_HELP_MSG}"
exit 1
fi
;;
-d | --screen-dpi)
screen_dpi=${VALUE}
;;
-s | --simulate)
device_model=${VALUE}
case "${device_model}" in
kindle3)
screen_width=600
screen_height=800
;;
kobo-aura-one)
screen_width=1404
screen_height=1872
screen_dpi=300
;;
hidpi)
screen_width=1500
screen_height=2000
screen_dpi=600
;;
*)
echo "ERROR: spec unknown for ${device_model}."
;;
esac
;;
--help)
echo "${RUN_HELP_MSG}"
exit 0
;;
2016-02-01 06:43:46 +00:00
*)
echo "ERROR: unknown option \"$PARAM\""
echo "${RUN_HELP_MSG}"
exit 1
;;
2016-02-01 06:43:46 +00:00
esac
shift
done
case "${1}" in
android)
command -v adb >/dev/null && {
if [ -z "${no_build}" ]; then
echo "[*] Building KOReader for Android…"
kodev-release --ignore-translation android
assert_ret_zero $?
fi
setup_env
# clear logcat to get rid of useless cruft
adb logcat -c
# uninstall existing package to make sure *everything* is gone from memory
# no assert_ret_zero; uninstall is allowed to fail if there's nothing to uninstall
adb uninstall "org.koreader.launcher"
2019-08-29 19:59:00 +00:00
adb install "koreader-android-${ANDROID_ARCH}${KODEBUG_SUFFIX}-${VERSION}.apk"
assert_ret_zero $?
# there's no adb run so we do this…
adb shell monkey -p org.koreader.launcher -c android.intent.category.LAUNCHER 1
assert_ret_zero $?
[Android] kodev run android: show all errors (#4569) It will introduce some minor noise, but too much stuff is simply not seen otherwise, for example: *:E ``` 02-09 12:45:53.359 2580 2609 E IconLoader: Unexpected null component name or activity info: ComponentInfo{org.koreader.launcher/org.koreader.launcher.MainActivity}, null ``` *:F ``` --------- beginning of system --------- beginning of main --------- beginning of crash 02-09 12:47:31.275 4985 5003 F libc : /home/frans/src/kobo/koreader/base/thirdparty/filemq/build/i686-linux-android-debug/filemq-prefix/src/filemq/src/fmq_client.c:170: fmq_client_set_resync: assertion "self" failed 02-09 12:47:31.275 4985 5003 F libc : Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 5003 (Thread-37), pid 4985 (reader.launcher) 02-09 12:47:31.512 5085 5085 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 02-09 12:47:31.512 5085 5085 F DEBUG : Build fingerprint: 'Android/sdk_phone_x86_64/generic_x86_64:9/PSR1.180720.012/4923214:userdebug/test-keys' 02-09 12:47:31.512 5085 5085 F DEBUG : Revision: '0' 02-09 12:47:31.513 5085 5085 F DEBUG : ABI: 'x86' 02-09 12:47:31.513 5085 5085 F DEBUG : pid: 4985, tid: 5003, name: Thread-37 >>> org.koreader.launcher <<< 02-09 12:47:31.513 5085 5085 F DEBUG : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr -------- 02-09 12:47:31.513 5085 5085 F DEBUG : Abort message: '/home/frans/src/kobo/koreader/base/thirdparty/filemq/build/i686-linux-android-debug/filemq-prefix/src/filemq/src/fmq_client.c:170: fmq_client_set_resync: assertion "self" failed' 02-09 12:47:31.513 5085 5085 F DEBUG : eax 00000000 ebx 00001379 ecx 0000138b edx 00000006 02-09 12:47:31.513 5085 5085 F DEBUG : edi 00000000 esi 00000000 02-09 12:47:31.513 5085 5085 F DEBUG : ebp 33167a17 esp de3e9528 eip f70d8b59 02-09 12:47:31.515 5085 5085 F DEBUG : 02-09 12:47:31.515 5085 5085 F DEBUG : backtrace: 02-09 12:47:31.515 5085 5085 F DEBUG : #00 pc 00000b59 [vdso:f70d8000] (__kernel_vsyscall+9) 02-09 12:47:31.515 5085 5085 F DEBUG : #01 pc 0001fc08 /system/lib/libc.so (syscall+40) 02-09 12:47:31.515 5085 5085 F DEBUG : #02 pc 000321f3 /system/lib/libc.so (abort+115) 02-09 12:47:31.515 5085 5085 F DEBUG : #03 pc 00032681 /system/lib/libc.so (__assert2+49) 02-09 12:47:31.515 5085 5085 F DEBUG : #04 pc 000046b0 /data/data/org.koreader.launcher/files/libs/libfmq.so.1 02-09 12:47:31.515 5085 5085 F DEBUG : #05 pc 00008e54 /data/app/org.koreader.launcher-u3tYrWEK7wgvoJGvd1pTrA==/lib/x86/libluajit.so 02-09 12:47:31.515 5085 5085 F DEBUG : #06 pc 00056a61 /data/app/org.koreader.launcher-u3tYrWEK7wgvoJGvd1pTrA==/lib/x86/libluajit.so 02-09 12:47:31.515 5085 5085 F DEBUG : #07 pc 0006ed92 /data/app/org.koreader.launcher-u3tYrWEK7wgvoJGvd1pTrA==/lib/x86/libluajit.so 02-09 12:47:31.515 5085 5085 F DEBUG : #08 pc 00006fc9 /data/app/org.koreader.launcher-u3tYrWEK7wgvoJGvd1pTrA==/lib/x86/libluajit.so 02-09 12:47:31.515 5085 5085 F DEBUG : #09 pc 00061f73 /data/app/org.koreader.launcher-u3tYrWEK7wgvoJGvd1pTrA==/lib/x86/libluajit.so 02-09 12:47:31.515 5085 5085 F DEBUG : #10 pc 00006fc9 /data/app/org.koreader.launcher-u3tYrWEK7wgvoJGvd1pTrA==/lib/x86/libluajit.so 02-09 12:47:31.515 5085 5085 F DEBUG : #11 pc 00061f73 /data/app/org.koreader.launcher-u3tYrWEK7wgvoJGvd1pTrA==/lib/x86/libluajit.so 02-09 12:47:31.515 5085 5085 F DEBUG : #12 pc 00006fc9 /data/app/org.koreader.launcher-u3tYrWEK7wgvoJGvd1pTrA==/lib/x86/libluajit.so 02-09 12:47:31.515 5085 5085 F DEBUG : #13 pc 0001c470 /data/app/org.koreader.launcher-u3tYrWEK7wgvoJGvd1pTrA==/lib/x86/libluajit.so (lua_pcall+80) 02-09 12:47:31.515 5085 5085 F DEBUG : #14 pc 0000571a /data/app/org.koreader.launcher-u3tYrWEK7wgvoJGvd1pTrA==/lib/x86/libluajit.so (android_main+458) 02-09 12:47:31.515 5085 5085 F DEBUG : #15 pc 00070a38 /data/app/org.koreader.launcher-u3tYrWEK7wgvoJGvd1pTrA==/lib/x86/libluajit.so 02-09 12:47:31.515 5085 5085 F DEBUG : #16 pc 0009cce5 /system/lib/libc.so (__pthread_start(void*)+53) 02-09 12:47:31.515 5085 5085 F DEBUG : #17 pc 00033c1b /system/lib/libc.so (__start_thread+75) ```
2019-02-09 14:11:52 +00:00
adb logcat KOReader:V luajit-launcher:V "*:E"
} || echo "Failed to find adb in PATH to interact with Android device."
;;
*)
if [ -z "${no_build}" ]; then
echo "[*] Building KOReader…"
if [ -z "${KODEBUG}" ]; then
kodev-build --no-debug
else
kodev-build
fi
else
setup_env
fi
2016-02-01 06:43:46 +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
if [ -n "${graph_memory}" ]; then
gnuplot_wrapper "--parent $$" "reader.lua"
fi
# run with catchsegv by default when it is available
# see https://github.com/koreader/koreader/issues/2878#issuecomment-326796777
if command -v catchsegv >/dev/null; then
CATCHSEGV=$(command -v catchsegv)
fi
KOREADER_COMMAND="${CATCHSEGV} ./reader.lua -d"
if [ -n "${gdb}" ]; then
KOREADER_COMMAND="${gdb} ./luajit reader.lua -d"
fi
if [ -n "${valgrind}" ]; then
KOREADER_COMMAND="${valgrind} ./luajit reader.lua -d"
fi
echo "[*] Running KOReader with arguments: $*..."
pushd "${EMU_DIR}" && {
if [ $# -lt 1 ]; then
args=${CURDIR}/test
else
args="$*"
[[ "${args}" != /* ]] && args="${CURDIR}/${args}"
fi
KOREADER_COMMAND="$KOREADER_COMMAND ${args}"
2016-02-01 06:43:46 +00:00
RETURN_VALUE=85
while [ "${RETURN_VALUE}" -eq 85 ]; do
EMULATE_READER_W=${screen_width} EMULATE_READER_H=${screen_height} EMULATE_READER_DPI=${screen_dpi} \
${KOREADER_COMMAND}
RETURN_VALUE=$?
done
} && popd || exit
if [ -n "${graph_memory}" ]; then
capture_ctrl_c
fi
;;
esac
2016-02-01 06:43:46 +00:00
}
function kodev-test() {
2016-02-04 07:37:00 +00:00
TEST_HELP_MSG="
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.
OPTIONS:
--tags=TAGS only run tests with given tags
--no-debug no debugging symbols (default for target devices)
2016-02-04 07:37:00 +00:00
"
while [[ "${1}" == '-'* ]]; do
PARAM=$(echo "${1}" | awk -F= '{print $1}')
VALUE=$(echo "${1}" | awk -F= '{print $2}')
case "${PARAM}" in
--graph)
graph_memory=1
;;
--no-debug)
export KODEBUG=
KODEBUG_NO_DEFAULT=1
;;
--tags)
opts="--tags=${VALUE}"
;;
-h | --help)
echo "${TEST_HELP_MSG}"
exit 0
;;
*)
echo "ERROR: unknown option \"$PARAM\""
echo "${TEST_HELP_MSG}"
exit 1
;;
esac
shift
done
2016-02-04 07:37:00 +00:00
[ $# -lt 1 ] && {
echo "${TEST_HELP_MSG}"
exit 1
}
[[ "${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
set -e
check_submodules && kodev-build
2016-02-04 07:37:00 +00:00
setup_env
2016-05-06 12:06:48 +00:00
make "${EMU_DIR}/.busted"
pushd "${EMU_DIR}" && {
test_path_basedir="./spec/$1/unit"
rm -rf "${test_path_basedir}"/data/*.sdr
2016-02-04 07:37:00 +00:00
test_path="${test_path_basedir}"
if [ -n "${2}" ]; then
test_path="${test_path_basedir}/$2"
2016-10-02 04:42:00 +00:00
fi
2016-02-04 07:37:00 +00:00
echo "Running tests in" "${test_path}"
busted --lua="./luajit" "${opts}" \
2017-10-11 12:22:11 +00:00
--output=gtest \
--lpath="${test_path_basedir}/?.lua" \
2016-10-02 04:42:00 +00:00
--exclude-tags=notest "${test_path}"
} && popd || exit
2016-02-04 07:37:00 +00:00
}
function kodev-cov() {
2017-02-02 11:13:39 +00:00
COV_HELP_MSG="
usage: cov <OPTIONS>
OPTIONS:
--show-previous show coverage stats from previous run
--full show full coverage report (down to each line)
"
show_full=0
show_previous=0
while [[ "${1}" == '-'* ]]; do
PARAM=$(echo "${1}" | awk -F= '{print $1}')
VALUE=$(echo "${1}" | awk -F= '{print $2}')
case "${PARAM}" in
2017-02-02 11:13:39 +00:00
--full)
show_full=1
;;
2017-02-02 11:13:39 +00:00
--show-previous)
show_previous=1
;;
2017-02-02 11:13:39 +00:00
-h | --help)
echo "${COV_HELP_MSG}"
exit 0
;;
2017-02-02 11:13:39 +00:00
*)
echo "ERROR: unknown option \"$PARAM\""
echo "${COV_HELP_MSG}"
exit 1
;;
2017-02-02 11:13:39 +00:00
esac
shift
done
check_submodules && make
setup_env
make "${EMU_DIR}/.busted"
pushd "${EMU_DIR}" && {
2017-02-02 11:13:39 +00:00
target=front
test_path="./spec/${target}/unit"
if [ "${show_previous}" -eq 0 ]; then
2017-02-02 11:13:39 +00:00
echo "Running tests in" ${test_path}
busted --lua="./luajit" \
--sort-files \
-o "./spec/${target}/unit/verbose_print" \
--coverage \
--exclude-tags=nocov "${test_path}" || {
echo "Failed to run tests!" && exit 1
}
2017-02-02 11:13:39 +00:00
fi
if [ "${show_full}" -eq 1 ]; then
2017-02-02 11:13:39 +00:00
cat luacov.report.out
else
LUACOV_REPORT_SUMMARY=$(grep -nm1 -e '^Summary$' luacov.report.out | cut -d: -f1)
2017-02-02 11:13:39 +00:00
tail -n \
+$((LUACOV_REPORT_SUMMARY - 1)) \
2017-02-02 11:13:39 +00:00
luacov.report.out
fi
} && popd || exit
2017-02-02 11:13:39 +00:00
}
function kodev-log() {
2016-02-28 20:16:32 +00:00
LOG_HELP_MSG="
usage: log <TARGET>
TARGET:
android
"
[ $# -lt 1 ] && {
echo "${LOG_HELP_MSG}"
exit 1
}
2016-02-28 20:16:32 +00:00
case "${1}" in
2016-02-28 20:16:32 +00:00
-h | --help)
echo "${LOG_HELP_MSG}"
exit 0
;;
2016-02-28 20:16:32 +00:00
android)
adb logcat 'luajit-launcher:D KOReader:D *:S'
;;
2016-02-28 20:16:32 +00:00
*)
echo "Unsupported target: $1."
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
test Run tests
2019-02-11 00:59:55 +00:00
check Run static-analysis
2016-03-28 00:18:45 +00:00
wbuilder Run wbuilder.lua script (useful for building new UI widget)
2016-02-01 06:43:46 +00:00
"
[ $# -lt 1 ] && {
echo "Missing command."
echo "${HELP_MSG}"
exit 1
}
2016-02-01 06:43:46 +00:00
case "${1}" in
2016-03-28 00:18:45 +00:00
activate)
echo "adding ${CURDIR} to \$PATH..."
2016-03-28 00:18:45 +00:00
export PATH="${PATH}:${CURDIR}"
eval "$(luarocks path --bin)"
exec "${SHELL}"
;;
2016-02-01 06:43:46 +00:00
fetch-thirdparty)
kodev-fetch-thirdparty
;;
2016-02-01 06:43:46 +00:00
clean)
shift 1
kodev-clean "$@"
;;
2016-02-01 06:43:46 +00:00
build)
shift 1
kodev-build "$@"
;;
2016-02-01 06:43:46 +00:00
release)
shift 1
kodev-release "$@"
;;
2016-02-01 06:43:46 +00:00
wbuilder)
kodev-wbuilder
;;
2016-02-01 06:43:46 +00:00
run)
shift 1
kodev-run "$@"
;;
2016-02-04 07:37:00 +00:00
test)
shift 1
kodev-test "$@"
;;
2019-02-11 00:59:55 +00:00
check)
luacheck -q {reader,setupkoenv,datastorage}.lua frontend plugins spec
;;
2017-02-02 11:13:39 +00:00
cov)
shift 1
kodev-cov "$@"
;;
prompt)
kodev-build
pushd "${EMU_DIR}" && {
./luajit -i setupkoenv.lua
} && popd || exit
;;
2016-02-28 20:16:32 +00:00
log)
shift 1
kodev-log "$@"
;;
2016-02-01 06:43:46 +00:00
--help | -h)
echo "${HELP_MSG}"
exit 0
;;
2016-02-01 06:43:46 +00:00
*)
echo "Unknown command: $1."
echo "${HELP_MSG}"
exit 1
;;
2016-02-01 06:43:46 +00:00
esac