Cross-Kompilierung von OpenSSH für Android

Cross-Kompilierung von OpenSSH für Android

Ich arbeite an der Kompilierung von OpenSSH für Android basierend aufdiese Antwort bei Stack Overflow.

Folgendes habe ich bisher getan:

  • Basiert auf Ubuntu 14.04 amd64.
  • apt-get install build-essential gcc-arm-linux-androideabi

Laden Sie zlib herunter und führen Sie dann Folgendes aus:

cd zlib-1.2.8
./configure --prefix=/vagrant/build
make CC=arm-linux-androideabi-gcc
make install

Dies schlägt beim makeSchritt fehl:

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

Was übersehe ich hier? Gibt es noch etwas, das man wissen muss, um zlib erstellen zu können?

Als nächstes folgt im Prozess die Erstellung von 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

Dies schlägt erneut bei folgendem makeSchritt fehl:

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

Auch hier scheint das gleiche Problem vorzuliegen: Die geschriebene Datei kann nicht gelesen werden.

Ich habe es noch nicht bis zum letzten Schritt der Kompilierung von OpenSSH geschafft, aber ich gehe davon aus, dass ich es so machen würde:

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

Warum schlägt meine obige Kompilierung für Zlib und OpenSSL fehl, wenn ich sie kompiliere arm-linux-androideabi? Wie kann ich OpenSSH (insbesondere den Client und den Agenten) für Android auf ARM kompilieren?

Antwort1

Der Grund für das Fehlschlagen Ihrer Builds liegt darin, dass Make den Linker Ihrer Plattform (/usr/bin/ld) verwendet, um die von arm-linux-androideabi-gcc erstellten Objektdateien zu verknüpfen. Sie müssen configure anweisen, nach den richtigen Tools zu suchen, und dann erneut versuchen, zu kompilieren. Sie sollten auch irgendwo Android NDK installiert haben und NDK_ROOT auf diesen Speicherort verweisen. Hier ist ein kleines Skript, das ich verwende, um Programme für ein Android-Ziel zu kompilieren.

Mir ist klar, dass dies eine ziemlich späte Antwort ist, aber ich hoffe, dass sie trotzdem jemandem hilft.

#!/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

verwandte Informationen