【问题标题】:How does GNU make's "file" function work?GNU make 的“文件”功能是如何工作的?
【发布时间】:2015-06-11 23:25:48
【问题描述】:

我想我可能需要使用 GNU make 中的文件功能,只是不能按照他们给出的例子。我在网上看过,但没有看到任何解释更多的帖子。这是他们给出的例子:

program: $(OBJECTS)
$(file >$@.in,$^)
$(CMD) $(CMDFLAGS) @$@.in
@rm $@.in

我想我知道它在高层次上做什么,正如手册中解释的那样。

$@.in 

是所有目标文件的列表

$^ 

是源文件列表

我不确定第三行是如何使用@$@.in 或开头有什么@ 符号。请问这是什么意思?它应该做什么?

【问题讨论】:

  • 为什么你认为你需要使用$(file)?你也有足够新的make版本吗?我认为这是 4.1 的新功能。
  • 这是个好问题。手册上讲过使用这个函数向命令行传递参数?我想如果到目前为止没有人使用它,也许我可以不用它。
  • 我知道我有 4.0 和 Ubuntu 14.10。我将它降级是为了与 Android Studio 兼容。我不确定他们现在用最新的 Ubuntu 推动什么。
  • 只是为了清楚;为了与 AOSP 兼容,我将 make 降级。
  • 是的,看起来 $(file) 是 4.0 功能而不是 4.1。

标签: gnu-make gnu


【解决方案1】:

该配方操作的关键在the manual之前的散文中给出:

许多命令使用以@ 为前缀的参数指定包含更多参数的文件的约定。然后你可以这样写你的食谱:

program: $(OBJECTS)
    $(file >$@.in,$^)
    $(CMD) $(CMDFLAGS) @$@.in
    @rm $@.in
  • $@ 是目标文件(任何给定配方中只有一个)

  • $@.in 是名称末尾添加了.in 的目标文件。

  • $^ 是目标所有先决条件的“列表”。

  • @$@.in 是目标的名称,.in 结尾,@ 开头。

因此,该配方中的$(file ...) 调用将目标的先决条件列表以“覆盖”模式写入名为program.in 的文件中,然后使用@filename 约定将该文件名传递给$(CMD) 命令提到了。

【讨论】:

  • 感谢您的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多