if [ "$1" == "clean" ] //$1 传入第一个参数
then
rm -rf ../Build // rm删除
rm -rf ../Conf/.cache
exit $? //exit 返回 //$?上一个命令的状态,没错为0,其他任何值表明有错误。
fi
set -e //这句之后遇到非零返回值,会直接退出,set +e 继续执行
shopt -s nocasematch //shopt -s 开启某个选项 nocasematch选项开启后,case或[[]]条件命令时,Shell以大小写不敏感的方式匹配模式
#[Damon Add Start]
var=$PWD //$PWD获取当前路径
file=${var##*/} //##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
//补充知识:#、## 表示从左边开始删除。一个 # 表示从左边删除到第一个指定的字符;两个 # 表示从左边删除到最后一个指定的字符。
%、%% 表示从右边开始删除。一个 % 表示从右边删除到第一个指定的字符;两个 % 表示从左边删除到最后一个指定的字符。
删除包括了指定的字符本身。
if [ ! -f "${var##*/}.fdf" ]; //如果 .fdf为常规文件,则为真[ -f /usr/bin/grep ]-L filename
//这里!表示不是常规文件
//文件判断参考 https://zhidao.baidu.com/question/322131711.html
then
if [ -f *".bak" ];//同级目录下是否有备份文件,有则删除
then
rm *.bak
fi
mv *.fdf $file.fdf //mv改名 //目录下所有文件改成当前路径pkg的名字
mv *.dsc $file.dsc
mv *.dec $file.dec
mv L*.inc $file.fdf.inc
PLATFORM_NAME=`grep "PLATFORM_NAME *=" $file.dsc|sed 's/^.*= *//g'|sed 's/\r//g'|sed 's/ //g'` //在dsc文件中grep 检索 平台名
//sed命令 sed 's/要被取代的字串/新的字串/g'
// ^匹配输入字符串的开始位置 第二个*本质上可以删除,.表达式 .* 的意思很好理解,就是单个字符匹配任意次,即贪婪匹配 整个程序意义:删除=号之前的字符
//sed 's/\r//g'删除换行 sed 's/ //g'删除空格
PLATFORM_NAME=`echo $PLATFORM_NAME`
sed -i "s/$PLATFORM_NAME/$file/" $file.dsc //sed -i 直接对文本文件进行操作 文件当中改平台名
sed -i '0,/Pkg/s///' $file.dsc //'0,/Pkg/s///'表示从0行开始匹配Pkg为止,/s表示然后删除
//参考 https://www.cnblogs.com/ctaixw/p/5860221.html
fi
BOARD_TYPE=`grep "BOARD_TYPE" $file.dsc|sed 's/^.*= *//g'|sed 's/\r//g'|sed 's/ //g'`
echo $BOARD_TYPE
if [ ! -e ".config" ];then //-e表示是否存在
cp -vf ../MipsPkg/Config/"$BOARD_TYPE.cfg" .config
fi
grep -v "^[[:blank:]]*#" .config | grep -v "^$" > ./.cfg //[[:blank:]]匹配空格或制表符
//-v 或 --invert-match : 显示不包含匹配文本的所有行
sed -i "s/DEFINE//g" ./.cfg //删除每行的DEFINE
CPUTYPE=`grep "CPU_TYPE" ./.cfg|sed 's/^.*= *//g'` //获取值给CPUYTYPE
BUILD_CPU_FREQ=`grep "CPU_FREQ" ./.cfg|sed 's/^.*= *//g'`
BUILD_MEM_FREQ=`grep "MEM_FREQ" ./.cfg|sed 's/^.*= *//g'`
BRIDGETYPE=`grep "SOUTH_BRIDGE" ./.cfg|sed 's/^.*= *//g'`
PLATFORMTYPE=`grep "PLATFORM_TYPE" ./.cfg|sed 's/^.*= *//g'`
BUILD_REDUNDANTBIOS=`grep "REDUNDANT_BIOS_ENABLE" ./.cfg|sed 's/^.*= *//g'`
if [[ $BUILD_REDUNDANTBIOS == TRUE ]];then
BUILD_REDUNDANTBIOS=1
else
BUILD_REDUNDANTBIOS=0
fi
BUILD_HARDWAREMONITOR=`grep "HARDWARE_MONITOR_ENABLE" ./.cfg|sed 's/^.*= *//g'`
if [[ $BUILD_HARDWAREMONITOR == TRUE ]];then
BUILD_HARDWAREMONITOR=1
else
BUILD_HARDWAREMONITOR=0
fi
CUSTON_UI=`grep "CUSTON_UI_ENABLE" ./.cfg|sed 's/^.*= *//g'`
CUSTON_SMBIOS=`grep "CUSTON_SMBIOS_ENABLE" ./.cfg|sed 's/^.*= *//g'`
rm .cfg
#[Damon Add End]
BUILD_BOARD_NAME=LS$CPUTYPE
PLATFORM_PATH=$PWD
echo PLATFORM_PATH:${PLATFORM_PATH}
# get xxxxx in LS3A4K_[xxxxx]Pkg
PROJECTNAME=${file%%Pkg*}
PROJECTNAME=${PROJECTNAME##*_}
# set up BIOS_TAG
BIOS_TAG_PREFIX=KL4
if [[ $CPUTYPE = "3A4000" ]];then
BIOS_TAG_CPU=1F
elif [[ $CPUTYPE = "3B4000" ]];then
BIOS_TAG_CPU=1G
fi
MANUFACTURER=LM
if [[ $PLATFORMTYPE = "Desktop" ]];then
WAY=1w //一个CPU
USAGE=pc
BIOS_TAG_CHASSIS=D
elif [[ $PLATFORMTYPE = "NoteBook" ]];then
WAY=1w
USAGE=nb //noteBook 笔记本
BIOS_TAG_CHASSIS=N
elif [[ $PLATFORMTYPE = "AllInOne" ]];then
WAY=1w
USAGE=aio //All in one(一体机)
BIOS_TAG_CHASSIS=A
elif [[ $PLATFORMTYPE = "DualServer" ]];then
WAY=2w
USAGE=server
BIOS_TAG_CHASSIS=S
elif [[ $PLATFORMTYPE = "QuadServer" ]];then
WAY=4w
USAGE=server
BIOS_TAG_CHASSIS=S
else
WAY=1w
USAGE=pc
BIOS_TAG_CHASSIS=E
fi
BIOSVERSION=V4.0.0
BOARDVERSION=V01
BUILD_BIOSINFO=Kunlun-$PROJECTNAME-$BIOSVERSION
if [ $BUILD_REDUNDANTBIOS -eq 1 ];then
echo ***Building Redundant BIOS***
BUILD_BIOSINFO=RedundantBIOS-$PROJECTNAME-$BIOSVERSION
fi
BUILD_BOARDINFO=$MANUFACTURER-LS$CPUTYPE-$BRIDGETYPE-$WAY-$BOARDVERSION-${USAGE}_${PROJECTNAME}
echo BIOSINFO : $BUILD_BIOSINFO
echo BOARDINFO : $BUILD_BOARDINFO
#GCC44
#export GCC44_MIPS_PREFIX=/usr/bin/mipsel-linux-gnu-
export GCC44_MIPS_PREFIX=/opt/gcc-4.4.7-o32/usr/bin/mipsel-redhat-linux-
#GCC49
#export GCC49_MIPS_PREFIX=/usr/bin/mips64el-loongson-linux-
export GCC44_MIPS64EL_PREFIX=/opt/gcc-4.4.0-pmon/bin/mipsel-linux- // export 命令用于设置或显示环境变量 export -p 查看环境变量
echo GCC49_MIPS_PREFIX:${GCC49_MIPS_PREFIX}
#
# Setup workspace if it is not set
#
if [ -z "$WORKSPACE" ] //检测字符串长度是否为0,为0返回 true
then
echo Initializing workspace
if [ ! -e `pwd`/edksetup.sh ] //当前路径不存在edksetup.sh进入父目录
then
# not very beautiful, but works...
cd ../
fi
# This version is for the tools in the BaseTools project.
# this assumes svn pulls have the same root dir
# export EDK_TOOLS_PATH=`pwd`/../BaseTools
# This version is for the tools source in edk2
export EDK_TOOLS_PATH=`pwd`/BaseTools
echo $EDK_TOOLS_PATH
source edksetup.sh BaseTools
else
echo Building from: $WORKSPACE
fi
for arg in "$@" //用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
do
if [[ $arg == tool ]]; //参数tool清除EDK_TOOLS_PATH
then
make -C $EDK_TOOLS_PATH clean
fi
done
if [ -z "$PLATFORMFILE" ]; then
PLATFORMFILE=${PLATFORM_PATH}/${var##*/}.dsc
fi
if [[ ! -f `which build` || ! -f `which GenFv` ]]; //which指令会在环境变量$PATH设置的目录里查找符合条件的文件。
then
# build the tools if they don't yet exist. Bin scheme
echo Building tools as they are not in the path
make -C $WORKSPACE/BaseTools
elif [[ ( -f `which build` || -f `which GenFv` ) && ! -d $EDK_TOOLS_PATH/Source/C/bin ]];
then
# build the tools if they don't yet exist. BinWrapper scheme
echo Building tools no $EDK_TOOLS_PATH/Source/C/bin directory
make -C $WORKSPACE/BaseTools
else
echo using prebuilt tools
fi
mkdir -p ./Build //创建Build目录 -p 确保目录名称存在,不存在的就建一个
# build CustomUi //复制项目界面文件到公共文件
if [[ $CUSTON_UI == TRUE ]];then
cp $PLATFORM_PATH/CustomUi/*.sd $WORKSPACE/KunlunPkg/BdsDxe/CustomUi/CustomUi.sd
cp $PLATFORM_PATH/CustomUi/*.uni $WORKSPACE/KunlunPkg/BdsDxe/CustomUi/CustomUi.uni
fi
# Build the uuid
uuidgen > ${WORKSPACE:-}/Build/Version.txt //uuidgen生成后输入Version.txt
TARGET=DEBUG
BUILD_TYPE=D //DEBUG的开头字母
for arg in "$@"
do
if [[ $arg == RELEASE || $arg == R ]]; //如果参数没有RELEASE,那么默认DEBUG
then
TARGET=RELEASE
BUILD_TYPE=R //RELEASE的开头字母
fi
done
COMPILER_VERSION=GCC44
for arg in "$@"
do
if [[ $arg == GCC44 ]]; //编辑器默认GCC44
then
COMPILER_VERSION=GCC44
fi
done
VERSIONARRY=(${BIOSVERSION//\./ })
BUILD_BIOS_NAME=$BIOS_TAG_PREFIX.$BIOS_TAG_CPU.$MANUFACTURER.$BIOS_TAG_CHASSIS.0${VERSIONARRY[1]}${VERSIONARRY[2]}
cd $PLATFORM_PATH //回到项目目录
make BIOS_NAME=$BUILD_BIOS_NAME \
PLATFORM_NAME=$BUILD_BOARD_NAME \
TARGET_TYPE=$BUILD_TYPE \
CPU_FREQ=$BUILD_CPU_FREQ \
MEM_FREQ=$BUILD_MEM_FREQ \
BIOSINFO=$BUILD_BIOSINFO \
BOARDINFO=$BUILD_BOARDINFO \
REDUNDANTBIOS=$BUILD_REDUNDANTBIOS\
HARDWAREMONITOR=$BUILD_HARDWAREMONITOR //编译makefile文件的同时传送参数
cp Include/Vers.h ../KunlunPkg/Include/
cd ../kxxlxxPkg/ //进入公共目录Pkg
if [ -e "BdsDxe/FixedBootOrder/FixedBootOrderDefault.sh" ]; then //存在xx.sh则执行
source ./BdsDxe/FixedBootOrder/FixedBootOrderDefault.sh //使Shell读入指定的Shell程序文件并依次执行文件中的所有语句
fi
cd ../ //返回上一级目录
DATE=$(date +%m/%d/%y) //mouth day year
TWO_DIGIT_YEAR=${DATE:6:2}
TWO_DIGIT_MONTH=${DATE:0:2}
TWO_DIGIT_DAY=${DATE:3:2}
BIOS_FW_NAME=$BUILD_BIOSINFO-$TWO_DIGIT_YEAR$TWO_DIGIT_MONTH$TWO_DIGIT_DAY$BUILD_TYPE
#
# Build
#
echo Running edk2 build for LSA3A
build -a MIPS -p $PLATFORMFILE -t $COMPILER_VERSION -b $TARGET -n 4 //UEFI工程编译命令build
if [[ $CUSTON_UI == TRUE ]];then
git checkout $WORKSPACE/KxxlxxPkg/BdsDxe/CustomUi/
fi
FD_DIR=Build/$file/$BUILD_BOARD_NAME/${TARGET}_$COMPILER_VERSION/FV
SIGN_DIR=KxxlxxPkg/SignBios
PEM_NAME=kxxlxxkey
CERT_NAME=kxxlxxcert
`openssl dgst -sha1 -sign $SIGN_DIR/$PEM_NAME.pem -out $FD_DIR/$BUILD_BOARD_NAME.sign $FD_DIR/$BUILD_BOARD_NAME.fd`
//openssl dgst 信息摘要 -sha1 摘要算法使用sha1 -sign 执行签名操作,后面指定私钥文件
//-out 指定输出文件,默认标准输出
`cat $FD_DIR/$BUILD_BOARD_NAME.sign >> $FD_DIR/$BUILD_BOARD_NAME.fd`
`cat $SIGN_DIR/$CERT_NAME.der >> $FD_DIR/$BUILD_BOARD_NAME.fd`
`mv $FD_DIR/$BUILD_BOARD_NAME.fd $FD_DIR/$BIOS_FW_NAME.fd`
echo FD file locate in ../$FD_DIR/$BIOS_FW_NAME.fd
exit $?