基于UEFI的build.sh分析

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 $?

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值