AndroidでOpenSSHをコンパイルしています。スタックオーバーフローに対するこの回答。
これまで私がしたことは次のとおりです。
- 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
? ARMでAndroid用のOpenSSH(特にクライアントとエージェント)をどのようにコンパイルしますか?
ベストアンサー1
ビルドが失敗する理由は、Makeがプラットフォームのリンカー(/usr/bin/ld)を使用してarm-linux-androideabi-gccによって生成されたオブジェクトファイルをリンクするためです。正しいツールを見つけて再コンパイルを試みるように構成に指示する必要があります。また、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