Shell 脚本 - 自动拉取GIT代码+编译3518EV200固件代码

一、前言

公司的固件开发人员经常用本机的代码编译打包文件,然后把编译好的固件发给硬件测试人员,经常出现开发人员不及时提交代码的问题。为了加强代码管控和规范化管理,最近搭了一个给硬件测试人员使用的服务器, 写了一个脚本文件用于自动拉取GIT上的固件代码,然后自动编译并打包。

二、以前的代码

由于是做物联网项目,公司的流量卡有分定向流量卡和普通流量卡,定向流量卡只能访问一个固定的内网地址,普通流量卡就类似我们手机中的普通上网卡,什么网站都可以访问。

以前编译打包文件时,开发人员通过修改代码中的__VPN_SIM__和FirmVer这2个参数来控制编译出的固件是什么版本号和区分流量卡的,部分代码如下:

//版本号定义
#ifdef __VPN_SIM__
	#define   FirmVer                  "V005"
#else
	#define   FirmVer                  "P028"
#endif

//服务器URL定义
#ifdef __VPN_SIM__
  #define HOMEPAGE        "http://192.168.0.125:80"
#else
  #define HOMEPAGE        "http://www.xxx.cn:80"  //正式服务器
  //#define HOMEPAGE        "http://test.xxx.cn:8080/"  //测试服务器
#endif

三、改造的过程

3.1 改造的思路

执行脚本的指令

./buildFireware.sh P001

或者

./buildFireware.sh V001

脚本的输入参数就1个:

  • 参数1 -- 固件的版本号 

在buildFireware.sh脚本中调用make命令执行Makefile中的编译指令时,直接传入固件版本号来代替代码中的FirmVer,同时在shell脚本中通过<版本号>的第一个字符是V还是P自动控制HOMEPAGE,不需要开发和测试人员更改代码就可以灵活输出不同的固件版本。

3.2 改造的C语言代码

只是加多了一个#ifndef FirmVer和#endif

//版本号定义
#ifndef FirmVer
	#ifdef __VPN_SIM__
		#define   FirmVer                  "V005"
	#else
		#define   FirmVer                  "P028"
	#endif
#endif

//服务器URL定义
#ifdef __VPN_SIM__
  #define HOMEPAGE        "http://192.168.0.125:80"
#else
  #define HOMEPAGE        "http://www.xxx.cn:80"  //正式服务器
  //#define HOMEPAGE        "http://test.xxx.cn:8080/"  //测试服务器
#endif

3.3 改造的Makefile

只是在CFLAGS中加多 $(ZYT_VER),ZYT_VER通过shell脚本传入给该Makefile

3.4 buildFireware.sh的内容

