【问题标题】:Unknown number of targets from one prerequisite?一个先决条件中的目标数量未知?
【发布时间】:2020-05-23 01:41:45
【问题描述】:

我有一个进程,它接受一个输入文件(称为 test.in)并生成一些输出文件(模式名称 test-[0-9]?.out)。该过程应始终产生至少 1 个输出文件 (test-1.out),但输出文件的数量将取决于输入文件的内容(随着每个后续输出文件的数量顺序增长)。有没有办法在 make 规则中捕获这种依赖关系,或者我是否需要满足于仅列出保证的第一个目标(使用它来确定过期状态)并将此表单的所有文件的删除写入明确配方?

【问题讨论】:

  • 这个解决方案听起来不错。
  • 另一种方法是生成输出文件的存档(tar 或 zip),但这可能会使使用变得复杂,因为您很可能需要在使用前提取文件。
  • 嗯...也许不是存档,而是常规文件夹。文件夹可以成为 makefile 规则的目标吗?
  • 是的,但是由于文件夹在文件系统上的工作方式,最新检查会变得很奇怪。您必须将文件夹声明为 PHONY 并始终对其进行重新制作。顺便说一句,请务必标记您回复的人,例如“@Andreas 嗯……也许不是档案……”。否则,我不会收到您尝试讨论的通知。
  • @Andreas 啊,好吧,所以目录的想法只有在我不将它用于其他任何东西(不仅在 makefile 中,而且在系统的其他地方也是如此)的情况下才能合理地工作。这将很难跟踪,因为我需要能够使用输出文件。大多数时候只是阅读它们,但你永远不知道它们何时可能会得到touched 或以其他方式被意外修改。

标签: makefile


【解决方案1】:

从问题中发布我提出的解决方案(基于@Beta 的评论及其赞成票似乎是合理的):

只命名保证的第一个目标,并让该目标的配方删除模式中的其他文件:

test-1.out : test.in
        -rm test-[0-9].out test-[0-9][0-9].out
        <rest of recipe to produce all test-*.out files from test.in>

在这种情况下,test-1.out 的状态用作所有输出文件状态的替代。如果它已经过时,它们都是。配方的第一行保证删除所有输出文件(直到 test-99.out,如果生成的文件多于需要额外的 globbing 模式),因此一旦配方完成,只有新的文件存在(尤其是如果更新减少了输出文件的数量,这很重要)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-22
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 2010-11-23
    相关资源
    最近更新 更多