使用mkdir时如何防止makefile中的“目录已存在错误”

时间:2008-09-19 03:01:17

标签: makefile directory exists

我需要在makefile中生成一个目录,我不想反复得到“目录已存在错误”,即使我可以轻易忽略它。

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

我试过这个,但它没有用,有什么想法吗?

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

11 个答案:

答案 0 :(得分:119)

查看the official make documentation,这是一个很好的方法:

OBJDIR := objdir
OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)

$(OBJDIR)/%.o : %.c
    $(COMPILE.c) $(OUTPUT_OPTION) $<

all: $(OBJS)

$(OBJS): | $(OBJDIR)

$(OBJDIR):
    mkdir -p $(OBJDIR)

你应该在这里看到|的用法管道运算符,仅定义订单先决条件。 这意味着$(OBJDIR)目标应该存在(而不是更新)以构建当前目标。

请注意,我使用了mkdir -p。与文档示例相比,添加了-p标记。 有关其他选择,请参阅其他答案。

答案 1 :(得分:102)

在UNIX上只需使用:

mkdir -p $(OBJDIR)

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

答案 2 :(得分:66)

您可以使用测试命令:

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

答案 3 :(得分:18)

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

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

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

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

注意使用$&lt;而不是$ ^。

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

 .PRECIOUS: %/.d

直接取决于目录,跳过.d文件将无法正常工作,因为每次在该目录中写入文件时都会更新目录修改时间,这会在每次调用make时强制重建。

答案 4 :(得分:13)

如果目录已经存在对您来说不是问题,您可以只重定向该命令的stderr,摆脱错误消息:

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

答案 5 :(得分:11)

在makefile中:

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

答案 6 :(得分:9)

在Windows上

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

在Unix上| Linux

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

答案 7 :(得分:7)

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

答案 8 :(得分:6)

$(OBJDIR):
    mkdir $@

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

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

$(OBJDIRS):
    mkdir $@

添加$(OBJDIR)作为第一个目标效果很好。

答案 9 :(得分:3)

它在mingw32 / msys / cygwin / linux

下工作
ifeq "$(wildcard .dep)" ""
-include $(shell mkdir .dep) $(wildcard .dep/*)
endif

答案 10 :(得分:0)

比Lars的回答简单一点:

something_needs_directory_xxx : xxx/..

和通用规则:

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

没有用于清理或制作的触摸文件.PRECIOUS: - )

如果你想看到另一个小的通用gmake技巧,或者如果你对使用最少脚手架的非递归制作感兴趣,你可能会关注那个博客中的Two more cheap gmake tricks和其他与make相关的帖子