自动搭建编译环境脚本研究 新唐SDK中脚本为例

仔细阅读了新唐的nuc972 SDK所带的自动搭建编译环境的脚本,给这个脚本加了相应的注释。看起来脚本还是比较简单的。

具体对改程序的解释,请看程序中所加的注释内容:

#!/bin/bash
# Copyright (c) Nuvoton Tech. Corp. All rights reserved.
# Description:  Nuvoton Linux platform toolchain install script
# Version:      2014-08-15      first release version

# 判断是否是root用户的方法
ROOT_UID=0
if [ "$UID" -ne "$ROOT_UID" ] ;then
    echo 'Sorry, you are not root !!'
    exit 1
fi

ARM_TOOL_ROOT="/usr/local"
ARM_TOOL_NANE="arm_linux_4.8"
ARM_TOOL_PATH="$ARM_TOOL_ROOT/$ARM_TOOL_NANE"
KERNEL_VER="linux-3.10.x.tar.gz"

NO_TOOL=0
# -d 表示判断是否有这个目录存在
if [ -d $ARM_TOOL_PATH ]; then
        echo "The folder \"$ARM_TOOL_PATH\" is already existed, continue the tool chain installation?(Y/N)"
        INSTALL=1
        while [ $INSTALL == 1 ]
        do
                read install    # 读用户的输入是yes 或者no
                case "$install" in
                [yY]|[yY][eE][sS] )
                        INSTALL=0
                        ;;
                [nN]|[nN][oO] )
                        echo "Skip toolchain installation"
                        INSTALL=2
                        NO_TOOL=1
                        ;;
                * )
                        echo "Please type yes or no!"
                        ;;
                esac
        done
        if [ $NO_TOOL == 0 ]; then
                echo "Do you want to remove this folder first?(Y/N)"
                REMOVE=1
                while [ $REMOVE == 1 ]
                do
                        read remove
                        case "$remove" in
                        [yY]|[yY][eE][sS] )
                                echo "Now deleteing the folder \"$ARM_TOOL_PATH\"..."
                                rm -rf $ARM_TOOL_PATH
                                REMOVE=0
                                ;;
                        [nN]|[nN][oO] )
                                echo "This installation will overwirte folder \"$ARM_TOOL_PATH\"!"
                                REMOVE=0
                                ;;
                        * )
                                echo "Please type yes or no!"
                                ;;
                        esac
                done
        fi
fi

if [ $NO_TOOL == 0 ]; then
        echo "Now installing $ARM_TOOL_NANE toolchain to $ARM_TOOL_ROOT"
        echo 'Please wait for a while... '
        mkdir -p $ARM_TOOL_ROOT
        tar --directory=$ARM_TOOL_ROOT -zxf $ARM_TOOL_NANE.tar.gz& #后台解压的指定目录下
        pid=`echo $!`    # 最后运行程序的pid
        str="| / - \\"    # 
        count=1
        while [ -d /proc/$pid ]  # 有前边tar的pid存在,证明还没有解压完。
        do
                if [ $count == 5 ]; then
                        count=1
                fi
				# '\r' 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖;
				# 把前边的字符串每次输出一个,count=1 输出 |  等于2 就输出 -  一次类推。
                echo -e -n "\r"`echo $str | awk '{print $'$count'}'`  # -e 激活转译字符;-n 不换行输出
				# 把count的值加1了
                count=`expr $count + 1`
				# 睡眠1秒   sleep 1m 是一分钟   sleep 1h 是1小时。
                sleep 1
        done
		# 改变文件的拥有者和群组,冒号前后是拥有者和群组。
        chown root:root -R $ARM_TOOL_PATH  
        echo -e -n '\r'
fi

echo "Now setting toolchain environment"
PROFILE=/etc/profile
NVTFILE=/etc/profile.d/nvt_arm_linux.sh
TMPFILE=`mktemp -q /tmp/$0.XXXXXX`
# $? 上个命令的退出状态  返回0表示执行成功了
if [ $? -ne 0 ]; then
        echo "$0: Can't create temp file, exiting..."
        exit 1
fi

# Check toolchain environment setting in PROFILE
# -d 将profile中的 \r 删掉
# -t 把\n转换为\r
# sed 从第一行到末尾所有行,把所有的\ 替换为空,意思为把\删除掉。
# tr -t 再把所有\n 替换\r .
# grep 搜索PATH= 那一样
# sed 将第一行到结尾行的PATH=删掉
# tr -t 用:替换 \n
REC=$(cat $PROFILE|tr -d '\r'|tr -t '\n' '\r'|sed '1,$s/\\//g' |tr -t '\r' '\n'|grep "PATH="|sed '1,$s/PATH=//g'|tr -t '\n' ':')
# NF 打印出用:做分隔符有多少列。
NUM=$(echo $REC|awk -F: 'END {print NF}')
i=1
RES=0
# 测试i只是否比NUM小,如果不小了就跳出循环
while (test $i -le $NUM)
do
        # 把冒号分隔的PATH值,一个一个出来进行比较
        TMP=$(echo $REC | awk -F: "{print \$$i}")
        if [ "$TMP" = "$ARM_TOOL_PATH/bin" ]; then
                RES=1
        elif [ "$TMP" = "$ARM_TOOL_PATH/bin/" ]; then
                RES=1
        fi
        i=`expr $i + 1`
done

