一个目标有多个规则

问题描述 投票:2回答:1

我有一个大项目,它是按需在具有不同操作系统的几台不同机器上编译的。目标之一的依存关系为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仅触发其中一项规则?

makefile
1个回答
1
投票

您无法使用明确的规则来执行此操作。一个明确的规则告诉make THIS是如何构建此目标。您可以创建可以构建同一目标的两个不同的模式规则。模式规则说这是一种方法,您可以构建该目标。

因此,将您的makefile更改为:

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

build/%.res: res/%.txt | build/.
        some_app -o $@ $<
© www.soinside.com 2019 - 2024. All rights reserved.