【问题标题】:Gnu make : using content of file as recipeGnu make:使用文件内容作为配方
【发布时间】:2013-04-07 07:58:22
【问题描述】:

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

这个文件是可以改变的(它有它自己的依赖关系,但这并不重要)。 如果此文件中的某些行发生更改,则应重新制作相应的文件。但其他文件不应该。

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

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

【问题讨论】:

  • 您的问题陈述不清楚。这个文件的格式是什么,如何指定要拾取的依赖项?

标签: makefile dependencies gnu-make


【解决方案1】:

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

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

【讨论】:

  • 将其转换为 makefile 格式并不能解决问题。问题在于检测配方更改,如果考虑的话,作为makefile。可以用一些简单的方法做到吗?
  • @user2281791 GNU Make 的 include 会自动为你做这件事。阅读手册。
  • 配方更改不会导致重新制作目标。
  • 他们将在 makepp 中,它始终考虑 所有 依赖项,而不仅仅是较新的输入文件。
  • 您需要使包含的 makefile 成为您的目标的依赖项。
【解决方案2】:

我们有可能与您的问题类似的问题。我们有 xml 文件,比如 foobar.xml,其中包含 foobar.out 的依赖项

<files>
  <file>a</file>
  <file>b</file>
  <file>c</file>
</files>

我们决定坚持这种简单的布局,所以我们不需要解析 xml。我们使用makepp(因为我们厌倦了 gmake 没有注意到依赖关系,比如更改的命令)。这为我们提供了内置的&amp;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 在这里吞下了最后一个空行,这样就不必担心尾随的反斜杠了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-10
    • 2022-01-16
    • 2010-12-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    相关资源
    最近更新 更多