26

我想说“只有在目录 yank/ 存在的情况下,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

4 回答 4

27

是的,aMakefile可以有一个目录作为目标。

您的问题可能是 thecd没有执行您想要的操作:它执行cd并且git clone在原始目录中执行(您cd编辑的目录,而不是cd编辑的目录)。这是因为对于Makefile额外 shell 中的每个命令,都会创建一个。一种解决方法是cd使用 shell 的&&.

这应该有效:

bla/f: dir
    cd dir && touch f

dir:
    mkdir dir
于 2010-07-18T12:27:53.623 回答
16

在 makefile 中,目录名称是虚假目标还是“真实”目标?

您需要的是仅订购的先决条件

快速搜索并没有找到任何关于 makepp 和 order-only 先决条件的参考,但它可能仍然有效。

于 2012-11-16T13:57:57.693 回答
1

您的 makefile 应该符合您的预期。由于 yank 没有依赖关系,因此如果存在则不会重新制作。所以这看起来像是makepp中的一个错误。您可以通过使用 make 的传统实现尝试您的 makefile 来确认这一点。

于 2010-07-18T13:57:06.157 回答
1

是的,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
于 2021-01-26T12:24:54.813 回答