# Check toolchain environment setting in NVTFILE
if [ $RES == 0 ]; then
        if [ -f $NVTFILE ]; then
				# 行首有0个或者任意个空格 ^表示以什么开头,[ ]表示一个空格,* 表示前边的字符出现0或者任意次数。
				# 整体意思是前边可能有任意个空格,也可能没有空格。
				# profile里没有,但是脚本里有
                cat $NVTFILE | grep "^[ ]*export PATH=$ARM_TOOL_PATH/bin" > /dev/null
                if [ $? == 0 ]; then
                        RES=1
                fi
        fi
fi
# 表示在profile 或者脚本里找到了工具链的环境变量了。
if [ $RES == 1 ]; then
        echo > /dev/null
else
        if [ -f $NVTFILE ]; then
                cat $NVTFILE | grep  "^[ ]*export " > /dev/null
                if [ $? == 0 ]; then
                        ARM_TOOL_PATH_TMP=`echo $ARM_TOOL_PATH | sed -e 's/\//\\\\\//g'`
                        cat $NVTFILE | grep  "^[ ]*export " | grep "$ARM_TOOL_PATH/bin" > /dev/null
                        if [ $? == 0 ]; then
								# 把环境工具链变量 冒号之前全部删除
                                sed -e 's/'$ARM_TOOL_PATH_TMP'\/bin[/]*://' $NVTFILE > $TMPFILE
								# 用处理过的覆盖原来的脚本文件
                                cp -f $TMPFILE $NVTFILE
                        fi
						# 前边将其删掉,这里有放在PATH的最前边了
                        sed -e 's/PATH=/PATH='$ARM_TOOL_PATH_TMP'\/bin:/' $NVTFILE > $TMPFILE
                        cp -f $TMPFILE $NVTFILE
                        rm -f $TMPFILE
                else
						# 没找到就直接写进去。
                        echo 'export PATH='$ARM_TOOL_PATH'/bin:$PATH' >> $NVTFILE
                fi
        else
                echo '## Nuvoton toolchain environment export' >> $NVTFILE
                echo 'export PATH='$ARM_TOOL_PATH'/bin:$PATH' >> $NVTFILE
                chmod +x $NVTFILE
        fi
fi

echo "Installing $ARM_TOOL_NANE toolchain successfully"

echo "Install rootfs.tar.gz, applications.tar.gz, uboot.tar.gz and $KERNEL_VER"
echo 'Please enter absolute path for installing(eg:/home/<user name>) :'
read letter
# 判断是否存在用户目录,不存在就创建。
if [ -d $letter ] ;then
        echo ''$letter' has existed';
else
        echo 'Create '$letter' ';
        mkdir $letter;
        if [ -z $SUDO_USER ];then
                chown -R $USER:$USER $letter;
        else
                chown $SUDO_USER:$SUDO_USER $letter;
        fi
fi

# 如果存在了问用户怎么处理;如果不存在就创建一个。
if [ -d $letter/nuc970bsp ];then
        echo ''$letter'/nuc970bsp/ existed, (o)verwite, (r)emove or (a)bort?[y/n]';
        read remove;
        case "$remove" in
        [oO] )
                echo "Overwrite $letter/nuc970bsp folder"
                ;;
        [rR] )
                echo "Remove $letter/nuc970bsp folder"
                rm -rf $letter/nuc970bsp/*;
                ;;
        [aA] )
                echo 'Abort installation process';
                ;;
        * )
                echo 'Abort installation process';
                ;;
        esac
else
        mkdir $letter/nuc970bsp;
fi
# 解压所有目录
echo 'Please wait for a while, it will take some time';
tar --directory=$letter/nuc970bsp -z -x -f rootfs.tar.gz;
tar --directory=$letter/nuc970bsp -z -x -f rootfs_48.tar.gz;
tar --directory=$letter/nuc970bsp -z -x -f rootfs_tomato.tar.gz;
tar --directory=$letter/nuc970bsp -z -x -f applications.tar.gz&
tar --directory=$letter/nuc970bsp -z -x -f uboot.tar.gz&
pid=`echo $!`
str="| / - \\"
count=1
# 等待解压完成,原理同上边的代码一样。
while [ $? == 0 ]
do
        if [ $count == 4 ]; then
                count=1
        fi
		# \r 清除前一次打印出来的提示符
        echo -e -n '\r'`echo $str|awk '{print $'$count'}'`
        count=`expr $count + 1`
        sleep 1
        ps aux|awk '$2=='$pid' {print $0}'|grep $pid > /dev/null
done
tar --directory=$letter/nuc970bsp -z -x -f image.tar.gz;
tar --directory=$letter/nuc970bsp -z -x -f $KERNEL_VER&
pid=`echo $!`
str="| / - \\"
count=1
while [ $? == 0 ]
do
        if [ $count == 4 ]; then
                count=1
        fi
        echo -e -n '\r'`echo $str|awk '{print $'$count'}'`
        count=`expr $count + 1`
        sleep 1
        ps aux|awk '$2=='$pid' {print $0}'|grep $pid > /dev/null
done

find $letter -type d|xargs chmod 755
if [ -z $SUDO_USER ];then
        chown -R $USER:$USER $letter/nuc970bsp;
else
        chown -R $SUDO_USER:$SUDO_USER $letter/nuc970bsp;
fi
echo -e '\rNUC970 BSP installation complete'

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值