O que significa o símbolo% em Makefile

10

Estou brincando com makefiles e me deparei com % .o ou % .c . Pelo que entendi, ele especifica todos os arquivos c ou o . Mas por que esse trabalho:

%.o: %.c
        $(CC) -c $^  -o $@  

e isso não funciona

SOURCE := $(wildcard *.c)

$(SOURCE:.c=.o): SOURCE
        $(CC) -c $^  -o $@

Ambas as expressões especificam todos os arquivos. então o que o símbolo % .o: no arquivo make faz?

Mero
fonte

Respostas:

9

Ambas as expressões especificam todos os arquivos.

Não, a primeira regra diz makecomo obter um .oarquivo, dado o .carquivo correspondente . Observe o singular: um único arquivo.

A segunda regra (afirma) informa makecomo obter um monte de .oarquivos, dado outro grupo de .carquivos correspondentes . Observe o plural: todos os .carquivos resultantes do *.cglobbing.

Em uma nota lateral, %.o: %cé uma extensão GNU.

Por outro lado, você não aprenderá como usar o makeStackOverflow. Você deve ler um livro.

Satō Katsura
fonte
11

A construção:

%.o: %.c
        $(CC) -c $^  -o $@  

é uma regra padrão , que é um tipo de regra implícita. Ele especifica um destino e uma dependência e causa uma chamada $(CC)para cada destino. Enquanto isso:

SOURCE := $(wildcard *.c)

$(SOURCE:.c=.o): SOURCE
        $(CC) -c $^  -o $@

é uma regra padrão, mas possui (possivelmente) muitos destinos e muitas dependências. No entanto, por tudo isso, ele será chamado apenas $(CC)uma vez.

Stephen Rauch
fonte