我试图说“git存储库的下载只有在目录yank /存在时才会起作用。如果目录不存在/那么就成功”
yank/gist.el/gist.el : yank
cd yank ; git clone http://github.com/defunkt/gist.el.git
yank:
mkdir yank
我正在使用makepp - http://makepp.sf.net 并得到错误:
[metaperl@andLinux ~/edan/pkg/gist.el] makepp
makepp: Loading makefile `/home/metaperl/edan/pkg/gist.el/Makeppfile'
makepp: Entering directory `/home/metaperl/edan/pkg/gist.el'
mkdir yank
mkdir: cannot create directory `yank': File exists
makepp: error: Failed to build target `/home/metaperl/edan/pkg/gist.el/yank' [1]
makepp: 0 files updated, 0 phony targets built and 1 target failed
[metaperl@andLinux ~/edan/pkg/gist.el]
但是为什么它会尝试使yank目录存在? “来源”已经创造了......
答案 0 :(得分:21)
是的,Makefile
可以将目录作为目标。
您的问题可能是cd
无法执行您想要的操作:它cd
而git clone
是在原始目录中执行的cd
cd
来自,不是您Makefile
编辑的那个。这是因为cd
中的每个命令都会创建一个额外的shell。解决方法是运行&&
并使用shell bla/f: dir
cd dir && touch f
dir:
mkdir dir
作为一个命令进行克隆。
这应该有效:
{{1}}
答案 1 :(得分:11)
In a makefile, is a directory name a phony target or "real" target?
您需要的是order-only prerequisite。
快速搜索没有找到任何关于makepp和仅限订单的先决条件的参考,但它可能仍然有用。
答案 2 :(得分:1)
你的makefile应该按你的意愿行事。由于yank没有依赖关系,因此如果它存在则不会重新生成。所以这看起来像makepp中的一个bug。您可以通过使用传统的make实现来尝试makefile来确认这一点。
答案 3 :(得分:0)
是的,Makefile 可以有一个目录作为目标。
但是,你不应该。在目录中添加或删除文件时,它的 mtime 会更新。这会导致依赖于单个目录的多个目标相互隐式重建,从而导致奇怪的行为。因此,根据经验,您应该避免使用目录作为目标和/或依赖项..
all: d/a d/b
d/a d/b: d
rm -f $@
touch $@
d:
mkdir $@
多次运行的输出看起来像...
$ make
mkdir d
rm -f d/a
touch d/a
rm -f d/b
touch d/b
$ make
rm -f d/a
touch d/a
$ make
rm -f d/b
touch d/b
$ make
rm -f d/a
touch d/a