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