首页 > 解决方案 > 如何根据目标更改 Makefile 依赖文件列表

问题描述

我的 Makefile 编译文件列表,但我想根据目标附加新文件。真正的makefile可以在这里找到

https://github.com/fangq/mmc/blob/v1.7.9/src/Makefile#L4 https://github.com/fangq/mmc/blob/v1.7.9/commons/Makefile_common.mk#L192-L194

但为了说明这个问题,我有下面的简化片段

OBJDIR=build
OBJSUFFIX=.o
BINARY=proj
FILES:=file1 file2

OBJS:= $(addprefix $(OBJDIR)/, $(FILES))
OBJS:= $(addsuffix $(OBJSUFFIX), $(OBJS))

opt: FILES+=file3   # append a file for a target
opt: OBJS:= $(addprefix $(OBJDIR)/, $(FILES))
opt: OBJS:= $(addsuffix $(OBJSUFFIX), $(OBJS))

##  Link  ##
all opt: $(BINARY)

##  Compile .c files  ##
$(OBJDIR)/%$(OBJSUFFIX): %.c
    @$(ECHO) Building $@
    $(CC) $(CCFLAGS) $(USERCCFLAGS) -I$(INCLUDEDIR) -o $@  $<

$(BINARY): $(OBJS)
    @$(ECHO) Building $@
    # link file1.o file2.o         when make
    # link file1.o file2.o file3.o when make opt

我的目标是在键入时make,我想编译和链接file1.o/file2.o,但是在键入“ make opt”时,我希望 makefile 编译file1.o/file2.ofile3.o不是。

但我上面的代码片段无法做到这一点。它只能更改OBJS,但会在编译中跳过 file3。

有解决办法吗?

标签: cmakefilegnu-make

解决方案


首先,您从未声明这opt取决于$(OBJS)任何地方。

但更重要的是,您不能使用特定于目标的变量来修改先决条件。目标特定变量的值仅在配方中可用。请参阅第二段中讨论的文档。

幸运的是,你只是让这变得比它需要的更复杂。而不是这个:

opt: FILES+=file3   # append a file for a target
opt: OBJS:= $(addprefix $(OBJDIR)/, $(FILES))
opt: OBJS:= $(addsuffix $(OBJSUFFIX), $(OBJS))

你所要做的就是写这个:

opt: $(OBJS) $(OBJDIR)/file3$(OBJSUFFIX)

推荐阅读