Gnu Make> $ * и $ * значение - PullRequest
2 голосов
/ 09 мая 2019

я наткнулся на 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 пытается сделать.

1 Ответ

7 голосов
/ 09 мая 2019

.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 (через >) на имя файла, оканчивающееся на .map.Конечным результатом в этом примере является то, что boot.s будет собран в объектный файл с именем boot.o, а стандартный вывод будет записан в файл boot.map

Примечание: Я личноперенаправил бы стандартный вывод на имя файла с расширением .lst, а не с расширением .map.

...