我有一个包含以下规则的Makefile:
file.c: filesvn
filesvn: .svn/entries
action1
action2
在svn存储库中,这当然可以正常工作。该文件依赖于生活在subversion存储库中。从存储库导出时,这不起作用(没有规则来制作目标...),我想解决这个问题。我试图简单地将以前生成的filesvn
版本带到导出的目录中,但Make仍坚持验证filesvn
的依赖性。
当然,简单地删除.svn / entries的依赖关系确实有效,但是由于观察修订更新是目标,因此规则的精神被打破了。
有没有办法让Make不在乎.svn / entries文件不存在?
这种技术的优点并不是问题的一部分。我无法从根本上改变这一点,但如果有一种改变可以保持可能有效的精神。答案“你不能”当然是完全有效的。 :)
答案 0 :(得分:24)
您可以使用wildcard
函数忽略该文件,除非它存在:
filesvn: $(wildcard .svn/entries)
除此之外:Subversion 1.7更改了本地工作副本的格式,因此即使在工作副本中,此规则也会停止工作。
答案 1 :(得分:2)
您可以添加一个生成实际makefile副本的目标,其中包含删除svn依赖项的更改,使用make运行make然后删除它。
答案 2 :(得分:1)
模式%
规则
对于模式规则,您需要.SECONDEXPANSION
:
.SECONDEXPANSION:
%.a: %.b $$(wildcard $$*.c)
cc $< -o $@
另请参阅:How can I make a pattern rule dependency optional in a Makefile?
在Make 4.1中测试。