makefile - 重新制作自己的 Makefile:makefile 未正确重新加载
问题描述
我有一个顶级makefile,它是由我的自定义构建工具从各种配置文件自动生成的:我希望makefile能够在它过期时重新制作自己。为此,我有以下规则:
<absolute path to makefile>: <list> <of> <configuration> <files>
@echo "Rebuilding top-level makefile"
@<invoke my build tool>
我正在使用 GNU Make 4.3,它声称支持这一点,如此处详述,它声称“在检查了所有 makefile 之后,如果有任何实际更改,make 从一个干净的状态开始并重新读取所有 makefile。 "
我遇到的问题是,尽管正确调用了此规则(但不是隐含地,我实际上需要另一个 PHONY 默认目标,它具有 makefile 作为 prerequesite),但似乎即使 makefile 已更改,make 也不会重新加载它。我注意到当它们有一个配方并且已经过时时,make确实会正确地重新加载包含的makefile:只有这个顶级makefile有问题。
这样做的效果是文件中的其他规则已经过时了,变化只会在后续的make调用中体现出来。
我当前的解决方案是让 makefile 配方返回一个非零退出代码并回显一个警告,要求用户重新运行 make: 我试过 using ($error _)
,但这并没有达到预期的效果。
似乎 GNU Make 声称支持这个用例,所以我想我一定在这里做错了什么?
解决方案
似乎make(或至少是GNU Make 4.3)无法识别出作为规则目标的绝对路径实际上是指它已经自动加载的makefile:它只是进行简单的文本比较而不是正确解析路径.
将规则更改为:
Makefile: <list> <of> <configuration> <files>
@echo "Rebuilding top-level makefile"
@<invoke my build tool>
解决了这个问题。
我认为这可能应该被视为 GNU Make 中的一个错误,因为它似乎没有记录在案。
推荐阅读
- c# - MCP2210.dll 的 C# 问题
- python - python文件(在jenkins中作为批处理命令开始)和jenkins管道之间的进程间通信
- android - 应用在 Backtound Android 8 中时的位置更新
- python - 为什么这个简单的代码返回“无”?
- javascript - 如何使用 google-api-javascript-client 使用 Javascript 访问 Google Photos API 并读取 JSON 数据?
- oracle - 如何在 Stackdriver 中监控安装在 GCE 实例中的 Oracle 数据库?
- cuda - CUDA<<<...>>>() 内核启动语法是如何实现的
- ruby - Elasticsearch 嵌套查询返回所有嵌套列表
- php - 文件上传进度条
- ios - 授权回调地址 GitHub