我有一条创建目录的规则
bin:
-mkdir $@
然而,在第一次生成目录之后,我收到了这个输出:
mkdir bin
mkdir: cannot create directory `bin': File exists
make: [bin] Error 1 (ignored)
是否有某些方法我只能在目录不存在时运行规则,或者在目录已经存在时禁止输出?
答案 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