GNU make 的 "file" 函数如何工作?

How does GNU make's "file" function work?

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

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

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

$@.in 

是所有目标文件的列表

$^ 

是源文件列表

我不清楚第三行的@$@.in是怎么用的,也不知道开头的@是什么符号。请问这是什么意思?它应该做什么?

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

Many commands use the convention that an argument prefixed with an @ specifies a file containing more arguments. Then you might write your recipe in this way:

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

  • $@.in是在文件名末尾加上.in的目标文件。

  • $^是目标所有先决条件的"list"。

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

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