KPe*_*xEA 107 directory makefile exists
我需要在我的makefile中生成一个目录,我想不要一遍又一遍地得到"目录已存在错误",即使我可以轻易忽略它.
我主要使用mingw/msys但是想要能够在其他shell /系统中运行的东西.
我试过这个,但它没有用,有什么想法?
ifeq (,$(findstring $(OBJDIR),$(wildcard $(OBJDIR) )))
-mkdir $(OBJDIR)
endif
Run Code Online (Sandbox Code Playgroud)
ofa*_*vre 120
查看官方make文档,这是一个很好的方法:
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)
Run Code Online (Sandbox Code Playgroud)
你应该在这里看到|的用法 管道运算符,仅定义订单先决条件.意味着$(OBJDIR)目标应该存在(而不是更新)以构建当前目标.
请注意,我用过mkdir -p.-p与文档示例相比,添加了该标志.另见其他选择.
tch*_*hen 105
在UNIX上只需使用:
mkdir -p $(OBJDIR)
Run Code Online (Sandbox Code Playgroud)
如果目录存在,mkdir的-p选项可防止出现错误消息.
sky*_*ymt 66
您可以使用test命令:
test -d $(OBJDIR) || mkdir $(OBJDIR)
Run Code Online (Sandbox Code Playgroud)
Lar*_*rén 18
这是我用GNU make创建编译器输出目录的技巧.首先定义此规则:
%/.d:
mkdir -p $(@D)
touch $@
Run Code Online (Sandbox Code Playgroud)
然后使进入该目录的所有文件都依赖于该目录中的.d文件:
obj/%.o: %.c obj/.d
$(CC) $(CFLAGS) -c -o $@ $<
Run Code Online (Sandbox Code Playgroud)
注意使用$ <而不是$ ^.
最后阻止自动删除.d文件:
.PRECIOUS: %/.d
Run Code Online (Sandbox Code Playgroud)
跳过.d文件,并且直接取决于目录,将无法工作,因为每次在该目录中写入文件时都会更新目录修改时间,这会在每次调用make时强制重建.
and*_*ich 13
如果目录已经存在对您来说不是问题,您可以只重定向该命令的stderr,摆脱错误消息:
-mkdir $(OBJDIR) 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
Lee*_*e H 11
在makefile中:
target:
if test -d dir; then echo "hello world!"; else mkdir dir; fi
Run Code Online (Sandbox Code Playgroud)
小智 9
在Windows上
if not exist "$(OBJDIR)" mkdir $(OBJDIR)
Run Code Online (Sandbox Code Playgroud)
在Unix上| Linux的
if [ ! -d "$(OBJDIR)" ]; then mkdir $(OBJDIR); fi
Run Code Online (Sandbox Code Playgroud)
ifeq "$(wildcard $(MY_DIRNAME) )" ""
-mkdir $(MY_DIRNAME)
endif
Run Code Online (Sandbox Code Playgroud)
$(OBJDIR):
mkdir $@
Run Code Online (Sandbox Code Playgroud)
这也适用于多个目录,例如.
OBJDIRS := $(sort $(dir $(OBJECTS)))
$(OBJDIRS):
mkdir $@
Run Code Online (Sandbox Code Playgroud)
添加$(OBJDIR)作为第一个目标效果很好.