禁止make规则错误输出

Mat*_*ner 11 makefile gnu-make

我有一个创建目录的规则

bin:
    -mkdir $@
Run Code Online (Sandbox Code Playgroud)

但是,在第一次生成目录后,我收到此输出:

mkdir bin
mkdir: cannot create directory `bin': File exists
make: [bin] Error 1 (ignored)
Run Code Online (Sandbox Code Playgroud)

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

dan*_*ann 16

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

undefined:
  @grep -i undefined *.log || true
Run Code Online (Sandbox Code Playgroud)

如果没有|| true,请在grep找不到匹配项时抱怨.

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

  • `-`前缀导致make输出恼人的"错误忽略"输出,我的解决方案没有.所以不,两人不做同样的事情. (7认同)

Jon*_*ler 7

-命令行上的前导' ' 已忽略该错误.如果您确实想丢失错误消息mkdir,请使用I/O重定向:

bin:
    -mkdir bin 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

但是,您仍然会收到"忽略"警告make,因此最好使用该选项,mkdir以便在目标已存在时不会导致失败,这是一个-p选项:

MKDIR_P = mkdir -p

bin:
    ${MKDIR_P} $@
Run Code Online (Sandbox Code Playgroud)

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


Jac*_*lly 7

处理目录创建的传统方法是使用依赖的戳记文件并将dir创建为副作用.制作时删除印章文件distclean或"真正干净"的目标是:

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

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

distclean:
    rm -rf bin
Run Code Online (Sandbox Code Playgroud)

原因如下:无论何时bin创建/删除文件,都会更新包含目录的mtime.如果目标依赖于bin,则下次make运行时,它将重新创建它不需要的文件.