交叉编译OPENSSH(二)

上一节交叉编译OPENSSH(一)中编译openssh的时候,用到了几个脚本,如下所示:

root@inspur:/home/liufei/github/shell/openssh/compressed# ls -l
total 5608
-rw-r--r-- 1 root root  967395 1123 14:38 openssh-4.6p1.tar.gz
-rw-r--r-- 1 root root 4179422 1123 14:38 openssl-0.9.8l.tar.gz
-rwxr-xr-x 1 root root    1163 1123 14:38 startWork.sh-openssh
-rwxr-xr-x 1 root root     293 1123 14:38 startWork.sh-openssl
-rwxr-xr-x 1 root root     547 1123 14:38 startWork.sh-zlib
-rwxr-xr-x 1 root root    1819 1123 14:38 uncompress.sh
-rw-r--r-- 1 root root  571091 1123 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

你可能感兴趣的:(shell)