Makefile:lamedily评估的immedate赋值?

时间:2017-04-06 08:31:31

标签: makefile

我试图将* .s文件作为输入,并将扩展名的文件作为输出文件剥离。我以为我可以使用($basename ...)的立即绑定,但这不起作用。我的最小例子:

INPUT := *.s
OUTPUT := $(basename $(INPUT))

all:
    echo 'input:' $(INPUT)
    echo 'output:' $(OUTPUT)

运行时,生成

echo 'input:' *.s
input: hello.s int3.s
echo 'output:' *
output: Makefile int3 hello hello.o hello.s int3.s

我认为:=会强制立即进行评估,但它似乎实际上做了一个懒惰的绑定,并且基本名称剥离了" .s"来自" *"。因此,这将导致目录中的所有文件。如何让我只删除扩展名的.s文件?

1 个答案:

答案 0 :(得分:1)

您需要替换:

INPUT := *.s

使用:

INPUT := $(wildcard *.s)

第一个导致*.s立即分配到INPUT,您不会这样做 想。第二个导致立即分配文件名列表 来自$(wildcard *.s)的扩展,你想要它。

参见4.4.1 Wildcard Examples 并注意:

  

定义变量时不会发生通配符扩展。因此,如果你这样写:

objects = *.o
  

然后变量对象的值是实际的字符串'* .o'。 [...]   要将对象设置为扩展,请使用:

objects := $(wildcard *.o)