Estoy trabajando en la compilación de OpenSSH para Android basado enesta respuesta en Stack Overflow.
Esto es lo que he hecho hasta ahora:
- Basado en Ubuntu 14.04 amd64.
apt-get install build-essential gcc-arm-linux-androideabi
Descarga zlib, luego haz:
cd zlib-1.2.8
./configure --prefix=/vagrant/build
make CC=arm-linux-androideabi-gcc
make install
Esto falla en el make
paso:
gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map -O3 -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -o libz.so.1.2.8 adler32.lo crc32.lo deflate.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo zutil.lo compress.lo uncompr.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo -lc
/usr/bin/ld: crc32.lo: Relocations in generic ELF (EM: 40)
crc32.lo: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
make: *** [libz.so.1.2.8] Error 1
¿Que me estoy perdiendo aqui? ¿Hay algo más que deba saber para poder compilar zlib?
El siguiente paso en el proceso es construir OpenSSL:
cd openssl-1.0.1h/
./Configure dist --prefix=/vagrant/build/
make CC="arm-linux-androideabi-gcc" AR="arm-linux-androideabi-ar r" RANLIB="arm-linux-androideabi-ranlib"
make install
Esto nuevamente falla en el make
paso:
make[2]: Entering directory `/vagrant/openssl-1.0.1h/apps'
( :; LIBDEPS="${LIBDEPS:--L.. -lssl -L.. -lcrypto }"; LDCMD="${LDCMD:-cc}"; LDFLAGS="${LDFLAGS:--O}"; LIBPATH=`for x in $LIBDEPS; do echo $x; done | sed -e 's/^ *-L//;t' -e d | uniq`; LIBPATH=`echo $LIBPATH | sed -e 's/ /:/g'`; LD_LIBRARY_PATH=$LIBPATH:$LD_LIBRARY_PATH ${LDCMD} ${LDFLAGS} -o ${APPNAME:=openssl} openssl.o verify.o asn1pars.o req.o dgst.o dh.o dhparam.o enc.o passwd.o gendh.o errstr.o ca.o pkcs7.o crl2p7.o crl.o rsa.o rsautl.o dsa.o dsaparam.o ec.o ecparam.o x509.o genrsa.o gendsa.o genpkey.o s_server.o s_client.o speed.o s_time.o apps.o s_cb.o s_socket.o app_rand.o version.o sess_id.o ciphers.o nseq.o pkcs12.o pkcs8.o pkey.o pkeyparam.o pkeyutl.o spkac.o smime.o cms.o rand.o engine.o ocsp.o prime.o ts.o srp.o ${LIBDEPS} )
/usr/bin/ld: openssl.o: Relocations in generic ELF (EM: 40)
/usr/bin/ld: openssl.o: Relocations in generic ELF (EM: 40)
openssl.o: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
make[2]: *** [link_app.] Error 1
make[2]: Leaving directory `/vagrant/openssl-1.0.1h/apps'
make[1]: *** [openssl] Error 2
make[1]: Leaving directory `/vagrant/openssl-1.0.1h/apps'
make: *** [build_apps] Error 1
Nuevamente parece tener el mismo problema: no poder leer un archivo que escribió.
Aún no he llegado al paso final de compilar OpenSSH, pero así es como supongo que lo haría:
cd openssh-6.6p1
./configure --host=arm-linux --with-libs --with-zlib=$HOME/zlibArm --with-ssl-dir=$HOME/opensslArm --disable-etc-default-login CC=gcc-arm-linux-gnueabi-gcc AR=gcc-arm-linux-gnueabi-ar
make
¿Por qué mi compilación anterior falla para Zlib y OpenSSL al compilar para arm-linux-androideabi
? ¿Cómo puedo compilar OpenSSH (específicamente el cliente y el agente) para Android en ARM?
Respuesta1
La razón por la que sus compilaciones fallan es porque Make está usando el vinculador de su plataforma (/usr/bin/ld) para vincular los archivos objeto que produce arm-linux-androideabi-gcc. Debe indicarle a configure que busque las herramientas correctas y luego intentar compilar nuevamente. También debes tener instalado el NDK de Android en algún lugar y apuntar NDK_ROOT a esa ubicación. Aquí hay un pequeño script que uso para compilar programas para un destino Android.
Me doy cuenta de que esta es una respuesta bastante tardía, pero espero que esto ayude a alguien de todos modos.
#!/bin/bash
unset CFLG CXXFLG LIBS CFLAGS LDFLAGS CXXFLAGS CPPFLAGS SYSROOT ALT_TOOLCHAIN DO_CONFIG NEWARGV PRINT_CONFIG HOSTARG OLDDIR NOHOST NO_ARGS
# Set default values here
STL="gnustl_shared"
ARCH="armeabi-v7a"
PLATFORM="android-15"
HOST="arm-none-linux"
CONFIG_SCRIPT="./configure"
CROSS_COMPILE="arm-linux-androideabi"
NDK_ROOT=${NDK_ROOT:-"/opt/android-ndk-r10e"}
PLAT_CHOICES=$(eval "echo -n android-{3,4,5,8,9,{12..19},21}")
ARCH_CHOICES="arm armeabi armeabi-v7a armeabi-v7a-hard"
STL_CHOICES=$(eval "echo -n gnustl_{static,shared} stlport_{static,shared} gabi++_{static,shared} c++_{static,shared}")
STL_DEFS="gnustl stlport gabi++ c++ libstdc++"
WARN="-Wformat -Werror=format-security -Werror"
PIC="-fpic -DPIC"
DEF_ARCH=$ARCH
SED="sed"
usage() {
echo "Usage: "
echo -n " `basename $0` [-Nhwe]"
echo "[-H host] [-I include] [-D def] [-U undef] [-L libdir]"
printf ' %-18s\n' \
"[-l lib] [-c conf_args] [-v gccver] [-a arch] [-b path]" \
"[-p platform] [-s cxx_stl] [-f script] [-P prefix]" \
"[-n nohost] [-d chdir] [-t target] [-x crossprefix]" \
"[VAR=VALUE...] [--<configure-option>...] "
echo
echo "Note: All unprocessed arguments are passed through to the configure script"
echo
echo "Options:"
printf ' %s, %-18s %s\n' "-a" "--arch" "specify the target arch (see note 2)"
printf ' %s, %-18s %s\n' "-b" "--toolchain-bin" "specify the location of an alternate toolchain to be added to \$PATH"
printf ' %s, %-18s %s\n' "-c" "--config-args" "args to pass through to the configure script, to avoid conflicts with this script's arg parser. (see note 2)"
printf ' %s, %-18s %s\n' "-d" "--chdir" "directory to change to before doing anything"
printf ' %s, %-18s %s\n' "-D" "--define" "list of symbols, as either -Dname=value, or -Dname, to be added to cflags as -D<sym> (see note 2)"
printf ' %s, %-18s %s\n' "-e" "--echo" "print configure args instead of executing command"
printf ' %s, %-18s %s\n' "-f" "--config-script" "name of the configure script to execute"
printf ' %s, %-18s %s\n' "-h" "--help" "show this help message"
printf ' %s, %-18s %s\n' "-H" "--host" "use an alternate host for configure script"
printf ' %s, %-18s %s\n' "-I" "--include" "list of directories to add to cflags as -I<dir> (see note 2)"
printf ' %s, %-18s %s\n' "-l" "--libs" "list of libraries to add to ldflags as -l<lib> (see note 2)"
printf ' %s, %-18s %s\n' "-L" "--libdir" "list of directories to add to ldflags as -L<dir> (see note 2)"
printf ' %s, %-18s %s\n' "-n" "--nohost" "omit the --host=<host> option when echoing commands or calling configure"
printf ' %s, %-18s %s\n' "-N" "--noargs" "omit all --options when echoing commands"
printf ' %s, %-18s %s\n' "-p" "--platform" "specify the android platform to target. may be <android-N> or just <N>, where N is the api level"
printf ' %s, %-18s %s\n' "-P" "--prefix" "specify the installation prefix. passed to configure as --prefix=<prefix>"
printf ' %s, %-18s %s\n' "-s" "--stl" "specify the standard c++ lib to use (see note 3)"
printf ' %s, %-18s %s\n' "-t" "--target" "specify the target to compile for with this option instead of --host; e.g. --target=build produces --build=<host>"
printf ' %s, %-18s %s\n' "-U" "--undefine" "list of symbols to undefine, added to cppflags as -U<sym> (see note 2)"
printf ' %s, %-18s %s\n' "-v" "--gccversion" "specify the version of gcc to use when targeting the android ndk. must be 4.8 or 4.9"
printf ' %s, %-18s %s\n' "-w" "--warn" "add compiler warning flags to cflags"
printf ' %s, %-18s %s\n' "-x" "--crossprefix" "prefix to use when cross compiling. default = arm-linux-androideabi"
printf ' %-22s %s\n' "--cflags" "flags to be added directly to the CFLAGS variable"
printf ' %-22s %s\n' "--ldflags" "flags to be added directly to the LDFLAGS variable"
printf ' %-22s %s\n' "--cxxflags" "flags to be added directly to the CXXFLAGS variable"
printf ' %-22s %s\n' "--cppflags" "flags to be added directly to the CPPFLAGS variable"
printf ' %-22s %s\n' "--sysroot" "change the compiler sysroot, added to CC and CXX as --sysroot=<arg>"
printf ' %-22s %s\n' "--pic" "add -fpic and -DPIC to cflags"
echo
printf ' %-38s\n' "Note 1:Mode may be one of the following: <armeabi,armeabi-v7a,armeabi-v7a-hard>"
printf ' %-38s\n' "and may be abbriviated as: <arm, armeabi, armhf, armv7a[-hard], armv7-a[-hard], armeabi-v7a[-hard]>"
printf ' %-38s\n' "Note 2:These options allow multiple arguments to be specified, either by specifying the option multiple times,"
printf ' %-38s\n' "or by using a list delimited by ':' , ';' , or ','"
printf ' %-38s\n' "Note 3:This must be one of <${STD_DEFS}>, to use a static version, add _static,"
printf ' %-38s\n' "otherwise the shared version is used. gnustl_shared is the default when this option is omitted. "
printf ' %-38s\n' "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>"
printf ' %-38s\n' "This is free software: you are free to change and redistribute it."
printf ' %-38s\n' "There is NO WARRANTY, to the extent permitted by law."
printf ' %-38s\n' "Copyright (C) 2015 Matt Johnson"
exit $1
}
error() {
echo -n "[Error]: " 2>&1
while [ "$#" != "0" ]; do
echo "$1"
shift
done
usage 1
}
exists() {
local args="$@"
local not_found=()
for arg in ${args}; do
local tmp_res=`${arg} 2>&1 >>/dev/null`
if [ "$?" == "127" ]; then
not_found+=("$arg")
else
local prog=`which $arg`
if [ -z "$prog" ]; then
not_found+=("$arg")
else
local progname=$(echo $arg|tr '[[:lower:]]' '[[:upper:]]')
eval "${progname}=\${prog}"
fi
fi
done
if [ "${#not_found[@]}" -gt "0" ]; then
local missing="${not_found[@]}"
error "Could not find these required program(s): [ $missing ]" "Make sure they are installed before running this script again"
fi
}
exists sed grep getopt expr mktemp
set_toolchain() {
TC_BIN="$1"; shift
TC_ROOT="$TC_BIN/.."
if [ -x "$TC_BIN/$CROSS_COMPILE-gcc" ]; then
ALT_TOOLCHAIN="$TC_BIN"
unset TC_BIN
else
error "Invalid toolchain specified at $TC_BIN."
fi
}
in_list() {
local k=$1; shift
local _list=$@
for _v in ${_list}; do
if [ "${_v}" == "${k}" ]; then
return 0
fi
done
return 1
}
set_platform() {
local API=$(${EXPR} "$1" : '^[^0-9]*\([[:digit:]]\{1,2\}\)$')
[ -z "$API" ] && error "Invalid platform: $1"
local plat="android-${API}"
if in_list ${plat} ${PLAT_CHOICES}; then
PLATFORM=${plat}
else
error "Invalid platform: $API"
fi
}
set_stl() {
local choice=$1
if [ "$choice" == "libstdc++" ]; then
STL=$choice
return
elif in_list $choice $STL_DEFS ; then
STL="${choice}_shared"
return
elif in_list $choice $STL_CHOICES ; then
STL="${choice}"
return
fi
error "Invalid value for --stl: $1" "Must be one of [ $STL_CHOICES ]"
}
set_arch() {
local arch_arg=$1
case "$arch_arg" in
arm)
ARCH=arm ;;
armeabi)
ARCH=armeabi ;;
armv7a?*|armeabi-v7a*|armv7-a*)
case "$arch_arg" in
*hard)
ARCH=armeabi-v7a-hard ;;
*)
ARCH=armeabi-v7a ;;
esac ;;
armhf)
ARCH=armeabi-v7a-hard ;;
*)
error "Invalid value for --arch: $1" "Must be one of [ $ARCH_CHOICES ]"
esac
}
add_args() {
local var=$1; shift
local args=$@
arglist=$(echo $args | tr ":;" " ")
eval ${var}+=\" \${arglist}\"
}
add_list() {
local item=$1 ; shift
local var=$1 ; shift
local flag=$1
inclist=$(echo $item | tr ":;" " ")
for i in ${inclist}; do
local _thisflag=`echo $i | ${SED} -E -e "s/^[-]?${flag}?(.*)/-${flag}\1/"`
eval ${var}+=\" \${_thisflag}\"
done
}
EXARGS=$(mktemp --tmpdir=/tmp argv-XXXXX.tmp)
LONGOPTS="help,noargs,nohost,warn,echo,pic,script:,crossprefix:,chdir:,target:,toolchain-bin:,prefix:,host:,stl:,arch:,platform:,gccversion:,config-args:,libdir:,cflags:,ldflags:,libs:,cxxflags:,cppflags:,include:,sysroot:,define:,undefine:"
OPTSTR="NhwenH:I:D:U:L:l:c:v:m:a:p:s:f:P:b:d:t:x:"
GETOPT=`which getopt`
TEMP=`${GETOPT} --longoptions ${LONGOPTS} --options ${OPTSTR} -n ndk-fix -- "$@" 2>${EXARGS}`
while read LINE; do
case "$LINE" in
*unrecognized*)
option=$(echo $LINE | ${SED} -r -e "s/^.+ '(--[^']+)'$/\1/")
add_args "NEWARGV" "$option"
;;
*)
opt_char=$(echo $LINE | ${SED} -r -e "s/^.+ '([^'])'$/-\1/")
echo "[Warning]: Ignoring invalid short option -- '$opt_char'"
;;
esac
done<$EXARGS
unset option opt_char
rm $EXARGS
eval set -- "$TEMP"
while true; do
case "$1" in
-h|--help)
usage
;;
-w|--warn)
CFLG+=" $WARN"
CXXFLG+=" $WARN"
;;
--pic)
add_args "CFLG" "$PIC"
add_args "CXXFLG" "$PIC"
;;
-H|--host)
HOST="$2" ; shift
;;
-N|--noargs)
NO_ARGS=1
;;
-t|--target)
HOSTARG="--$(${EXPR} "$2" : "^-\?-\?\(.\+\)\$")" ; shift
;;
-d|--chdir)
OLDDIR=$(pwd)
cd $2 ; shift
;;
-e|--echo)
PRINT_CONFIG=1
;;
-n|--nohost)
NOHOST=1
;;
-f|--script)
CONFIG_SCRIPT="$2"
DO_CONFIG=1 ; shift
;;
-P|--prefix)
add_args "NEWARGV" "--prefix=$2" ; shift
;;
-x|--crossprefix)
CROSS_COMPILE="$2" ; shift
;;
-b|--toolchain-bin)
set_toolchain "$2" ; shift
;;
-s|--stl)
set_stl "$2" ; shift
;;
-a|--arch)
set_arch "$2" ; shift
;;
-p|--platform)
set_platform "$2" ; shift
;;
-c|--config-args)
add_args "NEWARGV" "$2" ; shift
;;
-I|--include)
add_list "$2" "CFLG" "I" ; shift
;;
-L|--libdir)
add_list "$2" "LIBS" "L" ; shift
;;
-D|--define)
add_list "$2" "CFLG" "D" ; shift
;;
-l|--libs)
add_list "$2" "LIBS" "l" ; shift
;;
-U|--undefine)
add_list "$2" "CFLG" "U" ; shift
;;
--cflags)
add_args "CFLG" "$2" ; shift
;;
--ldflags)
add_args "LIBS" "$2" ; shift
;;
--cppflags)
add_args "CPPFLAGS" "$2" ; shift
;;
--cxxflags)
add_args "CXXFLG" "$2" ; shift
;;
--sysroot)
SYSROOT=$1 ; shift
;;
-v|--gccversion)
if [ "$2" == "4.9" ] || [ "$2" == "4.8" ]; then
TCVER="$2"
else
echo "Invalid argument to -v or --gccversion: <$2>"
echo "Must be either 4.8 or 4.9. defaulting to 4.8"
TCVER="4.8"
fi
shift
;;
--)
shift ; break
;;
*)
echo "Should not have gotten here."
echo "Error in parsing arguments -- Unexpected argument found before end-of-args: $1"
usage
finish
;;
esac
shift
done
TCVER=${TCVER:-4.8}
CXXVER=${TCVER:-4.8}
if [ -z "$ALT_TOOLCHAIN" ]; then
NDK=${NDK_ROOT}/toolchains/arm-linux-androideabi-${TCVER}/prebuilt/linux-$(uname -m)/bin
SYSROOT=${SYSROOT:-${NDK_ROOT}/platforms/${PLATFORM}/arch-arm}
else
NDK="$ALT_TOOLCHAIN"
SYSROOT=${SYSROOT:-/opt/sysroot}
fi
if [ -z "$NOHOST" ]; then
HOSTARG=${HOSTARG:---host=$HOST}
fi
declare -A cxxflag
cxxflag[armeabi]="-no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -frtti -fexceptions -O2 -g -DNDEBUG -fomit-frame-pointer -DANDROID "
cxxflag[armeabi-v7a]="-no-canonical-prefixes -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -frtti -fexceptions -O2 -g -DNDEBUG -fomit-frame-pointer -DANDROID "
cxxflag[armeabi-v7a-hard]="-no-canonical-prefixes -march=armv7-a -mfpu=vfpv3-d16 -mhard-float -D_NDK_MATH_NO_SOFTFP=1 -frtti -fexceptions -O2 -g -DNDEBUG -fomit-frame-pointer -DANDROID "
cxxflag[arm]=" -DANDROID -mandroid -fomit-frame-pointer"
declare -A cflag
cflag[arm]=" -DANDROID -mandroid -fomit-frame-pointer"
cflag[armeabi]="-no-canonical-prefixes -march=armv5te -msoft-float -O2 -g -DNDEBUG -fomit-frame-pointer -DANDROID "
cflag[armeabi-v7a]="-no-canonical-prefixes -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -O2 -g -DNDEBUG -fomit-frame-pointer -DANDROID "
cflag[armeabi-v7a-hard]="-no-canonical-prefixes -march=armv7-a -mfpu=vfpv3-d16 -mhard-float -D_NDK_MATH_NO_SOFTFP=1 -O2 -g -DNDEBUG -fomit-frame-pointer -DANDROID "
declare -A cxxinclude
cxxinclude[gnustl]="-I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/${TCVER}/include -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/${TCVER}/libs/${ARCH}/include -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/${TCVER}/include/backward"
cxxinclude[stlport]="-I${NDK_ROOT}/sources/cxx-stl/stlport/stlport -I${NDK_ROOT}/sources/cxx-stl/gabi++/include"
cxxinclude[stdc++]="-I${NDK_ROOT}/sources/cxx-stl/system/include"
cxxinclude[gabi++]="-I${NDK_ROOT}/sources/cxx-stl/gabi++/includexx/include -I${NDK_ROOT}/sources/cxx-stl/llvm-libc++abi/libcxxabi/include"
cxxinclude[c++]="-I${NDK_ROOT}/sources/cxx-stl/llvm-libc++/libcxx/include"
declare -A cxxlib
cxxlib[gnustl]="-L${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/${TCVER}/libs/${ARCH}"
cxxlib[gabi++]="-L${NDK_ROOT}/sources/cxx-stl/gabi++/libs/${ARCH}"
cxxlib[stlport]="-L${NDK_ROOT}/sources/cxx-stl/stlport/libs/${ARCH}"
cxxlib[stdc++]=" "
cxxlib[c++]="-L${NDK_ROOT}/sources/cxx-stl/llvm-libc++/libs/${ARCH}"
declare -A ldflag
ldflag[arm]="-lgcc -lc -lm -fpic"
ldflag[armeabi]="-fpic -no-canonical-prefixes -Wl,--no-undefined -Wl,-z,noexecstack -lgcc -lc -lm"
ldflag[armeabi-v7a]="-fpic -lgcc -no-canonical-prefixes -march=armv7-a -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,-z,noexecstack -lc -lm"
ldflag[armeabi-v7a-hard]="-fpic -lgcc -no-canonical-prefixes -march=armv7-a -Wl,--fix-cortex-a8 -Wl,--no-warn-mismatch -lm_hard -Wl,--no-undefined -Wl,-z,noexecstack -lc -lm"
CPPFLAGS+=" ${CFLG}"
CFLG+=" ${cflag[${ARCH}]}"
STL_BASE=${STL%_shared}
STL_BASE=${STL_BASE%_static}
CXXFLG+=" ${cxxflag[${ARCH}]} ${cxxinclude[${STL_BASE}]} ${cxxlib[${STL_BASE}]} -l${STL}"
CC="${CROSS_COMPILE}-gcc --sysroot=${SYSROOT}"
CXX="${CROSS_COMPILE}-g++ --sysroot=${SYSROOT}"
AR="${CROSS_COMPILE}-ar"
LD="${CROSS_COMPILE}-ld"
NM="${CROSS_COMPILE}-nm"
CPP="${CC} -E"
STRIP="${CROSS_COMPILE}-strip --strip-unneeded"
OBJDUMP="${CROSS_COMPILE}-objdump"
RANLIB="${CROSS_COMPILE}-ranlib"
LIBS+=" ${ldflag[${ARCH}]}"
prints() {
_str="$@"
echo "$_str"
echo "$_str" >>$LOG
}
LOG=$PWD/prepare.log
echo "Preparing source files for compilation on $HOST..." >$LOG
edit_line() {
regex=`echo $1`; shift
rfile=$1; shift
sed -i -r -e "$regex" $rfile 2>>$LOG 1>>$LOG
}
finish() {
if [ ! -z "$OLDDIR" ]; then
cd $OLDDIR
fi
exit 0
}
fix_makefile() {
mkfile=$1
cp $mkfile $mkfile.bak
HAS_CC=$(${GREP} -E '^CC[ ]?=.*' $mkfile)
if [ "${HAS_CC}X" == "X" ]; then
LINE=$(${GREP} -n -E '^[^#]+' $mkfile | head -n 1 | ${GREP} -o -E '^[0-9]+')
${SED} -i -r -e "$LINE iCC= " $mkfile
fi
edit_line "s:^(CC\s?=\s?).*:\1 ${CC} :" $mkfile
edit_line "s:^(AR\s?=\s?)[^ ]*:\1 ${AR} :" $mkfile
edit_line "s:^(CFLAGS|CCOPT)(\s?=\s?):\1\2 ${CFLG} :" $mkfile
edit_line "s:^(LDFLAGS\s?=\s?):\1 ${LIBS} :" $mkfile
edit_line "s:^(RANLIB\s?=\s?).*:\1 ${RANLIB} :" $mkfile
edit_line "s:^(CXX\s?=\s?).*:\1 ${CXX} :" $mkfile
edit_line "s:^(LD\s?=\s?)[^ ]*:\1 ${LD} :" $mkfile
edit_line "s:^(OBJDUMP\s?=\s?)[^ ]*:\1 ${OBJDUMP} :" $mkfile
edit_line "s:^(NM\s?=\s?)[^ ]*:\1 ${NM} :" $mkfile
edit_line "s:^(OBJDUMP\s?=\s?).*:\1 ${STRIP} :" $mkfile
edit_line "s:^(CPP\s?=\s?)[^ ]*:\1 ${CPP} :" $mkfile
}
custom_conf() {
SUBMK=$(find . -name Makefile -print)
for mk in ${SUBMK}; do
prints "Fixing makefile at: $mk..."
prints "Backup made at: $mk.bak"
fix_makefile $mk
done
}
add_once() {
if [ -n "$(echo $PATH | ${GREP} $NDK)" ]; then
PATH=${NDK}:${PATH}
export PATH NDK
fi
}
cat >$(pwd)/env.sh <<EOF
#!/bin/bash
NDK=${NDK_ROOT}/toolchains/arm-linux-androideabi-${TCVER}/prebuilt/linux-\$(uname -m)/bin
if [ -z "\$(echo \$PATH | fgrep \$NDK)" ]; then
PATH=\${NDK}:\${PATH}
export PATH NDK
fi
EOF
chmod 0755 env.sh
. env.sh
if [ -n "$PRINT_CONFIG" ]; then
if [ -n "$NO_ARGS" ]; then
unset HOSTARG NEWARGV
fi
echo CPPFLAGS=\"${CPPFLAGS}\" CFLAGS=\"${CFLG}\" CXXFLAGS=\"${CXXFLG}\" LDFLAGS=\"${LIBS}\" CC=\"${CC}\" CXX=\"${CXX}\" LD=\"${LD}\" AR=\"${AR}\" RANLIB=\"${RANLIB}\" NM=\"${NM}\" STRIP=\"${STRIP}\" CPP=\"${CPP}\" ${NEWARGV} $@ ${HOSTARG}
finish
fi
if [ -f "$CONFIG_SCRIPT" ] || [ -n "$DO_CONFIG" ]; then
$CONFIG_SCRIPT CPPFLAGS="${CPPFLAGS}" CFLAGS="${CFLG}" CXXFLAGS="${CXXFLG}" LDFLAGS="${LIBS}" CC="${CC}" CXX="${CXX}" LD="${LD}" AR="${AR}" RANLIB="${RANLIB}" NM="${NM}" STRIP="${STRIP}" CPP="${CPP}" $NEWARGV $@ $HOSTARG
echo "Make sure ${NDK} is in your \$PATH before running make."
echo "A script called env.sh has been created in the current directory. Sourcing it will make sure the toolchain is in your path"
if [ "$?" != "0" ]; then
echo "[ERROR]: Configure failed with return code: $?"
export CPPFLAGS="${CPPFLAGS}" CFLAGS="${CFLG}" CXXFLAGS="${CXXFLG}" LDFLAGS="${LIBS}" CC="${CC}" CXX="${CXX}" LD="${LD}" AR="${AR}" RANLIB="${RANLIB}" NM="${NM}" STRIP="${STRIP}" CPP="${CPP}"
fi
else
prints "No configure script found in current directory: $(pwd)"
echo "Type 'y' to attempt to modify any makefiles in this directory, and any other key to abort..."
echo -n "Continue?: "
read ANS
if [ "$ANS" == "y" ]; then
custom_conf
fi
fi
finish