I took a little time cause I want to avoid side effects due to days of trys and tests.
Now I am NDK 20.0.5594570, according to python toolchain script output I use NDK prebuilts, no aarch64-linux-android-g++ anymore in build process.
I want to static build products, which need 3rd-part libs.
Now 6 of 9 build process are OK : compile, lib. But not yet static binary.
Here are the issues with env and analysis, it can help:
Global envs
CC = aarch64-linux-android28-clang
CXX = aarch64-linux-android28-clang++
AR = ...
TARGET_HOST = aarch64-linux-android
$ which $CC
.../ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android28-clang
Issues
1/ configure, system include path
CFLAGS = -static -I... (all 3th-part includes)
LDFLAGS = -all-static -L...(all 3th-part libs)
$ ./configure --host=$TARGET_HOST
...
checking for sysroot... no
...
Configuration is done.
$ make
make all-recursive
make[1]: Entering directory '/home/jbd/dev/25-android/leptonica-src'
Making all in src
make[2]: Entering directory '/home/jbd/dev/25-android/leptonica-src/src'
CC adaptmap.lo
In file included from adaptmap.c:134:
In file included from ./allheaders.h:35:
In file included from ./alltypes.h:31:
In file included from /home/jbd/soft/android/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/stdio.h:41:
/usr/include/x86_64-linux-gnu/sys/cdefs.h:41:6: error: function-like macro '__GNUC_PREREQ' is not defined
# if __GNUC_PREREQ (4, 6) && !defined _LIBC
^
/usr/include/x86_64-linux-gnu/sys/cdefs.h:54:30: error: function-like macro '__GNUC_PREREQ' is not defined
# if !defined __cplusplus && __GNUC_PREREQ (3, 3)
Why use of sysroot/usr/include with configure sysroot test saying no.
Anyway, if stdio.h comes from NDK sysroot/usr/include, cdefs.h have to come from NDK sysroot/usr/include/sys too. that's a freaky issue, output says sys/cdefs.h is the native one (/usr/include/x86_64-linux-gnu).
For information, I pass this build, with NDK19 and g++, using gnu native system params... But with NDK20, back using g++ from tool-chain python script, I can't anymore, good because it was not a proper way...
2/ cmake struggles
2.1/ native cmake, a warmup way.
$ /usr/local/bin/cmake --version
cmake version 3.14.5
CFLAGS = -static -I... (all 3th-part includes)
LDFLAGS = -all-static -L...(all 3th-part libs)
$ cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_C_COMPILER="$CC" -DCMAKE_CXX_COMPILER="$CXX" -DCMAKE_LINKER="$LD" -DCMAKE_AR="$AR" -DCMAKE_C_ARCHE_CREATE="<CMAKE_AR> -qa <TARGET> <OBJECTS>" -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DCMAKE_E_LINKER_FLAGS="-static" -DCMAKE_C_FLAGS="$CFLAGS" -DCMAKE_STATIC_LINKER_FLAGS="$LDFLAGS"
OK
$ make
...
[ 44%] Linking C static library ../../../bin/libopenjp2.a
cd /home/jbd/dev/25-android/openjpeg-src/build/src/lib/openjp2 && /usr/local/bin/cmake -P CMakeFiles/openjp2.dir/cmake_clean_target.cmake
cd /home/jbd/dev/25-android/openjpeg-src/build/src/lib/openjp2 && /usr/local/bin/cmake -E cmake_link_script CMakeFiles/openjp2.dir/link.txt --verbose=1
/home/jbd/dev/25-android/openjpeg-src/build/aarch64-linux-android-ar -qa ../../../bin/libopenjp2.a CMakeFiles/openjp2.dir/thread.c.o CMakeFiles/openjp2.dir/bio.c.o CMakeFiles/openjp2.dir/cio.c.o CMakeFiles/openjp2.dir/dwt.c.o CMakeFiles/openjp2.dir/event.c.o CMakeFiles/openjp2.dir/image.c.o CMakeFiles/openjp2.dir/invert.c.o CMakeFiles/openjp2.dir/j2k.c.o CMakeFiles/openjp2.dir/jp2.c.o CMakeFiles/openjp2.dir/mct.c.o CMakeFiles/openjp2.dir/mqc.c.o CMakeFiles/openjp2.dir/openjpeg.c.o CMakeFiles/openjp2.dir/opj_clock.c.o CMakeFiles/openjp2.dir/pi.c.o CMakeFiles/openjp2.dir/t1.c.o CMakeFiles/openjp2.dir/t2.c.o CMakeFiles/openjp2.dir/tcd.c.o CMakeFiles/openjp2.dir/tgt.c.o CMakeFiles/openjp2.dir/function_list.c.o CMakeFiles/openjp2.dir/opj_malloc.c.o CMakeFiles/openjp2.dir/sparse_array.c.o
/home/jbd/dev/25-android/openjpeg-src/build/aarch64-linux-android-ar: CMakeFiles/openjp2.dir/thread.c.o: File format not recognized
however, the files seem to be correct.
$ file ./CMakeFiles/openjp2.dir/thread.c.o
./CMakeFiles/openjp2.dir/thread.c.o: ELF 64-bit LSB relocatable, ARM aarch64, version 1 (SYSV), not stripped
For information, I link aarch64-linux-android-ar to local path because of astonishing CMAKE_AR behavior.
Stuck, so B-plan.
$ $SDK_PATH/cmake/3.10.2.4988404/bin/cmake --version
cmake version 3.10.2
$ $SDK_PATH/cmake/3.10.2.4988404/bin/cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DANDROID_NDK=$NDK_PATH -DCMAKE_TOOLCHAIN_FILE=$NDK_PATH/build/cmake/android.toolchain.cmake -DANDROID_TOOLCHAIN=clang -DCMAKE_MAKE_PROGRAM=$SDK_PATH/cmake/3.10.2.4988404/bin/ninja -DANDROID_NATIVE_API_LEVEL=24 -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=$OPENJPEG_PREFIX -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DCMAKE_EXE_LINKER_FLAGS="-static" -DCMAKE_C_FLAGS="$CFLAGS" -DCMAKE_STATIC_LINKER_FLAGS="$LDFLAGS"
-- Check for working C compiler: /home/jbd/soft/android/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
-- Check for working C compiler: /home/jbd/soft/android/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -- broken
CMake Error at /home/jbd/soft/android/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake:52 (message):
The C compiler
"/home/jbd/soft/android/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang"
is not able to compile a simple test program.
It fails with the following output:
Change Dir: /home/jbd/dev/25-android/openjpeg-src/build/CMakeFiles/CMakeTmp
Run Build Command:"/home/jbd/soft/android/cmake/3.10.2.4988404/bin/ninja" "cmTC_856eb/fast"
ninja: error: loading 'build.ninja': No such file or directory
No build.ninja file in SDK, NDK...
Final round
CFLAGS = -static -I... (all 3th-part includes)
LDFLAGS = -static-libstdc++ -all-static -L (all 3th-part libs)
$ ./configure --host=$TARGET_HOST
...
Configuration is done.
$ make
...
10 minutes of compile OK, local lib OK, but can't build binary because of former 3th-part fails (1/ , 2/).