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; 这就是我添加这个答案的原因.
-
命令行上的前导' ' 已忽略该错误.如果您确实想丢失错误消息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
; 旧机器可能不支持它(尽管它已经很长时间以来一直是标准的).
处理目录创建的传统方法是使用依赖的戳记文件并将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
运行时,它将重新创建它不需要的文件.
归档时间: |
|
查看次数: |
13436 次 |
最近记录: |