makefile可以将目录作为目标吗?

时间:2010-07-18 12:12:31

标签: makefile makepp

我试图说“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目录存在? “来源”已经创造了......

4 个答案:

答案 0 :(得分:21)

是的,Makefile可以将目录作为目标。

您的问题可能是cd无法执行您想要的操作:它cdgit 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