是在一个Makefile可能的一个符号链接的依赖?(Is dependency on a symli

2019-09-16 14:21发布

我需要在我的项目夫妇的符号链接。

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 $@

但这个规则试图创建符号链接每一次。 (我把-f标志ln ,因此重新创建每次符号链接。)

Answer 1:

当然,这可以工作。 请对待一切都像一个文件,其中包括一个符号链接。 它会检查文件是否存在(因为你没有列出任何先决条件,没有时间戳比较)。 在一个符号链接的情况下,它的真正检查任何链接指向的,当然,不是链接本身。

你不显示,当你做到这一点,但根据您的描述一两件事情正在发生的事情会发生什么:是(a)中的contrib /目录下的OpenLayers不存在,那么ln命令时产生的错误,而不是创建符号链接等等当然做会尝试运行,或(b)正在创建符号链接的错误,并指着什么,当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

然后验证符号链接,一旦创建,实际上指向你想要它去。



Answer 2:

如果你曾经你尽管你的符号链接正确指向现有的文件中碰到这样的问题:也请记住,“让”看着符号链接的目标文件的修改时间,而不是在符号链接的修改时间本身。

因此,如果调用“LN-S”的规则有任何依赖性比该文件的,那么“让”你的符号链接点了每次重新运行该规则的命令。 它会如此做一遍又一遍,因为创建一个指向文件不更新该文件的修改时间符号链接。

您可以使用“触摸”命令,以确保您链接的目标有一个更近的mtime比你的依赖。



文章来源: Is dependency on a symlink possible in a Makefile?