【问题标题】:Generating variable name source files when building with autotools使用自动工具构建时生成变量名源文件
【发布时间】:2013-08-03 00:02:03
【问题描述】:

这个问题建立在How to generate a source file when building using autotools

我想做类似的事情

<generated-c-files>: input.txt generator
    ./generator input.txt      # produces <generated-c-files>

当生成的 c 文件具有先验已知的固定名称时,前面的问题回答了这种情况。但是,根据 input.txt 的内容,我生成了可变数量的带有变量名称的文件。使用 autotools 有什么好的方法?

我正在使用通配符来获取所有生成的文件,这些文件被放置在一个构建文件夹中。但是,这需要我 make 两次,其中第一个 make 无法链接。这似乎是因为在执行 generator 之前评估了通配符。我想用一个成功的make 来做这件事,最好不要使用通配符。

【问题讨论】:

  • 生成的文件是否有共同的模式或什么?
  • 如果输出文件仅在扩展名中与输入不同,则可以使用后缀规则。通用模式规则是 GNU 扩展。
  • 如果目标文件不存在且先决条件文件列表未知,则不能使用模式或后缀规则。例如,假设您不知道 C 程序由哪些 C 源代码组成。如果 .o 文件都存在于以前的构建中,那么您可以推断该程序由所有 .o 组成,并且对于每个 .o,您可以推断相应的 .c 是先决条件。但是,当 .o 文件不存在时(清理(重新)构建),哎呀!

标签: makefile code-generation autotools autoconf automake


【解决方案1】:

我想说,由于解析input.txt 的责任被封装在generator 中,所以generator 可以告诉你要生成哪些文件。它应该有一些选项,所以你可以做一些事情,例如:

GENERATED_C_FILES := $(shell ./generator --list-output-files input.txt)

# We don't list generator as a prerequisite here because it has to exist
# for the above to work.

$(GENERATED_C_FILES): input.txt
    ./generator input.txt

有一些技巧可以让make 检测到generator 丢失,重建它,然后重新运行它自己。但是,更简单和清楚的是,也许generator 构建时间实用程序可以在./configure 时间生成,因此可以依赖它在make 时间出现。

【讨论】:

    猜你喜欢
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    相关资源
    最近更新 更多