上一节交叉编译OPENSSH(一)中编译openssh的时候,用到了几个脚本,如下所示:
root@inspur:/home/liufei/github/shell/openssh/compressed# ls -l
total 5608
-rw-r--r-- 1 root root 967395 11月 23 14:38 openssh-4.6p1.tar.gz
-rw-r--r-- 1 root root 4179422 11月 23 14:38 openssl-0.9.8l.tar.gz
-rwxr-xr-x 1 root root 1163 11月 23 14:38 startWork.sh-openssh
-rwxr-xr-x 1 root root 293 11月 23 14:38 startWork.sh-openssl
-rwxr-xr-x 1 root root 547 11月 23 14:38 startWork.sh-zlib
-rwxr-xr-x 1 root root 1819 11月 23 14:38 uncompress.sh
-rw-r--r-- 1 root root 571091 11月 23 14:38 zlib-1.2.8.tar.gz
root@inspur:/home/liufei/github/shell/openssh/compressed#
编译openssh依赖zlib和openssl,所以:
startWork.sh-openssh:编译openssh用
startWork.sh-openssl:编译openssl
startWork.sh-zlib:编译zlib
uncompress.sh:脚本入口
下面将逐一分析各脚本功能:
1、uncompress.sh
脚本功能:
1、将指定文件夹下的.tar.gz包解压出来
2、将对应的编译脚本复制到解压后的源文件中
3、编译和安装,等待完成即可。
内容如下:
#!/bin/sh
#wget http://openbsd.hk/pub/OpenBSD/OpenSSH/portable/openssh-4.6p1.tar.gz
#wget http://down1.chinaunix.net/distfiles/openssl-0.9.8l.tar.gz
#wget https://busybox.net/downloads/busybox-1.25.1.tar.bz2
echo "uncompress start"
if [ $# != 4 ];
then
echo "you must input the install place and toolchains, eg. ./uncompress.sh `pwd` ../source /root/openssh mipsel-linux"
exit 1
fi
tarplace=$1
srcplace=$2
installplace=$3
toolchains=$4
echo "tarplace is $tarplace"
echo "srcplace is $srcplace"
echo "installplace is $installplace"
echo "toolchains is $toolchains"
#查找当前文件中所有的压缩包
for tarfile in ` find $tarplace -name "*.gz" -o -name "*.bz2"`;do
echo "================================================================================"
echo "================================================================================"
echo "================================================================================"
#解压到指定的目录下
echo "tarfile:$tarfile"
tar -xvf $tarfile -C $srcplace
#获取文件名openssl-0.9.8l.tar.gz
filename=${tarfile##*/}
#从文件名openssl-0.9.8l.tar.gz中提取出解压后的目录openssl-0.9.8l
dstpath=`echo $filename | sed 's#\(^.*\)\.tar.*$#\1#g'`
echo "dstpath:$dstpath"
#copy startWork.sh to source dir to compile
set -x
#从文件名openssl-0.9.8l中提取出关键字openssl,用于复制对应的startWork.sh-openssl到解压后的目录openssl-0.9.8l下
key=`echo $dstpath | awk -F"-" '{print $1}'`
echo "key:$key"
cp startWork.sh-$key $srcplace/$key*
cd -
set +x
echo "*********************************************************************************"
echo "*********************************************************************************"
echo "*********************************************************************************"
done
echo "wait 3s"
sleep 3
#run startWOrk.sh
#编译zlib
cd $srcplace/zlib*
./startWork.sh-zlib $installplace $toolchains
cd -
#编译openssl
cd $srcplace/openssl*
./startWork.sh-openssl $installplace $toolchains
cd -
#编译openssh
cd $srcplace/openssh*
./startWork.sh-openssh $installplace $toolchains
cd -
echo "finished"
2、startWork.sh-zlib
脚本功能:
1、配置zlib,并修改工具链
2、编译和安装,等待完成即可。
内容如下:
#!/bin/sh
if [ $# != 2 ];
then
echo "you must input the install place and toolchains, eg. ./startWork.sh /tmp mipsel-linux"
exit 1
fi
place=$1
toolchains=$2
echo "place is $place, toolchains is $toolchains"
#先配置,生成Makefile
./configure --prefix=$place
#修改Makefile,将工具链修改为交叉编译后的工具链
cat Makefile | sed "s/CC=gcc/CC=$toolchains-gcc/g" | sed "s/AR=ar/AR=$toolchains-ar/g" | sed "s/CPP=gcc -E/CPP=$toolchains-gcc -E/g" | sed "s/LDSHARED=gcc/LDSHARED=$toolchains-gcc/g" > Makefile.tmp
#生成patch文件
diff -Nura Makefile Makefile.tmp > ./Makefile.patch
#应用patch,修改原Makefile文件
patch -p0 < ./Makefile.patch
make
make install
3、startWork.sh-openssl
功能:
编译openssl,这个比较常规,没啥好说的
内容如下:
#!/bin/sh
if [ $# != 2 ];
then
echo "you must input the install place and toolchains, eg. ./startWork.sh /tmp mipsel-linux"
exit 1
fi
place=$1
toolchains=$2
echo "place is $place, toolchains is $toolchains"
./Configure --prefix=$place os/compiler:$toolchains-gcc
make
make install
4、startWork.sh-openssh
脚本功能:
1、根据编译错误打patch
2、应用patch,编译openssh
脚本内容:
#!/bin/sh
if [ $# != 2 ];
then
echo "you must input the install place and toolchains, eg. ./startWork.sh /tmp mipsel-linux"
exit 1
fi
place=$1
toolchains=$2
echo "place is $place, toolchains is $toolchains"
#配置openssh
./configure --prefix=$place --host=$toolchains --with-libs --with-zlib=$place --with-ssl-dir=$place --disable-etc-default-login CC=$toolchains-gcc AR=$toolchains-ar
#在编译时会遇到三个错误
#第一个是strip导致,将其选项删除即可
#第二个编译生成ssh-keygen后,其会自动运行,由于为交叉编译器,当前无法运行,修改方法是将运行ssh-keygen的判断条件修改为false,这样跳过执行
#第三个与第二个类似,也是编译结束后会调用check-config,这里直接将其注释,在最前面加上‘#’
#fix compiling error:strip: Unable to recognise the format of the input file `/root/openssh/bin/ssh'
#cat Makefile | sed "s/STRIP_OPT=-s/STRIP_OPT=/g" > Makefile.tmp
#fix /bin/sh: line 4: ./ssh-keygen: cannot execute binary file: Exec format error,make this invalid, create it manual.
#cat Makefile | sed 's#-z "$(DESTDIR)#-b "$(DESTDIR)"#g'
#fix make: [check-config] Error 126 (ignored)
#cat Makefile | sed 's@\-\$(DESTDIR)\$(sbindir)/sshd -t@#\-\$(DESTDIR)\$(sbindir)/sshd -t@g'>liufei
cat Makefile | sed "s/STRIP_OPT=-s/STRIP_OPT=/g" | sed 's#-z "$(DESTDIR)"#-b "$(DESTDIR)"#g' | sed 's@\-\$(DESTDIR)\$(sbindir)/sshd -t@#\-\$(DESTDIR)\$(sbindir)/sshd -t@g' > Makefile.tmp
diff -Nura Makefile Makefile.tmp > ./Makefile.patch
patch -p0 < ./Makefile.patch
make
make install