如何使Makefile文件目标取决于不同的路径?

时间:2017-06-10 07:57:50

标签: makefile gnu-make

我为这个含糊不清的标题道歉,由于我对GNU make缺乏了解,我想不出一个简单的方法来表达它。

我正在为一个小项目编写一个简单的Makefile,我试图通过使用它们的基本名称(没有路径)作为目标来生成单个对象:

$(BASE_OBJS) : %.o : $(SRC_DIR)/%.c $(OBJDIR) $(INCLUDES)                        
    @echo $(CC): [$(notdir $<)] '->' [$(notdir $@)]                          
    @$(CC) -c $< $(CFLAGS) -o $(OBJDIR)/$@

问题是'make'应用显然希望目标对象出现在当前文件夹中,但它实际上存在于$(OBJDIR)子文件夹中。导致这些目标不必要地重建。

或者,此规则会检查对象是否存在于正确的位置:

$(OBJS) : $(OBJDIR)/%.o: $(SRC_DIR)/%.c $(INCLUDES)       
    @echo $(CC): [$(notdir $<)] '->' [$(notdir $@)]                          
    @$(CC) -c $< $(CFLAGS) -o $@ 

但它不能用于运行像'make main.o'这样的东西,因为$(OBJS)包含了对象的完整路径,所以它只允许'make output / main.o'这样的东西。 / p>

如果它是重复的那么我很抱歉,我正在寻找一段时间而无法找到类似的问题。

作为参考,这些是变量定义:

BASE_SRC=$(notdir $(SOURCES))                                                    
BASE_OBJS = $(BASE_SRC:%.c=%.o)                                                  
OBJS = $(BASE_OBJS:%.o=$(OBJDIR)/%.o)

1 个答案:

答案 0 :(得分:1)

您的主要目标和先决条件必须使用完整路径,因为这就是make的工作方式。所以你必须有类似的东西:

$(OBJS) : $(OBJDIR)/%.o: $(SRC_DIR)/%.c $(INCLUDES)       
        @echo $(CC): [$(notdir $<)] '->' [$(notdir $@)]                          
        @$(CC) -c $< $(CFLAGS) -o $@

现在如果另外你希望能够运行一个简单的make foo.o,那么你应该为真实目标定义额外的“别名”目标。这些规则只适用于短手,它们实际上并没有做任何事情。类似的东西:

$(BASE_OBJS) : %.o : $(OBJDIR)/%.o