首页 > 解决方案 > 一个目标的多个规则

问题描述

我有一个大型项目,它是在具有不同操作系统的几台不同机器上按需编译的。目标之一有foo.res它的依赖关系。可以使用以下两种不同规则之一编译此资源文件:

第一条规则要求存在文本文件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 配置为仅触发其中一个规则?

标签: makefile

解决方案


你不能用明确的规则来做到这一点。一个明确的规则告诉 make THIS你如何构建这个目标。您可以创建两个不同的模式规则来构建相同的目标。模式规则说这是构建目标的一种方式。

因此,将您的 makefile 更改为:

build/%.res: res/%.res | build/.
        cp $< $@

build/%.res: res/%.txt | build/.
        some_app -o $@ $<

推荐阅读