8

我的项目中需要几个符号链接。

来自src/openlayers, 文件夹img并且theme必须在contrib/openlayers. 该contrib/openlayers文件夹也应该自动创建。

.PHONY: run
run: contrib/openlayers/theme contrib/openlayers/img
   ../bin/pserve development.ini --reload

contrib/openlayers/theme:
    ln -s src/openlayers/theme $@

contrib/openlayers/img:
    ln -s src/openlayers/img $@

但是这个规则每次都尝试创建符号链接。(我把-f标志放到ln,所以它每次都重新创建符号链接。)

4

2 回答 2

20

万一您遇到了这个问题,尽管您的符号链接正确指向现有文件:还要记住,“make”查看符号链接目标文件的 mtime,而不是符号链接的 mtime本身。

因此,如果调用“ln -s”的规则有任何比符号链接指向的文件更新的依赖项,那么“make”每次都必须重新运行该规则中的命令。它将一次又一次地这样做,因为创建指向文件的符号链接不会更新该文件的 mtime。

您可以使用“touch”命令来确保您的链接目标的 mtime 比您的依赖项更新。

于 2013-10-02T13:32:49.947 回答
3

当然,这可以工作。Make 将所有内容都视为文件,包括符号链接。它将检查文件是否存在(由于您没有列出任何先决条件,因此没有时间戳比较)。在符号链接的情况下,它实际上是在检查链接指向的任何内容,当然,不是链接本身。

您没有显示执行此操作时会发生什么,但根据您的描述,正在发生两件事之一:(a)contrib/openlayers 目录不存在,因此 ln 命令生成错误而不是创建符号链接所以当然,make 会在下次运行时尝试重新创建它,或者 (b) 您的符号链接创建不正确并且指向任何内容,这意味着当 make 尝试查看它是否存在时失败并且 make 将尝试重新创建它。

例如,如果您的src目录是您的目录的兄弟contrib,那么您的符号链接就是错误的;你会得到:

contrib/openlayers/theme -> src/openlayers/theme

或者,当内核尝试解决它时:

contrib/openlayers/src/openlayers/theme

这不太可能是你想要的。我建议你使用这样的东西:

contrib/openlayers/theme:
        mkdir -p contrib/openlayers
        ln -s ../../src/openlayers/theme contrib/openlayers/theme

然后验证符号链接在创建后是否实际指向您希望它去的位置。

于 2012-04-16T21:21:17.807 回答