1)编译脚本传入编译器名称,后续configure.in根据编译器名称判断是否添加宏,Makefile.am文件根据configure.in中是否定义宏进行编译选项等选择配置。
sh test.sh -c aarch64_be-linux-gnu-gcc
#!/bin/sh
#set -e
#set -x
export PATH=/root/tools/hcc-aarch64_be-linux/install/bin:$PATH
export CFLAGS=-g
##1)environment
workdir=`pwd`
srcdir=${workdir}
builddir=${workdir}/build_test
installdir=${workdir}/artifacts/install
help()
{
printf "Usage:%s:[-h host] [-t target] [-p prefix] \n" $0;
printf "Example:\n"
printf "\t ./test.sh -c mingw32-gcc\n"
printf "\t ./test.sh -c aarch64_be-linux-gcc\n"
}
if [$# -eq 0];then
help;
exit 1;
fi
while getopts c:? name
do
case $name in
c)
COMPILER="OPTARG";
HOST=`${COMPILER} -dumpmachine`;
TARGET=`${COMPILER} -dumpmachine`;
;;
?)
help;
exit 2;
;;
esac
done
case ${COMPILER} in
aarch64_be-linux-gnu-gcc)
PREFIX=${installdir}/
;;
mingw32-gcc)
PREFIX=${installdir}/
esac
mkdir -p ${builddir}/install
find ${srcdir} -iname 'configure' -exec chmod +x {} \;
package=hello
cd ${srcdir}
autoreconf -i -f
mkdir -p ${builddir}/${package}
cd ${builddir}/${package}
${srcdir}/configure \
--target=${TARGET} --host=${HOST} \
--prefix=${builddir}/install
##此处没有make,当prefix指定的目录有生成的目标文件时,make install不会重新编译
make -j20 install
#2) expat
##开源项目,为了支持aarch64_be-linux-gnu-gcc,expat-2.1.0中config.sub,configu.guss替换为expat-2.2.0中的文件
package=expat-2.1.0
if [${COMPILER} = "aarch64_be-linux-gnu-gcc"];
then
cd ${expatdir}
aclocal
autoconf
cp ${expatdir}/conftools/config.sub_2 ${expatdir}/conftools/config.sub
cp ${expatdir}/conftools/config.guess_2 ${expatdir}/conftools/config.guess
fi
mkdir -p ${builddir}/${package}
cd ${builddir}/${package}
./configure --prefix=${builddir}/install \
--target=${TARGET} --host=${HOST}
make -j20 install
===========================
configure.in:
AM_CONDITIONAL(CROSS_COMPILE_VERSION,[test x“$target_alias” == xarmeb-linux-gnueabi] || [test x“$target_alias” == xaarch64_be-linux-gnu])
Makefile.am中:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCE=hello.c
if CROSS_COMPILE_VERSION
hello_CFLAGS=-Wall -g -fPIC
else
hello_CFLAGS=-Wl,-no-undefined-avoid-version
endif
================
#makefile.am中根据编译脚本的宏定义进行分支处理
bin_PROGRAMS=test
#ifeq和(FIND,STR)之间必须得有个空格同时,ifeq,else,endif必须是缩进
ifeq ($(findstring -DHHH,$(CFLAGS)),-DHHH)
test_SOURCES = 1.c 2.c define_h.c
else
test_SOURCES = 1.c 2.c define.c
#endif