如何让程序在源代码管理中显示正确的版本号?

时间:2011-11-05 02:12:36

标签: c version-control makefile

我希望我的C程序显示正确的版本保持在mercurial源代码控制。我的方法存在一些问题。

  1. 如果我修改了other.c,则版本无法正确显示。
  2. 如果我在没有办理登机手续的情况下修改main.c,我希望make会警告我。
  3. 单独的目录中有许多文件。我希望只有在依赖项文件发生变化时才能更改版本。
  4. 顺便说一句,我不关心使用哪个版本控制系统,只是想知道这些问题是否可以解决。

    的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 ,即使没有修改。

3 个答案:

答案 0 :(得分:0)

  1. 如果您希望您的版本字符串保持最新,那么您每次都需要构建包含它的文件。在您的情况下,这意味着构建main.c,即使没有任何过时。你可以让main.o成为虚假目标,这样就可以为你做到。如果main.c变得复杂并且每次构建它都会减慢你的速度,你可能会考虑将版本信息放入一个单独的文件中,然后构建那个文件。

  2. make无法单独处理您的请求,但可能您的版本控制系统可以告诉您是否还没有签入文件。您可以为任何配方添加支票,并在发生故障时退出。这是一个例子(对于git,我不知道mercurial):

    allcheckedin:
        @if [[ -n $$(git status -s) ]]        ;\
         then                                  \
             echo "All files not checked in." ;\
             exit 1                           ;\
         fi
    
  3. 我不确定我是否完全理解你的第三个问题 - 如果你能澄清它,我会尽力帮助你。

答案 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。