【问题标题】:A make recipe that generates two files, independently独立生成两个文件的 make 配方
【发布时间】:2018-07-18 20:42:44
【问题描述】:

在我的 makefile 中,我有一个生成两个文件的配方。如果这两个文件中的任一个 已过期,则配方应该运行一次。所以是这样的:

file1 file2 : deps
    make_files

请注意,make_files 命令始终会生成两个文件,并且它的调用不依赖于目标(即,我们在其调用中不使用目标名称或任何词干)。

问题在于,make 将此解释为两条规则,一条用于 file1,一条用于 file2,如果两者都缺失(例如,使用 make -j 时),它可能会运行两次 make_files,这爆炸了(make_files 实际上是在另一个子目录中调用make,如果同时调用两次,这将不起作用)。

任何修复,例如告诉make 只运行一次make_files

现在我使用的 hack 是让 file2 依赖于 file1,即使它没有:

file2 : file1

这会导致make 序列化make_files 调用。但是,这并不总是很好用:如果两个文件都丢失了,它将运行make_files 一次来生成它们,但是如果file2 的时间戳比file1 晚,它将运行@ 987654340@再次。

【问题讨论】:

  • 查看stackoverflow.com/q/2973445/761374 了解最终的 S.O.这个问题的答案。
  • 你愿意拥有一个只有时间戳的虚拟文件吗?
  • @Beta - 是的,我愿意。

标签: makefile gnu-make


【解决方案1】:

如果您的两个文件确实像您的示例中那样共享一个共同的词干,那么您可以使用:

%1 %2: deps
        make_files

与显式规则不同,模式规则假定对配方的一次调用将创建所有目标模式。

【讨论】:

  • 文件有一个共同的“中间部分”。实际名称是libpfc.sopfc.ko。所以我猜这行不通?
  • @Beta - 好的,对,但前提是我没有在这个 Makefile 中构建任何其他 .so.ko 文件,对吧?
  • 如果您使用显式或静态模式规则来构建您的其他 .so / .ko 目标,那么它们不会干扰。
猜你喜欢
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
相关资源
最近更新 更多