2012-04-16 56 views
7

我需要一些符号链接在我的项目中。是否依赖于Makefile中可能的符号链接?

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 [email protected] 

contrib/openlayers/img: 
    ln -s src/openlayers/img [email protected] 

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

回答

3

当然,这可以工作。让所有东西都像一个文件一样,包括一个符号链接。它会检查文件是否存在(因为你没有列出任何先决条件,没有时间戳比较)。在符号链接的情况下,它确实检查链接指向的任何内容,当然不是链接本身。

当你这样做时,你不会显示发生了什么,但根据你的描述发生以下两件事情之一:(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 

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

+0

你是对的,符号链接被打破。 – 2012-04-17 07:17:49

12

如果你曾经遇到了这个问题,尽管你的符号链接正确指向现有文件的:也请记住,“让”看着符号链接的目标文件的mtime和在符号链接本身的mtime。因此,如果调用“ln -s”的规则与您的符号链接所指向的文件相比具有更新的任何依赖关系,那么“make”必须每次重新运行该规则中的命令。它会一次又一次地执行,因为创建一个指向文件的符号链接不会更新该文件的mtime。

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

+1

好点!帮助我弄清楚为什么我的规则一直想要创建链接(http://stackoverflow.com/a/19213369/1510289) – 2013-10-06 20:10:07