禁止make规则错误输出

时间:2010-08-13 13:46:14

标签: makefile gnu-make

我有一条创建目录的规则

bin:
    -mkdir $@

然而,在第一次生成目录之后,我收到了这个输出:

mkdir bin
mkdir: cannot create directory `bin': File exists
make: [bin] Error 1 (ignored)

是否有某些方法我只能在目录不存在时运行规则,或者在目录已经存在时禁止输出?

6 个答案:

答案 0 :(得分:16)

抑制make: error ... (ignored)输出的另一种方法是将|| true附加到可能失败的命令。 grep检查LaTeX日志文件中的错误的示例:

undefined:
  @grep -i undefined *.log || true

如果没有|| true,当grep找不到匹配项时会发出抱怨。

这适用于所有命令,而不仅仅是mkdir;这就是我添加这个答案的原因。

答案 1 :(得分:8)

命令行中的前导“-”已忽略该错误。如果您确实想要丢失来自mkdir的错误消息,请使用I / O重定向:

bin:
    -mkdir bin 2> /dev/null

尽管如此,您仍会收到来自make的“已忽略”警告,因此最好使用mkdir选项,当目标已存在时,该选项不会导致其失败,这是-p选项:

MKDIR_P = mkdir -p

bin:
    ${MKDIR_P} $@

-p选项实际上创建了给定路径上缺少的所有目录,因此它可以在一次调用中生成多个目录,但副作用是它不会产生错误现有目录。这确实假定了mkdir的POSIX-ish实现;旧机器可能不支持它(尽管它已经很长时间以来一直是标准的)。

答案 2 :(得分:8)

处理目录创建的传统方法是使用依赖的戳记文件并将dir创建为副作用。在制作distclean或任何“非常干净”的目标时删除戳记文件:

bin/.dirstamp:
    mkdir -p $(DIRS)
    touch $@

bin/foo: bin/.dirstamp
    $(MKFOO) -o $@

distclean:
    rm -rf bin

原因如下:每当创建/删除bin中的文件时,都会更新包含目录的mtime。如果目标取决于bin,则下次make运行时,它将重新创建不需要的文件。

答案 3 :(得分:0)

除非其目标不存在或由于其依赖性而过时,否则不应执行您的规则。换句话说,你永远不应该遇到这个错误。

[已添加示例]

[max@truth tmp]$ ls -la
total 20
drwxr-xr-x.  2 max users 4096 Aug 14 21:11 .
drwx------. 80 max max   4096 Aug 14 18:25 ..
-rw-rw-r--   1 max max     38 Aug 14 21:11 Makefile
[max@truth tmp]$ cat Makefile 
.PHONY: all
all: bin

bin:
    mkdir $@

[max@truth tmp]$ make
mkdir bin
[max@truth tmp]$ ls -la
total 24
drwxr-xr-x.  3 max users 4096 Aug 14 21:11 .
drwx------. 80 max max   4096 Aug 14 18:25 ..
drwxrwxr-x   2 max max   4096 Aug 14 21:11 bin
-rw-rw-r--   1 max max     38 Aug 14 21:11 Makefile
[max@truth tmp]$ make
make: Nothing to be done for `all'.
[max@truth tmp]$ make
make: Nothing to be done for `all'.

您的文件夹是否依赖于任何内容?你的文件夹是虚假目标吗?

答案 4 :(得分:0)

好吧,我最终得到了这个结构,也许有人会发现它有用或者可以评论它:

BINDIR = .
TMPDIR = tmp
OUTDIRS = $(BINDIR) $(TMPDIR)
$(OUTDIRS):
    @test -d $@ || mkdir $@

答案 5 :(得分:0)

Make假设第一个目标是默认目标。如果那是你的完整makefile,那么它必须总是试图重新制作默认目标,即bin。将以下行插入makefile的顶部:

all: bin
.PHONY: all