makefile中的错误

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)

但显然我有些不对劲.这样做的最佳方法是什么?

Jon*_*ler 5

一种简单的方法是使用:

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以非零状态退出,因此失败...并导致构建失败.