我有一个 Makefile 系统,它动态生成规则来为不同平台构建文件列表。由于各种原因,不能使用隐式规则,因为没有可应用的通用模式,而是各种函数在文件列表上的输出。
现在我正在尝试以一种仅针对需要构建的目标触发的方式添加自动依赖项生成。执行此操作的正常方法是定义生成依赖项的隐式规则,然后包含或定义要求这些依赖项作为同一目标的先决条件的显式规则(参见http://mad-scientist.net/make/autodep.html示例)。这是有效的,因为 make 会自动覆盖具有相同规则的显式版本的隐式规则而不会抱怨。
但是,由于我无法选择使用隐式规则,因此我试图找出一种方法来做到这一点。我只看到两种方法:
由于 AFAIK 无法执行第二个选项,有人知道我如何抑制“目标的覆盖命令”警告吗?关于覆盖显式规则并使用新的先决条件再次评估它们的任何其他建议?
简短的回答是否定的,没有办法在没有收到该消息的情况下替换显式规则(当然,因为 GNU make 是开源的,您可以修改代码并构建自己的版本)。
更长的答案是我认为你最初的假设是不正确的。我不明白你所说的这个作品是什么意思,因为 make 会自动覆盖具有相同规则的显式版本的隐式规则而不会抱怨。
您似乎想到的是没有配方的先决条件语句,例如:
%.o : %.c
$(CC) ...
foo.o: foo.c foo.h bar.h
foo.o: biz.h baz.h
Run Code Online (Sandbox Code Playgroud)
等等。GNU make 中的规则是,对于任何给定目标(无论如何都是单冒号目标),只能有一个规则定义配方。可以有任意多的规则,只定义前提关系,而不定义配方,只要你喜欢。当看到这些仅限先决条件的规则时,它们只需将附加先决条件附加到当前先决条件列表中。
而且,这里没有隐式或显式规则的区别;例如上面的例子可以写成:
foo.o : foo.c
$(CC) ...
foo.o: foo.c foo.h bar.h
foo.o: biz.h baz.h
Run Code Online (Sandbox Code Playgroud)
这是完全合法的,不会给你任何警告。
您的 makefile 中似乎存在问题,并且您已经对问题所在做出了一些跳跃式的结论,然后不是描述问题本身,而是询问如何解决结论。如果您备份并向我们展示您看到生成的警告的 makefile 示例(并展示您如何调用 make 并绕过您收到的警告),我们可能会更好地为您提供帮助。
| 归档时间: |
|
| 查看次数: |
2888 次 |
| 最近记录: |