【问题标题】:How can I make a Makefile file target depend on a different path?如何使 Makefile 文件目标依赖于不同的路径?
【发布时间】:2017-06-10 07:57:49
【问题描述】:

我为这个模棱两可的标题道歉,由于我缺乏 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'这样的东西。

如果它是重复的,那么对不起,我找了一段时间,找不到类似的问题。

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

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

【问题讨论】:

  • "我正在尝试通过使用它们的基本名称(不带路径)作为目标来生成单个对象" make。无论如何,目标应该是文件,因为这就是make 的工作方式(make 从它们的时间戳确定是否必须重新构建这些文件)。你可以有一些“”目标(通常是allclean、...),但你真的没有想要通过 phony 目标创建中间对象文件,这意味着每次运行 make 时都要重建它们,即使没有任何改变。
  • 我知道目标每次都会被重建,我发布我的问题是为了知道是否有办法防止它发生。关于误用:这是我的第一个想法,但后来我回忆起例如 Linux 内核构建系统允许从主文件夹按名称构建 *.dtb 文件,而无需进行不必要的重建,我认为这里是可能的。

标签: makefile gnu-make


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-08
    • 2021-02-24
    • 1970-01-01
    • 2022-01-25
    • 2011-03-23
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    相关资源
    最近更新 更多