仔细阅读了新唐的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'