Compilación cruzada de OpenSSH para Android

Compilación cruzada de OpenSSH para Android

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 makepaso:

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 makepaso:

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

información relacionada