【问题标题】:Makefile to archive/link together auto-generated source filesMakefile 将自动生成的源文件归档/链接在一起
【发布时间】:2009-10-28 07:47:09
【问题描述】:

基本上,我有一个文件“blah.txt”。该文件由“编译器”解析,并从中生成 N 个输出 .c 文件。我想要一个生成文件,它会从那个 .txt 文件生成 c 文件,然后编译所有文件并将它们存档在 libmystuff.a 中

我遇到过这样的事情:

all: dogen libmystuff.a

dogen: source.txt
    mycompiler $^

libmystuff.a: $(addsuffix .o, $(shell ls *.c))
    $(AR) rcs $@ $^

.PHONY: dogen

但显然这不起作用,因为依赖项是在开始时评估的,此时 *.c 还没有产生任何东西,因为它们不存在。

有谁知道如何做到这一点(没有明确列出所有生成的 *.c)?

【问题讨论】:

标签: automation dependencies makefile


【解决方案1】:

使用哨兵“​​makefile”强制make重新读取makefile并替换*.c的正确列表:

include sources-sentry

sources-sentry: source.txt
    mycompiler $^
    touch $@

libmystuff.a: $(addsuffix .o, $(shell ls *.c))
    $(AR) rcs $@ $^

include 指令用于包含其他makefile(就像C 的#include)。它有一个很好的特点,如果它包含的 makefile 本身就是一个目标,make 程序首先将它视为一个目标并尝试更新。如果它不是最新的,make 调用更新它所需的命令,然后重新读取 makefile,再次替换所有变量

因此,如果 source.txt 自上次处理后发生更改(时间记录为 sources-sentry file 的时间戳),源将被更新并重新调用 make ,*.c 被替换为 c 文件的更新集。

【讨论】:

  • 效果很好,只有一个问题很棘手:当我制作干净的目标时,它也会构建东西......
  • @246tNt ,你是对的,我没有解决这个问题的方法:-(
【解决方案2】:

Pavel Shved 是对的 (*),您必须重新运行 Make。这是我相当自豪的一个技巧。它将处理可能尚不存在的对象的依赖关系,并且不会不必要地运行。

来源 = $(通配符 *.c) 对象 = $(SOURCES:.c=.o) 全部:libmystuff.a ifeq ($(MAKELEVEL),0) libmystuff.a:source.txt 我的编译器 $^ @$(MAKE) -s $@ 别的 libmystuff.a:$(对象) $(AR) rcs $@ $^ 万一

(*) 我的宿敌,我们又见面了。

编辑:
如果一些 other 拨打电话 this... 我没有想到这一点。但我认为这会解决它:

来源 = $(通配符 *.c) 对象 = $(SOURCES:.c=.o) 全部:libmystuff.a libmystuff.a:source.txt 我的编译器 $^ @$(MAKE) -s phonyLib .PHONY: 伪库 phonyLib:$(对象) $(AR) rcs libmystuff.a $^

(是的,我知道,如果您有创建一个名为“phonyLib”的文件的冲动,您将无法使用此 makefile 进行构建,但我们不要反常。)

【讨论】:

  • 哦,我不会挑剔那个!相反,我会做......哦,没关系:)
  • 你在这个论坛上的时间是我的一半,并且赢得了四倍的声誉,而且英语不是你的母语,所以尽量忍住痛苦的眼泪。
  • 但是知道make 真的是我引以为豪的事情……事实上。 :-) 无论如何,这些讨论确实提高了我的知识。特别是,我应该改进递归make 调用与包括虚拟makefile 的方法。 (现在我会害羞地用英语评论你的帖子。)
  • 哦,看在上帝的份上……你的英语很好(如果我尝试用俄语评论,没有人能够阅读它,包括俄罗斯人)。在我开始阅读你的答案之前,我以为我对 Make 了如指掌。
【解决方案3】:

如果您的 .c 文件仅由 .txt 生成,那么您可以让 libmystuff.a 依赖于 txt,并在规则正文中评估 $(shell ls *.c)。

【讨论】:

  • 好吧,我需要 makefile 来实际编译 .c 和 makefile 中的其他地方,有规则指示如何使用选项和东西将 .c 转换为 .o,我不想必须在 libmystuff.a 目标中重复所有这些逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多