以下是我遇到的问题的简化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
答案 0 :(得分:4)
较新版本的GNU make具有$(abspath ...)
和$(realpath ...)
函数,您可以将这些函数应用于先决条件和目标,以解析相同字符串的路径。如果您自己构建了这些名称(例如,$(PREFIX)/../filey
),那么您可以使用$(dir $(PREFIX))filey
代替。
除此之外,没有办法解决这个问题。 Make在目标上使用字符串匹配,如果字符串不相同,则它们不匹配(有一种特殊情况忽略简单前缀./
)即使make理解了这种区别(通过将abspath本身应用于每个目标名称) ,也许)例如,面对符号链接,它仍然无济于事。
唯一的“真实”答案是让make了解底层文件系统(例如设备ID和inode),让您在不参考其路径名的情况下讨论文件。但是,在像make这样的便携式程序中,这是有问题的。