在 Makefile 中能否依赖于一个符号链接?

9

我在项目中需要一些符号链接。

src/openlayers,文件夹imgtheme必须在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 $@

但是这个规则每次都尝试创建符号链接。(我在ln命令中使用了-f标志,因此它每次都会重新创建符号链接。)

2个回答

21
无论您的符号链接是否正确指向了现有文件,如果出现以下问题,请注意:"make"会查看符号链接目标文件的mtime而不是符号链接本身的mtime。
因此,如果调用"ln -s"的规则具有任何比符号链接指向的文件更新的依赖关系,则"make"每次都必须重新运行该规则中的命令。因为创建指向文件的符号链接并不会更新该文件的mtime,所以它将一遍又一遍地这样做。
您可以尝试使用"touch"命令来确保链接的目标文件具有比其依赖项更近的mtime。

2
好的观点!帮助我弄清楚为什么我的规则一直想创建链接(https://dev59.com/AGYr5IYBdhLWcg3w6OGd#19213369) - Velimir Mlaker

4
当然,这是可行的。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

然后验证符号链接是否指向您想要的位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接