3

以下是我遇到的问题的简化生成文件:

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

当我运行 make 它说:

make-3.79.1-p7: *没有将目标设为/tmp/makey/../filey', needed by全部的规则。停止。

显然它没有意识到 /tmp/makey/../filey 与 /tmp/filey 相同。有什么想法可以让我完成这项工作吗?

谢谢

Ciao——穆拉利

4

1 回答 1

6

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

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

唯一“真正”的答案是让 make 了解有关底层文件系统(例如设备 ID 和 inode)的一些信息,让您在不提及文件路径名的情况下谈论文件。但是,在像 make 这样的可移植程序中,这样做是有问题的。

于 2013-03-29T12:58:00.390 回答