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

Reply via email to