Definindo regras no Makefile
Vamos agora aprender as regras do Makefile.
A sintaxe geral de uma regra de destino Makefile é -
target [target...] : [dependent ....]
[ command ...]
No código acima, os argumentos entre colchetes são opcionais e reticências significam um ou mais. Aqui, observe que a guia para iniciar cada comando é necessária.
Um exemplo simples é fornecido abaixo, onde você define uma regra para tornar seu alô de destino de três outros arquivos.
hello: main.o factorial.o hello.o
$(CC) main.o factorial.o hello.o -o hello
NOTE - Neste exemplo, você teria que fornecer regras para fazer todos os arquivos de objeto dos arquivos de origem.
A semântica é muito simples. Quando você diz "fazer alvo", omakeencontra a regra de destino que se aplica; e, se algum dos dependentes for mais novo que o destino,makeexecuta os comandos um de cada vez (após a substituição da macro). Se algum dependente tiver que ser feito, isso acontece primeiro (então você tem uma recursão).
Maketermina se algum comando retornar um status de falha. A seguinte regra será mostrada em tal caso -
clean:
-rm *.o *~ core paper
Makeignora o status retornado nas linhas de comando que começam com um travessão. Por exemplo, quem se importa se não houver um arquivo principal?
Makeecoa os comandos, após a substituição da macro, para mostrar o que está acontecendo. Às vezes, você pode querer desligar isso. Por exemplo -
install:
@echo You must be root to install
As pessoas esperam certos alvos nos Makefiles. Você deve sempre navegar primeiro. No entanto, é razoável esperar que os destinos all (ou apenas make), install e clean sejam encontrados.
make all - Compila tudo para que você possa fazer testes locais antes de instalar os aplicativos.
make install - Ele instala aplicativos nos lugares certos.
make clean - Limpa aplicativos, elimina os executáveis, quaisquer arquivos temporários, arquivos de objetos, etc.
Regras implícitas do Makefile
O comando é aquele que deve funcionar em todos os casos em que construímos um executável x a partir do código-fonte x.cpp. Isso pode ser declarado como uma regra implícita -
.cpp:
$(CC) $(CFLAGS) [email protected] $(LDFLAGS) -o [email protected]
Esta regra implícita diz como fazer x de xc - execute cc em xc e chame a saída x. A regra está implícita porque nenhum alvo específico é mencionado. Pode ser usado em todos os casos.
Outra regra implícita comum é para a construção de arquivos .o (objeto) a partir de .cpp (arquivos de origem).
.cpp.o:
$(CC) $(CFLAGS) -c $<
alternatively
.cpp.o:
$(CC) $(CFLAGS) -c $*.cpp