使用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时强制进行重建。