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