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