Dov*_*Dov 3 directory makefile
我正在使用gnu Make 3.82并且有一个恼人的问题.
我有一个规则设置目录之间的依赖关系.
OBJDIR=../obj
$(objdir)/%.o: %.C
$(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c $<
Run Code Online (Sandbox Code Playgroud)
为此,obj目录必须存在.我想将mkdir目录作为先决条件
$(objdir)/%.o: %.C $(objdir)
$(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c $<
$(objdir):
mkdir $(objdir)
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它在目录存在时失败然后make停止我尝试shell
if [ ! -d $(objdir) ] ; then \
mkdir $(objdir) \
fi
Run Code Online (Sandbox Code Playgroud)
但显然我有些不对劲.这样做的最佳方法是什么?
一种简单的方法是使用:
mkdir -p ../obj
Run Code Online (Sandbox Code Playgroud)
目录存在时它不会失败.
我通常为此创建一个宏MKPATH:
MKPATH = mkdir -p
Run Code Online (Sandbox Code Playgroud)
然后引用规则中的宏:
$(objdir):
$(MKPATH) $(objdir)
Run Code Online (Sandbox Code Playgroud)
这样,如果有必要,我可以在不更改makefile的情况下更改行为.
你的shell片段:
if [ ! -d $(objdir) ] ; then
mkdir $(objdir)
fi
Run Code Online (Sandbox Code Playgroud)
不能像写的那样工作,因为make分别执行每一行.
你可以写(注意添加的分号):
if [ ! -d $(objdir) ] ; then \
$(MKPATH) $(objdir) ; \
fi
Run Code Online (Sandbox Code Playgroud)
要么:
if [ ! -d $(objdir) ] ; then $(MKPATH) $(objdir); fi
Run Code Online (Sandbox Code Playgroud)
要么:
[ -d $(objdir) ] || $(MKPATH) $(objdir)
Run Code Online (Sandbox Code Playgroud)
请注意,命令行必须整体成功,因此请勿尝试:
[ ! -d $(objdir) ] && $(MKPATH) $(objdir)
Run Code Online (Sandbox Code Playgroud)
如果该目录存在,则第一个替代方法失败,但是shell以非零状态退出,因此失败...并导致构建失败.