取决于make中的目录

Dov*_*Dov 11 makefile rules gnu-make

这是我之前的问题的后续内容:SO 4403861,因为建议的解决方案打破了依赖关系,使makefile无用.我无法弄清楚为什么.

我正在使用gnu make 3.82我有一个规则,如果已经创建了obj目录:

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目录不存在,则make失败.我希望make能够根据需要自动创建../obj,所以我添加了我认为非常简单的内容:

$(objdir)/%.o: %.C $(objdir)
    $(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
    $(COMPILE) -o $(objdir)/$(notdir $@ ) -c $<

$(objdir):
   if [ ! -d $(objdir) ] ; then mkdir $(objdir) ; fi
Run Code Online (Sandbox Code Playgroud)

当我这样做时,每次都要强制编译.为什么?除非没有目录,否则不应该发生mkdir?为什么这个简单的改变破坏了依赖?

Bha*_*vik 24

您还可以尝试使用仅订购先决条件链接

您的问题有一个类似的例子可供使用.

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

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

 all: $(OBJS)

 $(OBJS): | $(OBJDIR)

 $(OBJDIR):
         mkdir $(OBJDIR)
Run Code Online (Sandbox Code Playgroud)


slo*_*dog 13

正如其他人所说,问题是每当添加或删除目录成员时,目录都会被视为"已更改",因此make会看到您的输出目录一直在变化,并重新运行您告诉它的所有编译取决于输出目录.

作为其他人描述的变通方法的替代方案,最近的GNU make版本支持"仅限订单的先决条件".本手册中仅订购前提条件的说明包括如何使用它们进行目录创建的示例.

  • 我不知道这是真的.添加,删除或重命名任何成员时,目录会更改.(目录是包含文件名到文件的映射的文件.) (2认同)