1、 假设生成的程序名叫 server_app
那么我期望运行 ./server_app -v 可以显示代码的详细信息
那么需要在命令行参数解析中,对 -v / --version 这种参数做解析
伪代码:
if ( strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--version") == 0)
{
printf("%s\n", VERSION);
}
2. 而这里的VERSION我们希望在每次make的时候,可以自动根据当前代码的git commit tag来生成。
所以需要有个 version的模板文件 version.tpl.h, 用来生成程序需要include的version.h, 内容如下:
#ifndef VERSION_H_
#define VERSION_H_
#define BASE_VERSION "1.0.0"
#if defined(DEBUG) || defined(_DEBUG) || defined(_DEBUG_)
#define VERSION BASE_VERSION "_debug_" COMMIT_TAG "_" __DATE__ " " __TIME__
#else
#define VERSION BASE_VERSION "_release_" COMMIT_TAG "_" __DATE__ " " __TIME__
#endif // end of if defined(DEBUG) || defined(_DEBUG) || defined(_DEBUG_)
#endif // end of define VERSION_H_
3. 接下来 ,我们需要在Makefile里面添加如下内容:
# 变量 commit_tag 记录当前最新的git commit tag
commit_tag=$(shell git rev-list --max-count=1 HEAD)
.PHONY:all
all : version # 自己的其它目标 可以直接写在 version 后面
version :
@if ! grep "$(commit_tag)" version.h >/dev/null ; then \
echo "update version.h" ; \
sed 's/COMMIT_TAG/"$(commit_tag)"/g' version.tpl.h > version.h ; \
fi
4. 这样每次make的时候 ,会先根据是否有 version.h ,生成最终的version.h
生成的内容如下:
#ifndef VERSION_H_
#define VERSION_H_
#define BASE_VERSION "1.0.0"
#if defined(DEBUG) || defined(_DEBUG) || defined(_DEBUG_)
#define VERSION BASE_VERSION "_debug_" "0148a371b94e1d67fb1d0cb94b79cc22edbd0a5d" "_" __DATE__ " " __TIME__
#else
#define VERSION BASE_VERSION "_release_" "0148a371b94e1d67fb1d0cb94b79cc22edbd0a5d" "_" __DATE__ " " __TIME__
#endif
#endif
5. 当然在make之前,需要在代码中
#include "version.h"
阅读(3410) | 评论(0) | 转发(1) |