使用mkdir时如何防止makefile中出现"目录已存在错误"

时间:2020-03-06 14:24:30  来源:igfitidea点击:

我需要在我的makefile中生成一个目录,即使我可以轻易忽略它,也不想一遍又一遍地出现"目录已存在错误"的信息。

我主要使用mingw / msys,但也希望它能在其他Shell /系统中使用。

我试过了,但是没用,有什么想法吗?

ifeq (,$(findstring $(OBJDIR),$(wildcard $(OBJDIR) )))
-mkdir $(OBJDIR)
endif

解决方案

如果目录已经存在对我们来说不是问题,则可以重定向该命令的stderr,以消除错误消息:

-mkdir $(OBJDIR) 2>/dev/null

在UNIX上,只需使用以下命令:

mkdir -p $(OBJDIR)

如果目录存在,则mkdir的-p选项可防止出现错误消息。

在makefile中:

target:
    if test -d dir; then echo "hello world!"; else mkdir dir; fi

我们可以使用测试命令:

test -d $(OBJDIR) || mkdir $(OBJDIR)

ifeq "$(wildcard $(MY_DIRNAME) )" ""
  -mkdir $(MY_DIRNAME)
endif

$(OBJDIR):
    mkdir $@

这也适用于多个目录,例如

OBJDIRS := $(sort $(dir $(OBJECTS)))

$(OBJDIRS):
    mkdir $@

$(OBJDIR)添加为第一个目标很有效。

在Windows上

if not exist "$(OBJDIR)" mkdir $(OBJDIR)

在Unix上|的Linux

if [ ! -d "$(OBJDIR)" ]; then mkdir $(OBJDIR); fi

这是我与GNU make一起使用来创建编译器输出目录的一个技巧。首先定义此规则:

%/.d:
          mkdir -p $(@D)
          touch $@

然后,使进入该目录的所有文件都依赖于该目录中的.d文件:

obj/%.o: %.c obj/.d
    $(CC) $(CFLAGS) -c -o $@ $<

注意使用$ <代替$ ^。

最后,防止.d文件自动删除:

.PRECIOUS: %/.d

跳过.d文件并直接取决于目录是不起作用的,因为每次在该目录中写入文件时都会更新目录修改时间,这将在每次调用make时强制进行重建。