make没有意识到相对路径名依赖性与绝对路径名目标相同

时间:2013-03-28 23:30:35

标签: gnu-make

以下是我遇到的问题的简化makefile:

all: /tmp/makey/../filey
    @echo All done
/tmp/filey:
    @echo Filey

当我跑步时,它说:

make-3.79.1-p7: * 没有规则可以使目标/tmp/makey/../filey', needed by全部'。停止。

显然,它没有意识到/tmp/makey/../filey与/ tmp / filey相同。我有什么想法可以让它发挥作用吗?

由于

侨 - Murali

1 个答案:

答案 0 :(得分:4)

较新版本的GNU make具有$(abspath ...)$(realpath ...)函数,您可以将这些函数应用于先决条件和目标,以解析相同字符串的路径。如果您自己构建了这些名称(例如,$(PREFIX)/../filey),那么您可以使用$(dir $(PREFIX))filey代替。

除此之外,没有办法解决这个问题。 Make在目标上使用字符串匹配,如果字符串不相同,则它们不匹配(有一种特殊情况忽略简单前缀./)即使make理解了这种区别(通过将abspath本身应用于每个目标名称) ,也许)例如,面对符号链接,它仍然无济于事。

唯一的“真实”答案是让make了解底层文件系统(例如设备ID和inode),让您在不参考其路径名的情况下讨论文件。但是,在像make这样的便携式程序中,这是有问题的。