是否可以在Makefile中依赖符号链接?

时间:2012-04-16 20:07:40

标签: makefile gnu-make symlink

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

src/openlayers img,文件夹themecontrib/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标记放到{{1}},因此每次都会重新创建符号链接。)

2 个答案:

答案 0 :(得分:14)

如果您的符号链接正确指向现有文件,您遇到此问题:还要记住“make”查看符号链接的目标文件的mtime,而不是< / em>在符号链接本身的mtime。

因此,如果调用“ln -s”的规则具有 newer 的依赖关系,而不是符号链接指向的文件,则“make”必须重新运行该规则中的命令时间。它会一次又一次地这样做,因为创建指向文件的符号链接不会更新该文件的mtime。

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

答案 1 :(得分: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

然后验证符号链接一旦创建,就会实际指向您想要的位置。