Linux下C/C++版本发布自动脚本

软件发布有软件版本管理原则,这里结合Linux下C/C++项目发布方式,简单介绍一下如何自动的集成动态版本管理脚本。

软件版本发布关键点

软件版本管理原则我们需要注意的是以下几个关键点:

==》主版本(VER_MAJOR):项目(产品)负责人维护

==》次版本(VER_MINOR):技术(版本)接口人维护

==》版本号(VER_REVISION):代码库自动升级更新

==》编译日期(BUILD_DATE):编译机器的系统日期

==》编译时间(BUILD_TIME):编译机器的系统时间

==》编译标识(BUILD_ID):编译唯一码

==》编译人员(AUTHOR_NAME):编译发布人员

==》联系方式(AUTHOR_CONTACT):编译发布人员联系方式

动态版本管理脚本

==》支持主版本、次版本、联系方式自定义

==》支持发布人员或者发布账户自定义

==》支持版本号、编译日期、编译时间动态获取

==》自动生成version.c/version.h(version.h用于函数原型定义,直接在应用中include即可。)

#!/bin/bash

# parameter check
if [ $# -ne 4 ] && [ $# -ne 5 ]
then
    echo "usage($#): $0 major_num minor_num DEBUG/RELEASE e-mail author"
	echo "       or: $0 major_num minor_num DEBUG/RELEASE e-mail"
    exit
fi

# function
version()
{
	BUILD_DATE=`date "+%Y-%m-%d"`
	BUILD_TIME=`date "+%R:%S"`
	VERSION_NUM=`svn info|grep Revision |cut --delimiter=" " -f2`

	cat > version.c <<EEEEEEE
#include "stdio.h"
#include "version.h"

#define VER_MAJOR $1
#define VER_MINOR $2
#define VER_REVISION $VERSION_NUM
#define VER_DR_FLAG "$3"

#define VER_BUILD_DATE "$BUILD_DATE"
#define VER_BUILD_TIME "$BUILD_TIME"

#define AUTHOR_CONTACT "$4"
#define AUTHOR_NAME    "$5"

#define VERSION_ALL  "$3_${BUILD_DATE}_${BUILD_TIME}_v$1_$2_$VERSION_NUM"

char *get_version()
{
	return VERSION_ALL;
}

char *get_ver_author()
{
	return AUTHOR_NAME;
}

char *get_ver_author_contact()
{
	return AUTHOR_CONTACT;
}

char *get_ver_flag()
{
	return VER_DR_FLAG;
}

char *get_build_date()
{
	return VER_BUILD_DATE;
}

char *get_build_time()
{
	return VER_BUILD_TIME;
}

int get_ver_major()
{
	return VER_MAJOR;
}

int get_ver_minor()
{
	return VER_MINOR;
}

int get_ver_rev()
{
	return VER_REVISION;
}

EEEEEEE

	cat > version.h <<EEEEEEE
#ifndef __VERSION_H__
#define __VERSION_H__ 

	char *get_version();

	char *get_ver_author();

	char *get_ver_author_contact();

	char *get_ver_flag();

	char *get_build_date();

	char *get_build_time();

	int get_ver_major();

	int get_ver_minor();

	int get_ver_rev();

#endif /* __VERSION_H__ */
EEEEEEE
}

# print
echo "###############################"
echo "######### $0 "
echo "######### Major Number: $1"
echo "######### Minor Number: $2"
echo "######### D/R Flag: $3"
echo "######### Contact: $4"

if [ $# -eq 4 ]
then
	AUTHOR=`who | cut --delimiter=" " -f1`
else
	AUTHOR=$5
fi

	echo "######### Author: $AUTHOR"

version $1 $2 $3 $4 $AUTHOR

if [ $? -eq 0 ]
then
    echo "######### Done! "
else
	"######### Failed! "
fi

echo "###############################"

动态生成的版本代码

在SVN版本库根目录执行

# ./version.sh 1 2 DEBUG [email protected] lida

###############################
######### ../version.sh
######### Major Number: 1
######### Minor Number: 2
######### D/R Flag: DEBUG
######### Contact: [email protected]
######### Author: lida
######### Done!
###############################

version.c

#include "stdio.h"
#include "version.h"

#define VER_MAJOR 1
#define VER_MINOR 2
#define VER_REVISION 271
#define VER_DR_FLAG "DEBUG"

#define VER_BUILD_DATE "2016-05-10"
#define VER_BUILD_TIME "18:29:35"

#define AUTHOR_CONTACT "[email protected]"
#define AUTHOR_NAME    "lida"

#define VERSION_ALL  "DEBUG_2016-05-10_18:29:35_v1_2_271"

char *get_version()
{
	return VERSION_ALL;
}

char *get_ver_author()
{
	return AUTHOR_NAME;
}

char *get_ver_author_contact()
{
	return AUTHOR_CONTACT;
}

char *get_ver_flag()
{
	return VER_DR_FLAG;
}

char *get_build_date()
{
	return VER_BUILD_DATE;
}

char *get_build_time()
{
	return VER_BUILD_TIME;
}

int get_ver_major()
{
	return VER_MAJOR;
}

int get_ver_minor()
{
	return VER_MINOR;
}

int get_ver_rev()
{
	return VER_REVISION;
}

version.h

#ifndef __VERSION_H__
#define __VERSION_H__ 

	char *get_version();

	char *get_ver_author();

	char *get_ver_author_contact();

	char *get_ver_flag();

	char *get_build_date();

	char *get_build_time();

	int get_ver_major();

	int get_ver_minor();

	int get_ver_rev();

#endif /* __VERSION_H__ */

DEMO示例集成版本管理

main.c

#include <stdio.h>
#include "version.h"

void main()
{
	printf("get_version: %s\n",get_version());
	printf("get_ver_author: %s\n",get_ver_author());
	printf("get_ver_author_contact: %s\n",get_ver_author_contact());
	printf("get_ver_flag: %s\n",get_ver_flag());

	printf("get_build_date: %s\n",get_build_date());
	printf("get_build_time: %s\n",get_build_time());

	printf("get_ver_major: %d\n",get_ver_major());
	printf("get_ver_minor: %d\n",get_ver_minor());
	printf("get_ver_rev: %d\n",get_ver_rev());
}

编译、执行上述version和main程序

# gcc main.c version.c
# ./a.out
get_version: DEBUG_2016-05-10_18:29:35_v1_2_271
get_ver_author: lida
get_ver_author_contact: [email protected]
get_ver_flag: DEBUG
get_build_date: 2016-05-10
get_build_time: 18:29:35
get_ver_major: 1
get_ver_minor: 2
get_ver_rev: 271
时间: 2024-08-29 23:24:11

Linux下C/C++版本发布自动脚本的相关文章

[转] 关于linux下通过shell命令(自动)修改用户密码

关于linux下通过shell命令(自动)修改用户密码 2012-04-23 18:47:39 分类: 原文地址:关于linux下(自动)修改用户密码 作者:ubuntuer 本文章总结了如何手动.自动修改本地用户密码及远程机器的用户密码.对做自动化测试提供了自动修改用户密码的原理及方法. 修改本地用户密码:1.交互配置本地用户:以root用户: passwd <username>Changing password for user dewang.New UNIX password: BAD

不错的linux下通用的java程序启动脚本(转载)

转自:http://www.cnblogs.com/langtianya/p/4164151.html 虽然写起动shell的频率非常不高...但是每次要写都要对付一大堆的jar文件路径,新加jar包也必须要修改起动shell. 在网上找到一个挺好的通用shell脚本. 只需要修改一些配置变量,就可以用来做起动脚本了. 并且除了能起动.还支持关闭.重启.查看是否正在运行的功能. 原文地址:http://www.tudaxia.com/archives/10 start函数中,nohup部分其实也

linux下nginx启动停止重启控制脚本

这是控制nginx服务的脚本文件,包括控制nginx的启动.重启.停止.平滑重启.对配置文件的额检查. [[email protected] ~]# cat nginx.sh #!/bin/env bash # description:nginx server   ###必须加描述 # nginx - this script is used to control nginx service # processname nginx # chkconfig: - 85 15 # edit by su

Linux下如何查看版本信息

Linux下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号等等,整个CPU信息一目了然. 1.# uname -a   (Linux查看版本当前操作系统内核信息) Linux localhost.localdomain 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 i686 athlon i386 GNU/Linux 2.# cat /proc/version (Linux查看当前操作系统版本信息) Linux version 2.4

不错的linux下通用的java程序启动脚本

虽然写起动shell的频率非常不高...但是每次要写都要对付一大堆的jar文件路径,新加jar包也必须要修改起动shell. 在网上找到一个挺好的通用shell脚本. 只需要修改一些配置变量,就可以用来做起动脚本了. 并且除了能起动.还支持关闭.重启.查看是否正在运行的功能. 原文地址:http://www.tudaxia.com/archives/10 start函数中,nohup部分其实也可以提出来放入一个配置变量中.这里没有修改直接贴上作者的原文 #!/bin/sh #该脚本为Linux下

linux下更新Python版本并修改默认版本

linux下更新Python版本并修改默认版本,有需要的朋友可以参考下. 很多情况下拿到的服务器python版本很低,需要自己动手更改默认python版本 1.从官网下载python安装包(这个版本可以是任意版本3.3 2.7 2.6等等) wget http://python.org/ftp/python/2.7/Python-2.7.tar.bz2 2.解压并安装 tar -jxvf Python-2.7.tar.bz2 cd Python-3.3.0 ./configure make al

linux下移植指定的二进制程序脚本

一个程序所依赖的库文件可以由:ldd  命令路径来显示 例 ldd /bin/cat  输出详解 第一行输出为库入口,非库文件 which ls|grep -v alias|grep -o'[^[:space:]]*' 脚本中调试方法 declare –i Debuglevel=1 Debuglevel={0|1} [ $Debuglevel –eq 1 ] && echo -$--. 移植脚本如下所示 #!/bin/bash # declare -i DebugLevel=0 Targe

Linux下使用crontab命令以及Python脚本实现自动签到

关于这一部分, 我首先介绍下如何实现使用Python脚本实现签到功能其实,linux下有个命令叫做curl,完全可以完成模拟签到的功能,但是为了练习Python,我就用Python来写了.有这个想法完全是因为实验室的学长开发了一款App,上边收个起床签到,还有排名,为了能那个首签... 言归正传 首先,因为是手机上的App, 所以,我们需要抓包看下它具体的URL以及发送的内容是什么,关于这部分内容我就不在赘述了,我实现的功能主要有模拟发布状态和模拟签到两种功能,两个的URL也是不同的.为了不让学

Linux下搭建SVN服务器及自动更新项目文件到web目录(www)的方法

首先搭建SVN服务器 1,安装SVN服务端 直接用apt-get或yum安装subversion即可(当然也可以自己去官方下载安装) sudo apt-get install subversion 2,创建版本库 svnadmin create /home/myrepos    //这里的文件目录自己随便设置 3,配置svnserve 上述版本库/home/myrepos建立后在文件夹下会生成conf文件夹,进入/home/myrepos/conf下面会有下面3个文件 authz passwd