Problems compiling ECL for Termux on Android.

Tigran Aivazian aivazian.tigran at gmail.com
Mon Sep 26 06:00:39 UTC 2016


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/ecl-devel/attachments/20160926/d7796337/attachment.html>


More information about the ecl-devel mailing list