koreader-base icon indicating copy to clipboard operation
koreader-base copied to clipboard

Android aarch64 build.

Open pazos opened this issue 5 years ago • 33 comments

It has a few fancy things (NEON and VFPv4)

  • SDK API needs to be bumped from API14 to API21 (that's easy and doesn't affect other builds: we can have both armeabi-v7a and x86 with a min api of 14 and build aarch64 with a min api of 21). The build system just need to have the target api installed (which is 28 right now)

  • NDK API can stay in r15c, AFAICT. That's cool because I'm unable to build luajit with something newer.

pazos avatar Oct 14 '19 18:10 pazos

Claaaaaang! \o/.

NiLuJe avatar Oct 14 '19 18:10 NiLuJe

If Clang is required for aarch64 (?) then it'd still be a bit of effort to make that all work for Android. :-)

Frenzie avatar Oct 14 '19 19:10 Frenzie

I dunno, but I'd highly recommend not bothering with this if it's to keep using GCC 4.9, because if there was AArch64 support in there, it's likely to be impressively crappy compared to current GCC/Clang ;).

NiLuJe avatar Oct 14 '19 20:10 NiLuJe

I consider Clang a goal (even if only because it's forced by Google's GCC 4.9 behavior); better aarch64 would just be a side effect.

@pazos Btw, what do you mean unable to build LuaJIT with something newer? I know that Google customizes Clang, but the program has been tested for building with (regular) Clang since ~2014.

Frenzie avatar Oct 14 '19 20:10 Frenzie

Okay, there's https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/AArch64-Options.html#AArch64-Options so, yeah, probably early days, but it's in there ;).

Which, duh, I shouldn't even had had to check, because of the very few OEM's actually building a Linux kernel with Clang, so I knew that worked -_-".

NiLuJe avatar Oct 14 '19 20:10 NiLuJe

Btw, what do you mean unable to build LuaJIT with something newer?

I tried to bump the NDK to the latest one that supports ICS (r17b). I didn't change the toolchain, so I was trying to build with gcc, not clang. Lua throw an error, I didn't investigate the error.

I dunno, but I'd highly recommend not bothering with this if it's to keep using GCC 4.9, because if there was AArch64 support in there, it's likely to be impressively crappy compared to current GCC/Clang ;).

I consider Clang a goal (even if only because it's forced by Google's GCC 4.9 behavior); better aarch64 would just be a side effect.

The main benefit of aarch64, without changing the toolchain, is that neon is a must. But yeah 64 bits can wait and we can start playing with the new toolchain (I would go for r19 as things are way easier). In any case the old toolchain is still a must for legacy targets.

So, in the long run:

  • NDK r15c, SDK 14 -> "legacy" for armeabi-v7a
  • NDK r19?, SDK 17 -> "standard" for armeabi-v7a and x86 (with a modern TC)
  • NDK r19?, SDK 21 -> "new" for aarch64.

pazos avatar Oct 14 '19 22:10 pazos

I tried to bump the NDK to the latest one that supports ICS (r17b). I didn't change the toolchain, so I was trying to build with gcc, not clang. Lua throw an error, I didn't investigate the error.

Probably due to https://github.com/koreader/koreader-base/pull/510#discussion_r139290793

Google is almost unbelievably terrible at maintaining any kind of backward compatibility. I strongly suspect they're breaking it on purpose. Also see #792 for the (luckily not overly complex) type of stuff required for compatibility with multiple versions at once if desired.

Frenzie avatar Oct 15 '19 10:10 Frenzie

@Frenzie: your comment on #510 is out of date since https://github.com/koreader/koreader-base/pull/930/files

We still download the ndk because sdkmanager just has the latest ndk, which is incompatible with ICS.

Google is almost unbelievably terrible at maintaining any kind of backward compatibility. I strongly suspect they're breaking it on purpose.

Yup, Google is enforcing its "open" business. They can't kill lower apis (3-15), but they're forcing newer target apis to build (26-28), and these newer targets require tools that are, in fact, incompatible with lower apis.

The solution google provides includes the new ndk r20, which is clang only, and works in apis 16-29. We actually build with support for apis 14-29.

pazos avatar Oct 16 '19 23:10 pazos

@NiLuJe: LuaJIT works using https://github.com/koreader/android-luajit-launcher/pull/196/files#diff-5b290749f947ec669d6ffea0c0e9c3f9.