BuildVersion=$1
BuildItem=$2
BuildTime=$(date '+%Y%m%d%H%M%S')
DIR_OUTPUT=/zyt/liteos-HI3518ESV200-$BuildVersion-$BuildTime
DIR_FIREWARE_CODE=/arm/ParkerEtc/jv_code_sdk_park
DIR_FILESYSTEM=/arm/liteos_hi3518EV200_park
VersionType=${BuildVersion: 0: 1}
VersionLen=${#BuildVersion}

if [ -z "$BuildVersion" ]; then
  echo -e "\033[41;33m Please enter the version number you want to compile \033[0m"
  exit
fi
 
function CheckDir()
{
	[ -d $1 ] || mkdir -p $1
}

function gitGitFile()
{
	CodeDir="/arm"
	
	if [ -d "${CodeDir}" ]; then
		cd $CodeDir
		git pull
	else
		git clone --progress -v "http://<Git用户名>:<Git密码>@<GitLib网址>/Michael/Parker_ETC.git" $CodeDir
	fi
}

echo -e "\033[42;37m VersionType = [$BuildVersion,$VersionType,${#BuildVersion}] \033[0m"

if [ $VersionLen -lt 4 ]; then
  echo -e "\033[41;33m The version number must be longer than 4 bits \033[0m"
  exit
fi

if [ "P" == "$VersionType" ] ; then
	gitGitFile
	cd $DIR_FIREWARE_CODE
	CheckDir $DIR_FIREWARE_CODE/bin
	make clean
	make ZYT_VER=-DFirmVer=\\\"$BuildVersion\\\"
	echo -e "\033[42;37m fireware is finished  \033[0m"
	
	cd $DIR_FILESYSTEM
	CheckDir $DIR_FILESYSTEM/fs_park/config
	CheckDir $DIR_OUTPUT
	
	./mk-update.sh	${DIR_OUTPUT} DQPPARK $DIR_FIREWARE_CODE/dqp_main fs_park boot_emmc
	echo -e "\033[42;37m $BuildVersion is finished, files in $DIR_OUTPUT \033[0m"
elif [ "V" == "$VersionType" ] ; then
	gitGitFile
	cd $DIR_FIREWARE_CODE
	CheckDir $DIR_FIREWARE_CODE/bin
	make clean
	make ZYT_VER="-DFirmVer=\\\"$BuildVersion\\\" -D__VPN_SIM__"
	echo -e "\033[42;37m fireware is finished  \033[0m"
	
	cd $DIR_FILESYSTEM
	CheckDir $DIR_FILESYSTEM/fs_park/config
	CheckDir $DIR_OUTPUT
	./mk-update.sh	${DIR_OUTPUT} DQPPARK $DIR_FIREWARE_CODE/dqp_main fs_park boot_emmc
	echo -e "\033[42;37m $BuildVersion is finished, files in $DIR_OUTPUT \033[0m"
else
	echo -e "\033[41;33m Please enter the version number begun with P or V \033[0m"
fi

3.5 设置指令的别名

在~/.bashrc中加入一条alias命令,然后就可以执行mk P001了,该命令可以将一些较长的命令进行简化 。bashrc是环境变量的配置文件,/etc/bashrc和~/.bashrc区别就在于一个是全系统的设置一个是当前用户的设置,在shell中执行alias命令会显示所有的别名。

alias mk='/anron/buildFireware.sh'

 四、部分语法

4.1 Makefile中

4.1.1 引入外部文件

# 在Makefile中引入外部文件
include liteos_config.mk

4.1.2  宏定义 -D

-Dmacro=\"string\",等同于在头文件中定义:#define macro "string"
-Dmacro,等同于在头文件中定义:#define macro 1

4.2 Shell中 

4.2.1 函数的调用

# 以下是test.sh文件,函数中$1的值是局部变量,与shell文件的$1不同值
function CheckDir()
{
	echo "[$1][$2]"
}


echo "[$1]"
CheckDir
CheckDir "b" "c"
CheckDir "b" $1

# 调用test.sh后的输出结果
[root@mac /]# ./test.sh a
[a]
[][]
[b][c]
[b][a]
# 给make传递参数,\是转义符
make ZYT_VER=-DFirmVer=\\\"$BuildVersion\\\"
make ZYT_VER="-DFirmVer=\\\"$BuildVersion\\\" -D__VPN_SIM__"

4.2.2 字符串的截取

# 字符串的截取
VersionType=${BuildVersion: 0: 1}

${string: start :length}	从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
${string: start}	从 string 字符串的左边第 start 个字符开始截取,直到最后。
${string: 0-start :length}	从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
${string: 0-start}	从 string 字符串的右边第 start 个字符开始截取,直到最后。
${string#*chars}	从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
${string##*chars}	从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
${string%*chars}	从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
${string%%*chars}	从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符

4.2.3 字符串的长度

# 返回字符串的长度 ${#变量名}
varLen=${#BuildVersion}

五、运行前的准备

脚本运行前要先安装交叉编译环境

# 安装依赖库
yum install -y glibc.i686 libstdc++.so.6 zlib.i686

# 安装交叉编译工具
tar xzvf arm-hisiv500-linux.tgz
arm-hisiv500-linux/arm-hisiv500-linux.install

# 增加export
export PATH=/opt/hisi-linux/x86-arm/arm-hisiv500-linux/target/bin:$PATH 

# 测试安装结果
arm-hisiv500-linux-gcc -v

Shell 脚本 - 自动拉取GIT代码+编译前后端代码+发布

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值