Кросс-компиляция OpenSSH для Android

Кросс-компиляция OpenSSH для Android

Я работаю над компиляцией OpenSSH для Android на основеэтот ответ на Stack Overflow.

Вот что я уже сделал:

  • Сборка на базе Ubuntu 14.04 amd64.
  • apt-get install build-essential gcc-arm-linux-androideabi

Загрузите zlib, затем выполните:

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

Это не удается на makeэтапе:

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

Что я тут упускаю? Есть ли что-то еще, что нужно знать, чтобы иметь возможность собрать zlib?

Далее следует сборка 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

И снова на этом makeэтапе происходит сбой:

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

Похоже, снова та же проблема: невозможно прочитать записанный файл.

Я еще не дошел до финального этапа компиляции OpenSSH, но предполагаю, что сделаю это следующим образом:

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

Почему моя компиляция выше не удаётся для Zlib и OpenSSL при компиляции для arm-linux-androideabi? Как скомпилировать OpenSSH (в частности клиент и агент) для Android на ARM?

решение1

Причина, по которой ваши сборки не работают, заключается в том, что Make использует компоновщик вашей платформы (/usr/bin/ld) для компоновки объектных файлов, которые создает arm-linux-androideabi-gcc. Вам нужно указать configure искать правильные инструменты, а затем повторить попытку компиляции. У вас также должен быть установлен Android NDK где-то, и указать NDK_ROOT на это место. Вот небольшой скрипт, который я использую для компиляции программ для целевой платформы Android.

Я понимаю, что это довольно поздний ответ, но надеюсь, он кому-нибудь поможет.

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

Связанный контент