And the aarch64 toolchain seems to work with some changes in base:


diff --git a/Makefile.defs b/Makefile.defs
index 8508f36..3f386ec 100644
--- a/Makefile.defs
+++ b/Makefile.defs
@@ -17,7 +17,12 @@ POCKETBOOK_TOOLCHAIN?=$(TOOLCHAIN_DIR)/pocketbook-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
+	NDKABI?=14
+endif
 
 # Some CMake flags
 CMAKE_BUILD_TYPE?=Release
@@ -125,6 +130,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
@@ -332,6 +339,8 @@ ifeq ($(ANDROID_ARCH), arm)
 	ANDROID_ARM_ARCH:=-march=armv7-a -mfpu=vfpv3-d16
 	ANDROID_ARM_ARCH+=-mthumb
 	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
@@ -386,8 +395,11 @@ else ifeq ($(TARGET), android)
 	COMPAT_CXXFLAGS:=$(ANDROID_COMPAT_CXXFLAGS)
 	ifeq ($(ANDROID_ARCH), arm)
 		ARM_ARCH:=$(ANDROID_ARM_ARCH)
-		ARM_ARCH+=-mfloat-abi=softfp
+                ARM_ARCH+=-mfloat-abi=softfp
 		export ac_cv_type_in_port_t=yes
+        else ifeq($(ANDROID_ARCH), arm64)
+                ARM_ARCH:=$(ANDROID_ARM_ARCH)
+                export ac_cv_type_in_port_t=yes
 	endif
 else ifeq ($(TARGET), sony-prstux)
 	ARM_ARCH:=$(ARMV7_A8_ARCH)
@@ -457,9 +469,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
 
diff --git a/thirdparty/kpvcrlib/crengine b/thirdparty/kpvcrlib/crengine
index 647821c..71dd858 160000
--- a/thirdparty/kpvcrlib/crengine
+++ b/thirdparty/kpvcrlib/crengine
@@ -1 +1 @@
-Subproject commit 647821c033e2e99f36d64f88fc73a85387704060
+Subproject commit 71dd8583cf9b1bd09e6efd906834ebc2521b59f3
diff --git a/thirdparty/luajit/CMakeLists.txt b/thirdparty/luajit/CMakeLists.txt
index 99b5883..04d69dd 100644
--- a/thirdparty/luajit/CMakeLists.txt
+++ b/thirdparty/luajit/CMakeLists.txt
@@ -52,6 +52,8 @@ if(${XCOMPILE})
         # Add -m32 when cross compile on 64 bit host for 32bit target, Per:
         # http://luajit.org/install.html#cross
         set(HOST_CC "${CC} -m32")
+    elseif(HOST_CC_MACHINE MATCHES "^aarch64*")
+        set(HOST_CC "${CC} -m64")
     else()
         set(HOST_CC "${CC}")
     endif()

Some help with CMake, to build luajit with "-DLJ_ABI_SOFTFP=0 -DLJ_ARCH_HASFPU=1 -DLUAJIT_ENABLE_GC64=1", would be awesome. :ok_man:

pazos avatar Oct 18 '19 01:10 pazos

That should be automagically detected by the Makefile & lj_arch.h :?

Might need some default CFLAGS, though. IIRC, I pulled the arm ones from somewhere in the NDK, there might be a link in one of the comments?

NiLuJe avatar Oct 18 '19 01:10 NiLuJe

Okay, indirectly in a comment ;p. https://github.com/koreader/koreader-base/issues/201#issuecomment-48356453

NiLuJe avatar Oct 18 '19 01:10 NiLuJe

Yeah, arm64-v8a works with https://github.com/koreader/android-luajit-launcher/pull/196/files#diff-5b290749f947ec669d6ffea0c0e9c3f9R65-R73. Now how to port that to cmake, I don't know.

pazos avatar Oct 18 '19 01:10 pazos

My point being you shouldn't be enforcing those LJ_ defines yourself.

If they get misdetected, that's another kettle of fish (but they shouldn't, it's a simple cascade of preprocessor checks).

NiLuJe avatar Oct 18 '19 01:10 NiLuJe

And the (granted, Clang) closest version of what I dug up back in '14 appears to be the CMake TC config: https://android.googlesource.com/platform/ndk.git/+/refs/heads/master/build/cmake/android.toolchain.cmake

With perhaps this caveat for GCC: https://android.googlesource.com/platform/ndk.git/+/refs/heads/master/build/tools/prebuilt-common.sh#1036

