Hello,
I am trying to compile ECL 16.1.2 under Android 6.0.1 in Termux environment (this has almost nothing to do with compiling for Android target --- just think of Termux as a GNU Linux implementation running on Android kernel). Termux is an Android application which provides GNU Linux environment, see here http://termux.com
(After installing Termux do "apt update && apt upgrade -y" and also install a myriad of applications to turn it into proper Linux development workstation, e.g. I always install the following (plus a plethora of python modules but they are irrelevant for this discussion):
apt install autoconf automake bc binutils-dev bison bzip2 cboard clang-dev cmake coreutils ctags curl cvs diffutils dnsutils dos2unix dpkg-dev ecj elfutils-dev \ elinks expect-dev fftw-dev ffmpeg-dev file-dev findutils flac flex-dev freetype-dev gawk-dev gcal gdb-dev git glib-dev glib-bin gnuchess gnuplot grep gzip htop iconv imagemagick-dev \ lftp libandroid-glob-dev openssh libtool-dev libpng libpng-dev libtiff libtiff-dev libtiff-utils ltrace strace mc man-dev make-dev \ lua-dev luarocks mlocate ncurses-dev ncurses-utils nmap patch p7zip php-dev pkg-config mpv procps python-dev qalc rsync sed tar taskwarrior tcl-dev termux-api \ tesseract-dev tmate tracepath tree units unzip unrar vim wget zip linux-man-pages
but a smaller subset should be sufficient, e.g. surely one doesn't need gnuchess/cboard to compile ECL :)
So, in order to configure ECL 16.1.2 I did the following after unpacking the sources:
1. $ export CONFIG_SHELL = $SHELL
2. Fix all configure and config.guess scripts to not use #!/bin/sh because under Termux the shell is $PREFIX/bin/bash (and /bin is not accessible):
$ find -name 'configure' -exec termux-fix-shebang {} ; $ find -name 'config.guess' -exec termux-fix-shebang {} ;
3. $ ./configure --prefix=$PREFIX/local
This succeeds. And so I go on to
4. $ make
(this fails but due to a trivial thing --- some Makefiles contain hardcoded "/bin/sh" references --- so I fix all these to refer to the proper location of bash in Termux)
5. Re-run make after all these changes and it fails here:
$ make cd build; make make[1]: Entering directory '/data/data/com.termux/files/home/Maxima/ecl-16.1.2/build' if (echo c gc libffi atomic | grep gmp); then \ cd gmp && make install && \ cd .. && mv include/gmp.h ecl/ && rmdir include && \ mv ./libgmp.a ./libeclgmp.a; \ fi test -d ecl/gc || mkdir ecl/gc test -d ecl/gc/private || mkdir ecl/gc/private if (echo c gc libffi atomic | grep gc); then \ cd gc && make install && cd .. && \ cp -rf /data/data/com.termux/files/home/Maxima/ecl-16.1.2/src/bdwgc/include/private/*.h ecl/gc/private/ && \ mv libgc.a libeclgc.a; \ fi c gc libffi atomic make[2]: Entering directory '/data/data/com.termux/files/home/Maxima/ecl-16.1.2/build/gc' make[3]: Entering directory '/data/data/com.termux/files/home/Maxima/ecl-16.1.2/build/gc' depbase=`echo dyn_load.lo | sed 's|[^/]*$|.deps/&|;s|.lo$||'`;\ /data/data/com.termux/files/usr/bin/bash ./libtool --tag=CC --mode=compile gcc -fPIC -DHAVE_CONFIG_H -I./include -I/data/data/com.termux/files/home/Maxima/ecl-16.1.2/src/bdwgc/include -I./libatomic_ops/src -I/data/data/com.termux/files/home/Maxima/ecl-16.1.2/src/bdwgc/libatomic_ops/src -I/data/data/com.termux/files/home/Maxima/ecl-16.1.2/build/ecl -fexceptions -Wall -Wextra -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -g -O2 -fPIC -D_THREAD_SAFE -fno-strict-aliasing -MT dyn_load.lo -MD -MP -MF $depbase.Tpo -c -o dyn_load.lo /data/data/com.termux/files/home/Maxima/ecl-16.1.2/src/bdwgc/dyn_load.c &&\ mv -f $depbase.Tpo $depbase.Plo libtool: compile: gcc -fPIC -DHAVE_CONFIG_H -I./include -I/data/data/com.termux/files/home/Maxima/ecl-16.1.2/src/bdwgc/include -I./libatomic_ops/src -I/data/data/com.termux/files/home/Maxima/ecl-16.1.2/src/bdwgc/libatomic_ops/src -I/data/data/com.termux/files/home/Maxima/ecl-16.1.2/build/ecl -fexceptions -Wall -Wextra -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -g -O2 -fPIC -D_THREAD_SAFE -fno-strict-aliasing -MT dyn_load.lo -MD -MP -MF .deps/dyn_load.Tpo -c /data/data/com.termux/files/home/Maxima/ecl-16.1.2/src/bdwgc/dyn_load.c -o dyn_load.o /data/data/com.termux/files/home/Maxima/ecl-16.1.2/src/bdwgc/dyn_load.c:116:14: error: redefinition of 'link_map' struct link_map { ^ /data/data/com.termux/files/usr/include/link.h:57:8: note: previous definition is here struct link_map { ^ /data/data/com.termux/files/home/Maxima/ecl-16.1.2/src/bdwgc/dyn_load.c:123:14: error: redefinition of 'r_debug' struct r_debug { ^ /data/data/com.termux/files/usr/include/link.h:66:8: note: previous definition is here struct r_debug { ^ 2 errors generated. make[3]: *** [Makefile:1527: dyn_load.lo] Error 1 make[3]: Leaving directory '/data/data/com.termux/files/home/Maxima/ecl-16.1.2/build/gc' make[2]: *** [Makefile:1710: install-recursive] Error 1 make[2]: Leaving directory '/data/data/com.termux/files/home/Maxima/ecl-16.1.2/build/gc' make[1]: *** [Makefile:123: libeclgc.a] Error 2 make[1]: Leaving directory '/data/data/com.termux/files/home/Maxima/ecl-16.1.2/build' make: *** [Makefile:70: all] Error 2
So, then I check that those two definitions (link_map and r_debug) in dyn_load.c are compatible with the system ones in link.h and comment them out. Then I restart make and it goes on successfully for quite a while until failing here:
libtool: compile: gcc -fPIC -DHAVE_CONFIG_H -I. -I/data/data/com.termux/files/home/Maxima/ecl-16.1.2/src/libffi -I. -I/data/data/com.termux/files/home/Maxima/ecl-16.1.2/src/libffi/include -Iinclude -I/data/data/com.termux/files/home/Maxima/ecl-16.1.2/src/libffi/src -I. -I/data/data/com.termux/files/home/Maxima/ecl-16.1.2/src/libffi/include -Iinclude -I/data/data/com.termux/files/home/Maxima/ecl-16.1.2/src/libffi/src -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -g -O2 -fPIC -D_THREAD_SAFE -MT src/arm/sysv.lo -MD -MP -MF src/arm/.deps/sysv.Tpo -c /data/data/com.termux/files/home/Maxima/ecl-16.1.2/src/libffi/src/arm/sysv.S -o src/arm/sysv.o /data/data/com.termux/files/home/Maxima/ecl-16.1.2/src/libffi/src/arm/sysv.S:399:2: error: invalid instruction stmeqia r2, {r0, r1}
And this is where I get stuck because I don't know ARM instruction set. I am a Linux kernel developer (or was, many years ago) and know C and a bit of asm for x86 architecture, but not ARM.
Any ideas?
Btw, the reason I am trying to compile ECL for Termux is because the next step would be to compile Maxima. I know that there is already Maxima for Android but it is a GUI version and so not very convenient for the real work. Real scientific work with Maxima can only be done in a text-based terminal version (and plotting is irrelevant as it is much more convenient to be done with python's matplotlib anyway which works perfectly under Termux).
Kind regards, Tigran