Skip to content

Commit

Permalink
Support Android AArch64 (#1540)
Browse files Browse the repository at this point in the history
* Build LPeg via LuaRocks to deal with Android shenanigans once and for all...
  Involves writing a custom makefile & rockspec for lpeg, because everything is terrible.
* Apply the android-aarch64 patch from #993
* libzmq is linked against the STL, so, as stupid as it looks, this means
czmq must, too.
* Unbreak input on 64bit Android
  size_t is 64bit, need to truncate to a Lua number
  • Loading branch information
NiLuJe committed Oct 24, 2022
1 parent 8b1b0db commit 5957a6b
Show file tree
Hide file tree
Showing 11 changed files with 274 additions and 48 deletions.
3 changes: 1 addition & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ all: $(OUTPUT_DIR)/libs $(if $(ANDROID),,$(LUAJIT)) \
$(if $(USE_LJ_WPACLIENT),$(LJ_WPACLIENT),) \
$(TURBO_FFI_WRAP_LIB) \
$(LUA_HTMLPARSER_ROCK) \
$(LPEG_ROCK) \
$(LUA_RAPIDJSON_ROCK) \
$(LUA_SPORE_ROCK) \
$(if $(ANDROID),$(LPEG_DYNLIB) $(LPEG_RE),) \
$(if $(WIN32),,$(ZMQ_LIB) $(CZMQ_LIB)) \
$(if $(WIN32),,$(OUTPUT_DIR)/sdcv) \
$(if $(MACOS),$(OUTPUT_DIR)/koreader,) \
Expand Down Expand Up @@ -62,7 +62,6 @@ endif
# set up some needed paths and links
install -d $(OUTPUT_DIR)/{cache,history,clipboard,fonts}
ln -sf $(CURDIR)/$(THIRDPARTY_DIR)/kpvcrlib/cr3.css $(OUTPUT_DIR)/data/
test -e $(LPEG_RE) && chmod 664 $(LPEG_RE) || true # hot fix re.lua permission

$(OUTPUT_DIR)/libs:
install -d $(OUTPUT_DIR)/libs
Expand Down
40 changes: 27 additions & 13 deletions Makefile.defs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,13 @@ TOOLCHAIN_DIR=$(MAKEFILE_DIR)toolchain
ANDROID_ARCH?=arm
ANDROID_TOOLCHAIN=$(TOOLCHAIN_DIR)/android-toolchain-$(ANDROID_ARCH)
NDK?=$(TOOLCHAIN_DIR)/android-ndk-r15c
NDKABI?=14
ifeq ($(ANDROID_ARCH), arm64)
NDKABI?=21
else ifeq ($(ANDROID_ARCH), x86_64)
NDKABI?=21
else
NDKABI?=14
endif

# Detect LuaRocks 3
LR_VER_NUM := $(shell luarocks --version | grep -o [0-9].[0-9])
Expand Down Expand Up @@ -136,6 +142,8 @@ else ifeq ($(TARGET), android)
export SYSROOT=$(NDK)/platforms/android-$(NDKABI)/arch-$(ANDROID_ARCH)
ifeq ($(ANDROID_ARCH), x86)
CHOST?=i686-linux-android
else ifeq ($(ANDROID_ARCH), arm64)
CHOST?=aarch64-linux-android
else
CHOST?=arm-linux-androideabi
endif
Expand Down Expand Up @@ -368,7 +376,10 @@ ANDROID_COMPAT_CXXFLAGS:=--sysroot $(SYSROOT) -I$(NDK)/sources/cxx-stl/gnu-libst
ifeq ($(ANDROID_ARCH), arm)
ANDROID_ARM_ARCH:=-march=armv7-a -mfpu=vfpv3-d16
ANDROID_ARM_ARCH+=-mthumb
# NOTE: NDK15c actually uses -fstack-protector-strong
ANDROID_ARM_ARCH+=-ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes
else ifeq ($(ANDROID_ARCH), arm64)
ANDROID_ARM_ARCH:=-ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes
endif

# Use target-specific CFLAGS
Expand Down Expand Up @@ -436,8 +447,12 @@ else ifeq ($(TARGET), android)
COMPAT_LDFLAGS:=-L$(NDK)/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a
COMPAT_CXXFLAGS+=-I$(NDK)/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include
SHARED_STL_LIB:=$(ANDROID_TOOLCHAIN)/arm-linux-androideabi/lib/armv7-a/thumb/libgnustl_shared.so
endif
ifeq ($(ANDROID_ARCH), x86)
else ifeq ($(ANDROID_ARCH), arm64)
ARM_ARCH:=$(ANDROID_ARM_ARCH)
export ac_cv_type_in_port_t=yes
COMPAT_LDFLAGS:=-L$(NDK)/sources/cxx-stl/gnu-libstdc++/4.9/libs/arm64-v8a
COMPAT_CXXFLAGS+=-I$(NDK)/sources/cxx-stl/gnu-libstdc++/4.9/libs/arm64-v8a/include
else ifeq ($(ANDROID_ARCH), x86)
COMPAT_LDFLAGS:=-L$(NDK)/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86
COMPAT_CXXFLAGS+=-I$(NDK)/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86/include
endif
Expand Down Expand Up @@ -526,9 +541,9 @@ endif

# NOTE: Follow the NDK's lead
ifeq ($(TARGET), android)
LDFLAGS+=-no-canonical-prefixes -Wl,--fix-cortex-a8
LDFLAGS+=-no-canonical-prefixes
ifeq ($(ANDROID_ARCH), arm)
LDFLAGS+=-march=armv7-a
LDFLAGS+=-Wl,--fix-cortex-a8 -march=armv7-a
endif
endif

Expand Down Expand Up @@ -910,13 +925,18 @@ ifeq ($(LR_GT_3_0),1)
LUAROCKS_DIR=$(OUTPUT_DIR)/rocks/lib/luarocks/rocks-5.1
LUAROCKS_BINARY+=--lua-version=5.1
endif
LUA_INCDIR=$(if $(DARWINHOST),/usr/local/include/lua5.1,"$(LUAJIT_DIR)/src")
LUA_LIBDIR=$(if $(DARWINHOST),/usr/local/lib,"$(CURDIR)/$(dir $(LUAJIT_LIB))")
LUA_INCDIR=$(if $(DARWINHOST),/usr/local/include/lua5.1,$(LUAJIT_DIR)/src)
LUA_LIBDIR=$(if $(DARWINHOST),/usr/local/lib,$(CURDIR)/$(dir $(LUAJIT_LIB)))

LUA_HTMLPARSER_VER=scm-0
LUA_HTMLPARSER_BUILD_DIR=$(THIRDPARTY_DIR)/lua-htmlparser/build/$(MACHINE)
LUA_HTMLPARSER_ROCK=$(LUAROCKS_DIR)/htmlparser/$(LUA_HTMLPARSER_VER)/htmlparser-$(LUA_HTMLPARSER_VER).rockspec

LPEG_VER=1.0.2-2
LPEG_BUILD_DIR=$(THIRDPARTY_DIR)/lpeg/build/$(MACHINE)
LPEG_DIR=$(CURDIR)/$(LPEG_BUILD_DIR)/lpeg-prefix/src/lpeg-build
LPEG_ROCK=$(LPEG_DIR)/lpeg-$(LPEG_VER).rockspec

LUA_RAPIDJSON_VER=0.7.1-1
LUA_RAPIDJSON_BUILD_DIR=$(THIRDPARTY_DIR)/lua-rapidjson/build/$(MACHINE)
LUA_RAPIDJSON_ROCK=$(LUAROCKS_DIR)/rapidjson/$(LUA_RAPIDJSON_VER)/rapidjson-$(LUA_RAPIDJSON_VER).rockspec
Expand Down Expand Up @@ -990,12 +1010,6 @@ endif
# Used by our custom Lua modules, where we want to hide private symbols by default
SYMVIS_FLAGS+=-fvisibility=hidden

LPEG_BUILD_DIR=$(THIRDPARTY_DIR)/lpeg/build/$(MACHINE)
LPEG_DIR=$(CURDIR)/$(LPEG_BUILD_DIR)/lpeg-prefix/src/lpeg
LPEG_RE=$(OUTPUT_DIR)/rocks/share/lua/5.1/re.lua
LPEG_DYNLIB=$(OUTPUT_DIR)/rocks/lib/lua/5.1/lpeg.so


CMAKE_THIRDPARTY_LIBS := kpvcrlib,nanosvg,zstd
CMAKE_THIRDPARTY_LIBS := $(CMAKE_THIRDPARTY_LIBS),luajit,lpeg,turbo
CMAKE_THIRDPARTY_LIBS := $(CMAKE_THIRDPARTY_LIBS),zyre,czmq,filemq,libzmq
Expand Down
34 changes: 17 additions & 17 deletions Makefile.third
Original file line number Diff line number Diff line change
Expand Up @@ -677,6 +677,7 @@ $(CZMQ_LIB): $(ZMQ_LIB) $(THIRDPARTY_DIR)/czmq/*.*
cd $(CZMQ_BUILD_DIR) && \
$(CMAKE) $(CMAKE_FLAGS) -DCC="$(CC)" -DLDFLAGS="$(LDFLAGS) -Wl,-rpath,'$(ORIGIN_CMAKE_TO_AUTOCFG)'" \
-DCFLAGS="$(CFLAGS) $(if $(CLANG),-O0,) $(if $(WIN32),-DLIBCZMQ_EXPORTS)" \
-DLDFLAGS="$(LDFLAGS) $(if $(ANDROID),$(SHARED_STL_LINK_FLAG) -lm,)" \
-DZMQ_DIR=$(ZMQ_DIR) -DHOST=$(CHOST) \
$(CURDIR)/$(THIRDPARTY_DIR)/czmq && \
$(CMAKE_MAKE_PROGRAM) $(CMAKE_MAKE_PROGRAM_FLAGS)
Expand Down Expand Up @@ -712,6 +713,22 @@ ifdef DARWIN
$@
endif

$(LPEG_ROCK): $(THIRDPARTY_DIR)/lpeg/*.*
install -d $(LPEG_BUILD_DIR)
-rm -f $(LPEG_ROCK)
cd $(LPEG_BUILD_DIR) && \
$(CMAKE) $(CMAKE_FLAGS) -DOUTPUT_DIR="$(CURDIR)/$(OUTPUT_DIR)" \
-DLPEG_VER="$(LPEG_VER)" \
-DCC="$(CC)" \
-DCFLAGS="$(CFLAGS)" \
-DLDFLAGS="$(LDFLAGS)" \
-DLUAROCKS="$(LUAROCKS_BINARY)" \
-DLUA_INCDIR="$(LUA_INCDIR)" \
-DLUA_LIBDIR="$(LUA_LIBDIR)" \
$(if $(USE_LUAJIT_LIB),-DLUALIB="-lluajit",) \
$(CURDIR)/$(THIRDPARTY_DIR)/lpeg && \
$(CMAKE_MAKE_PROGRAM) $(CMAKE_MAKE_PROGRAM_FLAGS)

$(LUA_SPORE_ROCK): $(THIRDPARTY_DIR)/lua-Spore/*.*
install -d $(LUA_SPORE_BUILD_DIR)
-rm -f $(LUA_SPORE_DIR)/../lua-Spore-stamp/lua-Spore-build
Expand All @@ -723,12 +740,8 @@ $(LUA_SPORE_ROCK): $(THIRDPARTY_DIR)/lua-Spore/*.*
-DLUAROCKS="$(LUAROCKS_BINARY)" \
-DLUA_INCDIR="$(LUA_INCDIR)" \
-DLUA_LIBDIR="$(LUA_LIBDIR)" \
$(if $(ANDROID),-DLIBFLAG="$(LDFLAGS) $(CURDIR)/$(LUAJIT_LIB) -nostartfiles",) \
$(CURDIR)/$(THIRDPARTY_DIR)/lua-Spore && \
$(CMAKE_MAKE_PROGRAM) $(CMAKE_MAKE_PROGRAM_FLAGS)
ifdef ANDROID
-rm -f $(LPEG_DYNLIB) # so that LPEG can be rebuilt in our control
endif

$(LUA_HTMLPARSER_ROCK): $(THIRDPARTY_DIR)/lua-htmlparser/*.*
install -d $(LUA_HTMLPARSER_BUILD_DIR)
Expand All @@ -740,7 +753,6 @@ $(LUA_HTMLPARSER_ROCK): $(THIRDPARTY_DIR)/lua-htmlparser/*.*
-DLUAROCKS="$(LUAROCKS_BINARY)" \
-DLUA_INCDIR="$(LUA_INCDIR)" \
-DLUA_LIBDIR="$(LUA_LIBDIR)" \
$(if $(ANDROID),-DLIBFLAG="$(LDFLAGS) $(CURDIR)/$(LUAJIT_LIB) -nostartfiles",) \
$(CURDIR)/$(THIRDPARTY_DIR)/lua-htmlparser && \
$(CMAKE_MAKE_PROGRAM) $(CMAKE_MAKE_PROGRAM_FLAGS)

Expand All @@ -763,18 +775,6 @@ $(LUA_RAPIDJSON_ROCK): $(THIRDPARTY_DIR)/lua-rapidjson/*.*
$(CURDIR)/$(THIRDPARTY_DIR)/lua-rapidjson && \
$(CMAKE_MAKE_PROGRAM) $(CMAKE_MAKE_PROGRAM_FLAGS)

# override lpeg built by luarocks, this is only necessary for Android
$(LPEG_DYNLIB) $(LPEG_RE): $(LUAJIT_LIB) $(THIRDPARTY_DIR)/lpeg/*.*
install -d $(OUTPUT_DIR)/rocks/lib/lua/5.1
install -d $(OUTPUT_DIR)/rocks/share/lua/5.1
install -d $(LPEG_BUILD_DIR)
cd $(LPEG_BUILD_DIR) && \
$(CMAKE) $(CMAKE_FLAGS) -DCC="$(CC)" -DDYNLIB_CFLAGS="$(DYNLIB_CFLAGS)" \
-DLUA_DIR="$(LUAJIT_DIR)" $(CURDIR)/$(THIRDPARTY_DIR)/lpeg && \
$(CMAKE_MAKE_PROGRAM) $(CMAKE_MAKE_PROGRAM_FLAGS)
cp -f $(LPEG_DIR)/lpeg.so $(OUTPUT_DIR)/rocks/lib/lua/5.1
cp -f $(LPEG_DIR)/re.lua $(OUTPUT_DIR)/rocks/share/lua/5.1

$(SQLITE_LIB): $(THIRDPARTY_DIR)/sqlite/*.*
install -d $(SQLITE_BUILD_DIR)
cd $(SQLITE_BUILD_DIR) && \
Expand Down
2 changes: 1 addition & 1 deletion ffi/input_android.lua
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ local function motionEventHandler(motion_event)
local timev = genInputTimeval(android.lib.AMotionEvent_getEventTime(motion_event))

-- This effectively gives us the size of the current MotionEvent array...
local pointer_count = android.lib.AMotionEvent_getPointerCount(motion_event)
local pointer_count = tonumber(android.lib.AMotionEvent_getPointerCount(motion_event))
for i = 0, pointer_count - 1 do
-- So, loop through the array, and if that pointer is still down, move it
local slot = android.lib.AMotionEvent_getPointerId(motion_event, i)
Expand Down
2 changes: 1 addition & 1 deletion thirdparty/czmq/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ set(CFG_ENV_VAR "CC=\"${CC}\" LDFLAGS=\"${LDFLAGS}\" CFLAGS=\"-Wno-error ${CFLAG
set(CFG_OPTS "-q --prefix=${BINARY_DIR} --libdir=${BINARY_DIR}/lib --with-gnu-ld --with-libzmq=${ZMQ_DIR} --disable-static --enable-shared --host=${HOST}")
set(CFG_CMD sh -c "${CFG_ENV_VAR} ${SOURCE_DIR}/configure ${CFG_OPTS}")

if($ENV{ANDROID})
if(DEFINED ENV{ANDROID})
set(CFG_CMD "${CFG_CMD} && ${ISED} 's|version_type=none|version_type=linux|' libtool")
set(CFG_CMD "${CFG_CMD} && ${ISED} 's|need_lib_prefix=no|need_lib_prefix=yes|' libtool")
set(CFG_CMD "${CFG_CMD} && ${ISED} 's|need_version=no|need_version=yes|' libtool")
Expand Down
38 changes: 30 additions & 8 deletions thirdparty/lpeg/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,45 @@ include("koreader_thirdparty_common")

enable_language(C)

assert_var_defined(LPEG_VER)
assert_var_defined(CC)
assert_var_defined(DYNLIB_CFLAGS)
assert_var_defined(LUA_DIR)
assert_var_defined(CFLAGS)
assert_var_defined(LDFLAGS)
assert_var_defined(LUA_INCDIR)
assert_var_defined(LUA_LIBDIR)
assert_var_defined(OUTPUT_DIR)
assert_var_defined(LUAROCKS)

# NOTE: probably needs a similar fix as LFS: https://github.com/keplerproject/luafilesystem/commit/a84d81bc52590f930e54f108099df5d155bdc8bf
set(BUILD_CMD sh -c "${CC} ${DYNLIB_CFLAGS} -I${LUA_DIR}/src -L${LUA_DIR} -lluajit -o lpeg.so lpcap.c lpcode.c lpprint.c lptree.c lpvm.c")
ep_get_source_dir(SOURCE_DIR)

set(LUA_LPEG_ROCKSPEC lpeg-${LPEG_VER}.rockspec)

# Rewrite Makefile to behave sensibly w/ LuaRocks, and optionally allow linking to the lua lib...
SET(PATCH_CMD "${KO_PATCH} ${CMAKE_CURRENT_SOURCE_DIR}/lpeg-1.0.2-standard-makefile.patch")

# Move our custom rockspec to the build dir to fullfil build deps
set(CONFIGURE_CMD ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${LUA_LPEG_ROCKSPEC} ${SOURCE_DIR}/${LUA_LPEG_ROCKSPEC})

set(BUILD_CMD sh -c "${LUAROCKS} make --tree=${OUTPUT_DIR}/rocks ${LUA_LPEG_ROCKSPEC}")
set(BUILD_CMD "${BUILD_CMD} CC=\"${CC}\"")
set(BUILD_CMD "${BUILD_CMD} CFLAGS=\"${CFLAGS}\" LDFLAGS=\"${LDFLAGS}\"")
set(BUILD_CMD "${BUILD_CMD} LUA_INCDIR=\"${LUA_INCDIR}\" LUA_LIBDIR=\"${LUA_LIBDIR}\"")
if(DEFINED LUALIB)
set(BUILD_CMD "${BUILD_CMD} LUALIB=\"${LUALIB}\"")
endif()
if(DEFINED LIBS)
set(BUILD_CMD "${BUILD_CMD} LIBS=\"${LIBS}\"")
endif()

set(LPEG_VER "1.0.2")
include(ExternalProject)
ExternalProject_Add(
${PROJECT_NAME}
DOWNLOAD_DIR ${KO_DOWNLOAD_DIR}
URL http://distcache.FreeBSD.org/ports-distfiles/lpeg-${LPEG_VER}.tar.gz
URL http://distcache.FreeBSD.org/ports-distfiles/lpeg-1.0.2.tar.gz
URL_MD5 d342571886f1abcb7afe6a83d024d583
BUILD_IN_SOURCE 1
# skip configure
CONFIGURE_COMMAND ""
PATCH_COMMAND COMMAND ${PATCH_CMD}
CONFIGURE_COMMAND ${CONFIGURE_CMD}
BUILD_COMMAND ${BUILD_CMD}
# skip install
INSTALL_COMMAND ""
Expand Down
46 changes: 46 additions & 0 deletions thirdparty/lpeg/lpeg-1.0.2-2.rockspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package = "LPeg"
version = "1.0.2-2"
source = {
url = "http://www.inf.puc-rio.br/~roberto/lpeg/lpeg-1.0.2.tar.gz",
md5 = "d342571886f1abcb7afe6a83d024d583",
}
description = {
summary = "Parsing Expression Grammars For Lua",
detailed = [[
LPeg is a new pattern-matching library for Lua, based on Parsing
Expression Grammars (PEGs). The nice thing about PEGs is that it
has a formal basis (instead of being an ad-hoc set of features),
allows an efficient and simple implementation, and does most things
we expect from a pattern-matching library (and more, as we can
define entire grammars).
]],
homepage = "http://www.inf.puc-rio.br/~roberto/lpeg.html",
maintainer = "Gary V. Vaughan <gary@vaughan.pe>",
license = "MIT/X11"
}
dependencies = {
"lua >= 5.1"
}
build = {
type = "make",
makefile = "makefile",
build_target = "lpeg.so",
-- This is dumb as... rocks.
variables = {
CFLAGS = "$(CFLAGS)",
LIBFLAG = "$(LIBFLAG)",
LUA_LIBDIR = "$(LUA_LIBDIR)",
LUA_BINDIR = "$(LUA_BINDIR)",
LUA_INCDIR = "$(LUA_INCDIR)",
LUA = "$(LUA)",
LUALIB = "$(LUALIB)",
LIBS = "$(LIBS)",
},
install_variables = {
INST_PREFIX = "$(PREFIX)",
INST_BINDIR = "$(BINDIR)",
INST_LIBDIR = "$(LIBDIR)",
INST_LUADIR = "$(LUADIR)",
INST_CONFDIR = "$(CONFDIR)",
},
}

0 comments on commit 5957a6b

Please sign in to comment.