其实也没啥神奇的,无非就是脚本和C宏定义。
首先,是脚本部分,Subversion包中有个svnversion命令,有了它就好办了,
在Makefile中将去版本命令写好后作为参数传给gcc/g++/cl等等之类,用-D在编译器参数中定义版本宏。
CC = gcc buildinfo=`svnversion` bt:`date +'%Y-%m-%d %H:%M:%S'` CFLAGS= -m32 -W -Wall -I. -g -DBUILD_INFO="\"interface:1.3 svn:$(buildinfo)\"" LIBS = -lpthread -L./libworker -lworker linux_LIBS= -Wl,-rpath,.:./libworker:../lib -ldl $(LIBS) TARGET = zw all:libworker/libworker.so $(CC) $(CFLAGS) hello.c mongoose.c $(linux_LIBS) -o $(TARGET) @echo " #############################" @echo " All Done svn:`svnversion` " @echo " #############################" ... ...
然后。。。然后?然后用这个宏输出就是了呀。
... ... while ((ret = getopt(argc, argv, "vc:")) != -1) { switch (ret) { case 'v' : fprintf(stdout, "%s %s\n", argv[0], BUILD_INFO); _exit(-1); ... ...
如此这般,就不用每次编译改输出版本里的svn版本号了。之后不管debug还是问题追踪都跟着这个版本走,甚是方便呦。
[cz@localhost zhuowang]$ ./zw -v ./zw interface:1.3 svn:60M bt:2012-11-01 11:24:45
其中60M的60是svn版本号,M表示有未经过提交的修改。所以一定要及时Commit,不然可就白费劲喽。
0 条评论。