我有一个大项目,它是按需在具有不同操作系统的几台不同机器上编译的。目标之一的依存关系为foo.res
。可以使用2个不同的规则之一来编译此资源文件:
第一条规则要求文本文件foo.txt
存在。此规则还要求在系统中安装一些非跨平台软件。我们的工程师不能在现场使用此规则,因为它不会在旧的MacOS上运行。
第二条规则使用资源目录中的预编译资源文件foo.res
,并将其简单复制到build/
。显然,这是不需要的解决方法,但我别无选择。
我试图在一个Makefile中描述2条规则,但出现了这样的错误:
Makefile:78: warning: overriding recipe for target 'build/foo.res'
Makefile:75: warning: ignoring old recipe for target 'build/foo.res'
当前,我使用Makefile,其中一项规则已被注释掉:
.PHONY: compile
build/app.bin: some_files... build/foo.res
(Here is compiler call)
build/:
-mkdir build/
.PHONY: clear
clear:
-rm -rf ./build
... Lots of stuff here ...
# build/foo.res: res/foo.res | build/.
# cp res/foo.res build/foo.res
build/foo.res: res/foo.txt | build/.
some_app -o build/foo.res res/foo.txt
我将预编译的res/foo.res
部署到某些计算机上,然后交换注释的规则,因此使用常规的cp
。正常工作,直到在某些提交中对Makefile进行了一些更改为止。然后它阻止git中的快进更新。
如何根据匹配的依赖关系配置make仅触发其中一项规则?
您无法使用明确的规则来执行此操作。一个明确的规则告诉make THIS是如何构建此目标。您可以创建可以构建同一目标的两个不同的模式规则。模式规则说这是一种方法,您可以构建该目标。
因此,将您的makefile更改为:
build/%.res: res/%.res | build/.
cp $< $@
build/%.res: res/%.txt | build/.
some_app -o $@ $<