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.s
到 boot.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
扩展名。
我偶然发现了一个看起来很奇怪的 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.s
到 boot.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
扩展名。