Chinaunix首页 | 论坛 | 博客
  • 博客访问: 236997
  • 博文数量: 61
  • 博客积分: 125
  • 博客等级: 入伍新兵
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-23 23:28
文章分类

全部博文(61)

文章存档

2014年(37)

2013年(21)

2012年(3)

分类: LINUX

2014-08-09 10:38:11

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"




阅读(1022) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~