Gnu Make >$* 和 $* 的意思

Gnu Make >$* and $* meaning

我偶然发现了一个看起来很奇怪的 Makefile,我无法理解它

这是 Makefile

AS=as -32 -Iinclude
LD=ld -m elf_i386
CC=gcc -m32 -fno-pie -fno-stack-protector
CPP=gcc -E -nostdinc -Iinclude
CFLAGS=-W -nostdlib -Wno-long-long -I include -fomit-frame-pointer

.s.o:
    ${AS} -a $< -o $*.o >$*.map

all: boot setup

boot: boot.o
    ${LD} --oformat binary -N -e start -Ttext 0x0000 -o boot $<

setup: setup.o
    ${LD} --oformat binary -N -e start -Ttext 0x0000 -o setup $<

clean:
    rm -f boot setup *.o *.map

我没看懂的部分是这个

.s.o:
    ${AS} -a $< -o $*.o >$*.map

在这种情况下 .s.o 的意义是什么 以及这个 $*.o >$*.map 试图做什么。

.s.o: 是为了与旧版本的 make 兼容而存在的后缀规则。它与模式规则 %.o : %.s 相同。 $* 是一个自动 make 变量,包含源文件名的基础(在本例中是不带扩展名 .o 的文件名)。

为处理 boot.sboot.o 而生成的命令将是:

as -32 -Iinclude -a boot.s -o boot.o >boot.map 

GNU Assembler(AS) 选项-a 生成一个列表文件到标准输出。 *nix shell(通过 >)将标准输出重定向到以 .map 结尾的文件名。此示例的最终结果是 boot.s 将被汇编到一个名为 boot.o 的目标文件中,标准输出将写入文件 boot.map

注意:我个人会将标准输出重定向到扩展名为 .lst 的文件名,而不是 .map 扩展名。