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

cul*_*rón 7 symlink makefile gnu-make

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

来自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 $@
Run Code Online (Sandbox Code Playgroud)

但是这条规则每次都试图创建符号链接.(我把-f旗帜放到了ln,所以每次都会重新创建符号链接.)

Mar*_*uhn 15

如果你曾经遇到过这个问题,尽管你的符号链接正确指向现有文件:还要记住,"make"会查看符号链接的目标文件的mtime ,而不是符号链接的mtime本身.

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

您可以使用"touch"命令来确保链接的目标具有比依赖项更近的mtime.

  • 好点子!帮助我弄清楚为什么我的规则一直想要创建链接(http://stackoverflow.com/a/19213369/1510289) (2认同)

Mad*_*ist 4

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

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

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

contrib/openlayers/theme -> src/openlayers/theme
Run Code Online (Sandbox Code Playgroud)

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

contrib/openlayers/src/openlayers/theme
Run Code Online (Sandbox Code Playgroud)

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

contrib/openlayers/theme:
        mkdir -p contrib/openlayers
        ln -s ../../src/openlayers/theme contrib/openlayers/theme
Run Code Online (Sandbox Code Playgroud)

然后验证符号链接在创建后是否确实指向您想要的位置。