NiLuJe avatar Oct 18 '19 01:10 NiLuJe

TL;DR: An aarch64-friendly Makefile.defs should be enough ;).

NiLuJe avatar Oct 18 '19 01:10 NiLuJe

i.e., something like that should be enough, no need to tweak thirdparty/luajit/CMakeLists.txt either.

diff --git a/Makefile.defs b/Makefile.defs
index 8508f36..9fd0ee3 100644
--- a/Makefile.defs
+++ b/Makefile.defs
@@ -17,7 +17,12 @@ POCKETBOOK_TOOLCHAIN?=$(TOOLCHAIN_DIR)/pocketbook-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
+       NDKABI?=14
+endif
 
 # Some CMake flags
 CMAKE_BUILD_TYPE?=Release
@@ -125,6 +130,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
@@ -332,6 +339,14 @@ ifeq ($(ANDROID_ARCH), arm)
        ANDROID_ARM_ARCH:=-march=armv7-a -mfpu=vfpv3-d16
        ANDROID_ARM_ARCH+=-mthumb
        ANDROID_ARM_ARCH+=-ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes
+else ifeq($(ANDROID_ARCH), arm64)
+       # NOTE: This should be the default on both Clang & GCC, but keep enforcing it for clarity's sake.
+       ANDROID_ARM_ARCH:=-march=armv8-a+fp+simd
+       # c.f., https://github.com/koreader/koreader-base/issues/993#issuecomment-543442597
+       ANDROID_ARM_ARCH+=-fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes
+       # c.f., https://android.googlesource.com/platform/ndk.git/+/refs/heads/master/build/tools/prebuilt-common.sh#1036
+       # TODO: Get rid of it when moving to Clang
+       ANDROID_ARM_ARCH+=-ffixed-x18
 endif
 
 # Use target-specific CFLAGS
@@ -388,6 +403,9 @@ else ifeq ($(TARGET), android)
                ARM_ARCH:=$(ANDROID_ARM_ARCH)
                ARM_ARCH+=-mfloat-abi=softfp
                export ac_cv_type_in_port_t=yes
+       else ifeq($(ANDROID_ARCH), arm64)
+               ARM_ARCH:=$(ANDROID_ARM_ARCH)
+               export ac_cv_type_in_port_t=yes
        endif
 else ifeq ($(TARGET), sony-prstux)
        ARM_ARCH:=$(ARMV7_A8_ARCH)
@@ -457,9 +475,11 @@ 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+=-march=armv7-a -Wl,--fix-cortex-a8
+       else ifeq($(ANDROID_ARCH), arm64)
+               LDFLAGS+=-Wl,--gc-sections
        endif
 endif

NiLuJe avatar Oct 18 '19 14:10 NiLuJe

And in jni/luajit/mk-luajit.sh, set NDKARCH to what we set ANDROID_ARM_ARCH here, like is done on other arches.

NiLuJe avatar Oct 18 '19 14:10 NiLuJe

Thanks a lot @NiLuJe for your guidance.

I get this error while building luajit (with some context)

