我试图将我的Subversion版本号嵌入C++项目中,而在设置GNU make这样做时遇到了问题。我的makefile当前看起来像这样:
check-svnversion:
../shared/update-svnversion-h.pl
../shared/svnversion.h: check-svnversion
shared/svnversion.o: ../shared/svnversion.h
.PHONY: check-svnversion
svnversion.o
取决于svnversion.cpp
(通过模式规则)和svnversion.h
(明确列出,因为依赖项检查由于某种原因未将其选中)。 svnversion.h
由update-svnversion-h.pl
脚本创建和维护(基本上只运行svnversion
并将其输出到C++文件中)。当前,我必须运行
make
两次才能使文件更新。 make
第一次运行update-svnversion-h.pl
(因为它已被列为先决条件),但是之后没有检查svnversion.h
的时间戳以查看是否已被update-svnversion-h.pl
更改,因此它不会重新制作svnversion.o
。第二次,它确实检查了时间戳,无论如何都运行update-svnversion-h.pl
(由于svnversion.h
是最新的,因此这次不执行任何操作),然后重新编译svnversion.cpp
来生成svnversion.o
。有没有办法告诉GNU make对一个必备组件进行两次评估,或者延迟检查必备组件的时间戳,直到该必备组件的命令执行完毕?
或者,是否有更好的方法在我的源代码中嵌入修订号? (为了提高速度,我试图避免在每次构建时都需要重新编译的解决方案。)
最佳答案
这似乎类似于autotools对其config.h标头进行的操作。
快速浏览一下automake的remake-hdr.am
,可以了解到它是如何实现的:
%CONFIG_H%: %STAMP%
## Recover from removal of CONFIG_HEADER
@if test ! -f $@; then \
rm -f %STAMP%; \
$(MAKE) $(AM_MAKEFLAGS) %STAMP%; \
else :; fi
%STAMP%: %CONFIG_H_DEPS% $(top_builddir)/config.status
@rm -f %STAMP%
cd $(top_builddir) && $(SHELL) ./config.status %CONFIG_H_PATH%
然后
config.status
创建图章文件。这个自动制作示例与您的示例之间的主要区别似乎是自动制作触及图章文件,而在您的示例中它甚至不是真实文件。
关于svn - 延迟或重复GNU make中的先决条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/332122/