我试图将* .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文件?
答案 0 :(得分:1)
您需要替换:
INPUT := *.s
使用:
INPUT := $(wildcard *.s)
第一个导致*.s
立即分配到INPUT
,您不会这样做
想。第二个导致立即分配文件名列表
来自$(wildcard *.s)
的扩展,你想要它。
参见4.4.1 Wildcard Examples 并注意:
定义变量时不会发生通配符扩展。因此,如果你这样写:
objects = *.o
然后变量对象的值是实际的字符串'* .o'。 [...] 要将对象设置为扩展,请使用:
objects := $(wildcard *.o)