pazos@bowie:~/Escritorio/koreader$ ANDROID_ARCH=arm64 ./kodev release --ignore-translation android
v2019.09.3-84-gb24de3a4
Using NDK: /home/pazos/Escritorio/koreader/base/toolchain/android-ndk-r15c...
************ CMAKE_MAKE_PROGRAM: "make" **********
/bin/bash: aarch64-linux-android-gcc: orden no encontrada
/bin/bash: aarch64-linux-android-gcc: orden no encontrada
/bin/bash: aarch64-linux-android-gcc: orden no encontrada
make -C base
************ CMAKE_MAKE_PROGRAM: "make" **********
************ Building for MACHINE: "aarch64-linux-android" **********
************ PATH: "/home/pazos/Escritorio/koreader/base/toolchain/android-toolchain-arm64/bin:/home/pazos/Escritorio/koreader/base/toolchain/android-toolchain-arm64/bin:/home/pazos/Escritorio/koreader/base/toolchain/android-toolchain-arm64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/arm-cervantes-linux-gnueabi/bin" **********
************ CHOST: "aarch64-linux-android" **********
make[1]: Entering directory `/home/pazos/Escritorio/koreader/base'
install -d build/aarch64-linux-android/libs
install -d thirdparty/luajit/build/aarch64-linux-android
cd thirdparty/luajit/build/aarch64-linux-android && \
		cmake  -DCMAKE_TOOLCHAIN_FILE=/home/pazos/Escritorio/koreader/base/thirdparty/cmake_modules/CMakeCross.cmake  -DCC="gcc" \
		-DXCOMPILE:BOOL=on \
		-DBASE_CFLAGS="-O2 -ffast-math -pipe -fomit-frame-pointer" -DHOST_CFLAGS="-march=native -O2 -ffast-math -pipe -fomit-frame-pointer " \
		-DLDFLAGS="-Wl,-O1 -Wl,--as-needed -static-libstdc++ -no-canonical-prefixes -Wl,--gc-sections -static-libstdc++" \
		 \
		-DTARGET_SYS=Linux \
		-DTARGET_SONAME=libluajit.so \
		-DTARGET_CFLAGS="-O2 -ffast-math -pipe -fomit-frame-pointer  -std=gnu11  --sysroot /home/pazos/Escritorio/koreader/base/toolchain/android-ndk-r15c/platforms/android-21/arch-arm64 -static-libstdc++ -fPIC" \
		-DCROSS="aarch64-linux-android-" \
		/home/pazos/Escritorio/koreader/base/thirdparty/luajit && \
		make 
-- The C compiler identification is GNU 4.9.0
-- The CXX compiler identification is GNU 4.9.0
-- Check for working C compiler: /home/pazos/Escritorio/koreader/base/toolchain/android-toolchain-arm64/bin/aarch64-linux-android-gcc
-- Check for working C compiler: /home/pazos/Escritorio/koreader/base/toolchain/android-toolchain-arm64/bin/aarch64-linux-android-gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /home/pazos/Escritorio/koreader/base/toolchain/android-toolchain-arm64/bin/aarch64-linux-android-g++
-- Check for working CXX compiler: /home/pazos/Escritorio/koreader/base/toolchain/android-toolchain-arm64/bin/aarch64-linux-android-g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Git: /usr/bin/git (found version "2.17.1") 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android
make[2]: Entering directory `/home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android'
make[3]: Entering directory `/home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android'
make[4]: Entering directory `/home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android'
Scanning dependencies of target luajit
make[4]: Leaving directory `/home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android'
make[4]: Entering directory `/home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android'
[ 12%] Creating directories for 'luajit'
[ 25%] Performing download step for 'luajit'
[ 37%] Performing patch step for 'luajit'
patching file src/Makefile
[ 50%] No update step for 'luajit'
[ 62%] No configure step for 'luajit'
[ 75%] Performing build step for 'luajit'
make[5]: Entering directory `/home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android/luajit-prefix/src/luajit'
Building LuaJIT 2.1.0-beta3
make[6]: Entering directory `/home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android/luajit-prefix/src/luajit/src'
+--------------------------------------------------------------------------+
| WARNING: Compiling the amalgamation needs a lot of virtual memory        |
| (around 300 MB with GCC 4.x)! If you don't have enough physical memory   |
| your machine will start swapping to disk and the compile will not finish |
| within a reasonable amount of time.                                      |
| So either compile on a bigger machine or use the non-amalgamated build.  |
+--------------------------------------------------------------------------+
make[7]: Entering directory `/home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android/luajit-prefix/src/luajit/src'
HOSTCC    host/minilua.o
HOSTCC    host/buildvm_asm.o
HOSTCC    host/buildvm_peobj.o
HOSTCC    host/buildvm_lib.o
HOSTCC    host/buildvm_fold.o
In file included from host/buildvm.h:15:0,
                 from host/buildvm_lib.c:6:
./lj_def.h:355:47: error: size of array ‘STATIC_ASSERTION_FAILED’ is negative
   extern void LJ_ASSERT_NAME(__COUNTER__)(int STATIC_ASSERTION_FAILED[(cond)?1:-1])
                                               ^
./lj_obj.h:699:1: note: in expansion of macro ‘LJ_STATIC_ASSERT’
 LJ_STATIC_ASSERT(offsetof(GChead, metatable) == offsetof(GCudata, metatable));
 ^~~~~~~~~~~~~~~~
In file included from host/buildvm_lib.c:7:0:
./lj_obj.h: In function ‘setlightudV’:
./lj_obj.h:830:12: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
   o->u64 = (uint64_t)p | (((uint64_t)LJ_TLIGHTUD) << 47);
            ^
./lj_obj.h: In function ‘setgcVraw’:
./lj_obj.h:70:17: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
   (r).gcptr64 = (uint64_t)&(gc)->gch | (((uint64_t)(it)) << 47)
                 ^
./lj_obj.h:865:3: note: in expansion of macro ‘setgcreft’
   setgcreft(o->gcr, v, itype);
   ^~~~~~~~~
CC        luajit.o
make[7]: *** [host/buildvm_lib.o] Error 1
make[7]: *** Waiting for unfinished jobs....
In file included from host/buildvm.h:15:0,
                 from host/buildvm_fold.c:6:
./lj_def.h:355:47: error: size of array ‘STATIC_ASSERTION_FAILED’ is negative
   extern void LJ_ASSERT_NAME(__COUNTER__)(int STATIC_ASSERTION_FAILED[(cond)?1:-1])
                                               ^
./lj_obj.h:699:1: note: in expansion of macro ‘LJ_STATIC_ASSERT’
 LJ_STATIC_ASSERT(offsetof(GChead, metatable) == offsetof(GCudata, metatable));
 ^~~~~~~~~~~~~~~~
In file included from host/buildvm_fold.c:7:0:
./lj_obj.h: In function ‘setlightudV’:
./lj_obj.h:830:12: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
   o->u64 = (uint64_t)p | (((uint64_t)LJ_TLIGHTUD) << 47);
            ^
./lj_obj.h: In function ‘setgcVraw’:
./lj_obj.h:70:17: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
   (r).gcptr64 = (uint64_t)&(gc)->gch | (((uint64_t)(it)) << 47)
                 ^
./lj_obj.h:865:3: note: in expansion of macro ‘setgcreft’
   setgcreft(o->gcr, v, itype);
   ^~~~~~~~~
make[7]: *** [host/buildvm_fold.o] Error 1
make[7]: Leaving directory `/home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android/luajit-prefix/src/luajit/src'
make[6]: *** [amalg] Error 2
make[6]: Leaving directory `/home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android/luajit-prefix/src/luajit/src'
make[5]: *** [amalg] Error 2
make[5]: Leaving directory `/home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android/luajit-prefix/src/luajit'
make[4]: *** [luajit-prefix/src/luajit-stamp/luajit-build] Error 2
make[4]: Leaving directory `/home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android'
make[3]: *** [CMakeFiles/luajit.dir/all] Error 2
make[3]: Leaving directory `/home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android'
make[1]: *** [build/aarch64-linux-android/libs/libluajit.so] Error 2
make[1]: Leaving directory `/home/pazos/Escritorio/koreader/base'
Makefile:69: recipe for target 'all' failed
make: *** [all] Error 2

FWIW, I can build standalone luajit with mk-luajit, following your suggestion: remove LJ build flags and using NDKARCH="-march=armv8-a+fp+simd"

pazos avatar Oct 18 '19 23:10 pazos

Can you try that again with a verbose build?

IIRC, something like

export VERBOSE=1
export V=1

Should do it?

NiLuJe avatar Oct 19 '19 00:10 NiLuJe

(And, to be extra clear: that's only the CMake-wrapped build that's eating dirt? The mk-luajit Android thingy one goes through fine?)

NiLuJe avatar Oct 19 '19 00:10 NiLuJe

Also, as that's the early HOSTCC bit that's face-planting, what is your host CC, exactly?

And, just in case, do you have CC/CFLAGS & co exported in your env?

NiLuJe avatar Oct 19 '19 03:10 NiLuJe

@NiLuJe issue triaged:

https://github.com/koreader/koreader-base/blob/d9a685c6817d073a9fc0cd231e567a998250a9c6/thirdparty/luajit/CMakeLists.txt#L51-L55

As you see luajit is forced to be 32 bits while building for arm, this clashes with aarch64 support. I'm building the rest of the software without issues after removing those lines.

pazos avatar Oct 20 '19 00:10 pazos

Gah. Of course. It needs another depth of testing for a 32b target :/.

NiLuJe avatar Oct 20 '19 01:10 NiLuJe

Hopefully, something resembling that?

diff --git a/thirdparty/luajit/CMakeLists.txt b/thirdparty/luajit/CMakeLists.txt
index 99b5883..b56cd98 100644
--- a/thirdparty/luajit/CMakeLists.txt
+++ b/thirdparty/luajit/CMakeLists.txt
@@ -48,7 +48,7 @@ if(${XCOMPILE})
         COMMAND "${CC}" -dumpmachine
         OUTPUT_VARIABLE HOST_CC_MACHINE
     )
-    if(HOST_CC_MACHINE MATCHES "^x86_64*")
+    if((HOST_CC_MACHINE MATCHES ".*64$") AND (NOT CMAKE_SYSTEM_PROCESSOR MATCHES ".*64$"))
         # Add -m32 when cross compile on 64 bit host for 32bit target, Per:
         # http://luajit.org/install.html#cross
         set(HOST_CC "${CC} -m32")

EDIT: Broken, see below. -dumpmachine reports the triple, not the arch (I was designing the regex with uname -m in mind).

NiLuJe avatar Oct 20 '19 01:10 NiLuJe

Okay, that one at least isn't plain wrong anymore ;p.

Quick testing seems to hint at it holding up, but I haven't done an actual build.

diff --git a/thirdparty/luajit/CMakeLists.txt b/thirdparty/luajit/CMakeLists.txt
index 99b5883..6efe3b0 100644
--- a/thirdparty/luajit/CMakeLists.txt
+++ b/thirdparty/luajit/CMakeLists.txt
@@ -48,7 +48,7 @@ if(${XCOMPILE})
         COMMAND "${CC}" -dumpmachine
         OUTPUT_VARIABLE HOST_CC_MACHINE
     )
-    if(HOST_CC_MACHINE MATCHES "^x86_64*")
+    if((HOST_CC_MACHINE MATCHES "^.+64-.+$") AND (NOT CMAKE_SYSTEM_PROCESSOR MATCHES ".+64$"))
         # Add -m32 when cross compile on 64 bit host for 32bit target, Per:
         # http://luajit.org/install.html#cross
         set(HOST_CC "${CC} -m32")

It should also handle the unlikely event of anyone ever cross-compiling from a different 64bit arch than x86_64 ;).

This assumes CMAKE_SYSTEM_PROCESSOR is sane, which should always be the case with our ToolChain file:

https://github.com/koreader/koreader-base/blob/d9a685c6817d073a9fc0cd231e567a998250a9c6/thirdparty/cmake_modules/CMakeCross.cmake#L18-L21

NiLuJe avatar Oct 20 '19 01:10 NiLuJe

Quick testing seems to hint at it holding up, but I haven't done an actual build.

Yeah, I talked too soon. I'm stuck with lpeg build, that fails with:

aarch64-linux-android-gcc -static-libstdc++ -O2 -ffast-math -pipe -fomit-frame-pointer  -std=gnu11  --sysroot /home/pazos/Escritorio/koreader/base/toolchain/android-ndk-r15c/platforms/android-21/arch-arm64 -static-libstdc++ -fPIC -I/home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android/luajit-prefix/src/luajit/src -I/home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android/luajit-prefix/src/luajit/src -c lpvm.c -o lpvm.o
In file included from lpcap.h:9:0,
                 from lpvm.c:13:
lptypes.h:38:0: warning: "luaL_newlib" redefined
 #define luaL_newlib(L,f) luaL_register(L,"lpeg",f)
 ^
In file included from lpvm.c:11:0:
/home/pazos/Escritorio/koreader/base/thirdparty/luajit/build/aarch64-linux-android/luajit-prefix/src/luajit/src/lauxlib.h:125:0: note: this is the location of the previous definition
 #define luaL_newlib(L, l) (luaL_newlibtable(L, l), luaL_setfuncs(L, l, 0))

pazos avatar Oct 20 '19 20:10 pazos

Logic dictates #ifndef luaL_newlib… but that doesn't answer the question of why this would randomly come up.

Frenzie avatar Oct 20 '19 21:10 Frenzie

That's just a warning though, not a build failure?

(Adn, FWIW, I think we get that warning everywhere, it sounds really familiar).

NiLuJe avatar Oct 20 '19 23:10 NiLuJe

You're right, this looks like a warning on all platforms, presumably caused by the fact that LuaJIT now implements some select Lua 5.2 stuff.

Frenzie avatar Oct 21 '19 04:10 Frenzie

Many moons passed since I played with it, but now it should be easier given that we have support for other aarch64 devices.

Still stuck with lpeg. I'm attaching a verbose log (lets clean everything and start from scratch :))

verbose.log

pazos avatar Jun 07 '21 20:06 pazos