【问题标题】:How to change Makefile dependency file list based on target如何根据目标更改 Makefile 依赖文件列表
【发布时间】:2020-04-15 02:44:01
【问题描述】:

我的 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

但为了说明问题,我有以下简化的 sn-p

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

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

有解决办法吗?

【问题讨论】:

  • 首先想到的是,在没有指定 opt 的情况下删除 file3.o,然后你的链接步骤将大大简化为 glob,因为在编译步骤中不会生成 file3.o .

标签: c makefile gnu-make


【解决方案1】:

首先,您从未在任何地方声明 opt 依赖于 $(OBJS)

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

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

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

你所要做的就是写这个:

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

【讨论】:

  • 感谢您的评论。我还认为这会触发编译file3(不一定链接file3,除非我附加$OBJS),但由于某种原因,即使有这种依赖关系,file3 的编译也不会执行。不知道如何消化。
  • 对不起,我没有仔细阅读。是的,这行不通。我看到你已经接受了一个很好的答案。我个人认为你会遇到这个模型的麻烦,我会通过写出两个不同的二进制文件来做不同的事情。如果您保持原样,您可能应该添加.PHONY: $(BINARY) 以确保每次都重建它。
【解决方案2】:

变量MAKECMDGOALS 具有在命令行中给出的目标,您可以在所有目标之前的条件句中使用它来根据您想要的方式有条件地设置变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2017-10-03
    • 2011-01-23
    • 2021-02-07
    相关资源
    最近更新 更多