makefile - 一个目标的多个规则
问题描述
我有一个大型项目,它是在具有不同操作系统的几台不同机器上按需编译的。目标之一有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 配置为仅触发其中一个规则?
解决方案
你不能用明确的规则来做到这一点。一个明确的规则告诉 make THIS你如何构建这个目标。您可以创建两个不同的模式规则来构建相同的目标。模式规则说这是构建目标的一种方式。
因此,将您的 makefile 更改为:
build/%.res: res/%.res | build/.
cp $< $@
build/%.res: res/%.txt | build/.
some_app -o $@ $<
推荐阅读
- azure - 使用 Asyncio(异步)接收消息并获取变量作为最终结果
- python - 为什么带有 Python 扩展的 Visual Studio Code 不能正确导入“分数”库?
- azure - 如何停止从 Azure Functions 中的特定函数发送遥测数据?
- android - 我们可以使用 Android CameraX 进行图像处理吗?
- r - 使用不断变化的索引填充数据帧的行/在循环中更新索引
- microsoft-graph-api - 无法使用 Postman 从图表中检索列表项
- django - Django - forms.ChoiceField 不使用模型
- android - Android 模式匹配器未能检测到特殊字符
- fuchsia - 无法在模拟器上启动 Fuchsia
- c++ - 如何在 C++ 中创建带有证明的 TPM 虚拟智能卡