我希望我的C程序显示正确的版本保持在mercurial源代码控制。我的方法存在一些问题。
顺便说一句,我不关心使用哪个版本控制系统,只是想知道这些问题是否可以解决。
的main.c
int main() {
printf("version=%s\n", VERSION);
return 0;
}
生成文件
VERSION=$(shell hg id -i)
# PHONY force main.c always compile
.PHONY: main.c
all: main
main: main.o other.o
gcc main.o other.o -o main
main.o : main.c
gcc -c -DVERSION=\"${VERSION}\" main.c -o main.o
other.o : other.c
gcc -c other.c -o other.o
对于我的第一个问题,Carl Norum提供了使用PHONY的解决方案,这种方法有副作用,它总是会构建main.c和可执行文件 main ,即使没有修改。
答案 0 :(得分:0)
如果您希望您的版本字符串保持最新,那么您每次都需要构建包含它的文件。在您的情况下,这意味着构建main.c
,即使没有任何过时。你可以让main.o
成为虚假目标,这样就可以为你做到。如果main.c
变得复杂并且每次构建它都会减慢你的速度,你可能会考虑将版本信息放入一个单独的文件中,然后构建那个文件。
make
无法单独处理您的请求,但可能您的版本控制系统可以告诉您是否还没有签入文件。您可以为任何配方添加支票,并在发生故障时退出。这是一个例子(对于git,我不知道mercurial):
allcheckedin:
@if [[ -n $$(git status -s) ]] ;\
then \
echo "All files not checked in." ;\
exit 1 ;\
fi
我不确定我是否完全理解你的第三个问题 - 如果你能澄清它,我会尽力帮助你。
答案 1 :(得分:0)
使用 SVN 或 CVS 之类的内容进行版本控制。然后使用what
格式(请参阅man what)在每个.c或.cpp文件中放置一个静态字符串,其中包含版本系统可以自动放入其中的版本。
即。
static const char[] = "@(#) $Id$"); /* For example SVN */
他们可以使用实用程序what
来准确找出构建中所有文件的版本。
答案 2 :(得分:0)
第一个问题的标准解决方案是使用系统配置和更改全局变量(如VERSION)创建文件(比如config.h)。然后main可以包含config.h。您可以手动编辑config.h,或者从Makefile重建的config.h标记如下规则:
config.h : force-rebuild
sed -e 's/[@]VERSION[@]/$(VERSION)/' $<.in > $@
.PHONY : force-rebuild
你的模板文件config.h.in在版本号应该包含的地方包含“@ VERSION @”。
您的版本控制系统应该处理第二个问题。 svn status
和类似的命令处理这个很好。
对于第三个问题,没有标准解决方案,因为大多数版本碰撞规则需要人工交互。当您正确标记旧版本时,您只需比较版本控制中的两个版本;例如对于SVN:
svn diff $MYREPO/tags/$CURRENT_VERSION .
看看差异。可以从config.h中的svn info
和CURRENT_VERSION的输出中删除$ MYREPO。