Gnu make:使用文件内容作为配方

时间:2013-04-15 08:54:18

标签: makefile dependencies gnu-make

考虑使用makefile,它可以使用文件中列出的生成行生成一些文件。例如,文件001使用第一行,002使用第二行等

这个文件可以改变(它有自己的依赖,但这不会改变)。 如果此文件中的某些行已更改,则应重新生成相应的文件。但其他文件不应该。

我找到的解决方案是这样的:对于每个文件都有一个标志文件,其内容正在生成它上次生成的行。在使用生成行重新生成文件后,我检查所有这个文件,如果行改变则删除它们。因此,将删除依赖于已删除文件的文件,而其他文件则不会。但如果使用msys-make,这种方法效果会太慢。

你能否提出任何其他解决方案,不需要对文件系统和可执行文件进行多次额外调用。

2 个答案:

答案 0 :(得分:0)

如果我理解你的描述正确,那么你所描述的是一个Makefile,它依赖于另一个功能上是Makefile的文件,但由于未知原因使用不同的格式。

将该文件转换为Makefile格式,并将include转换为原始Makefile。 (如果您使用的是GNU Make。)

答案 1 :(得分:0)

我们有类似于您的问题。我们有xml文件,比如foobar.xml,其中包含foobar.out

的依赖项
<files>
  <file>a</file>
  <file>b</file>
  <file>c</file>
</files>

我们决定坚持这个简单的布局,所以我们不需要解析xml。我们使用makepp(因为我们厌倦了gmake而没有注意到更改命令之类的依赖关系)。这给了我们内置的&sed命令(表达式实际上是Perl编程,但正如你所看到的,你不需要深入研究它)。以下是我们对三种线路的三个简单替换所做的事情:

%.d: %.xml
    &sed 's!<files>!$(stem).out: \\! || s!<file>(.+)</file>!$$1 \\! || s!</files>!!' \
        $(input) -o $(output)

include foobar.d

这会产生foobar.d,然后我们将其包括在内:

foobar.out: \
  a \
  b \
  c \

Stackoverflow在此处吞下最后一个空行,这样可以避免担心尾随反斜杠。