Como o aplicativo "make" sabe o destino padrão a ser construído se nenhum destino for especificado?

188

A maioria dos aplicativos Linux é compilada com:

make
make install clean

Pelo que entendi, make leva nomes de alvos de construção como argumentos. O mesmo installocorre com um destino que copia alguns arquivos e depois cleané um destino que remove arquivos temporários.

Mas qual destino será makeconstruído se nenhum argumento for especificado (por exemplo, o primeiro comando no meu exemplo)?

grigoryvp
fonte

Respostas:

232

Por padrão, ele começa processando o primeiro destino que não começa com um objetivo. conhecido como padrão ; para fazer isso, pode ser necessário processar outros alvos - especificamente aqueles dos quais o primeiro alvo depende.

O GNU Make Manual cobre todo esse material e é uma leitura surpreendentemente fácil e informativa.

Marcel Gosselin
fonte
61
Chamar o primeiro alvo allé apenas uma convenção.
Tobu
1
É útil executá-los separadamente se você estiver instalando para outros usuários, pois você só precisará executar o make installin sudo, e não a compilação inteira.
Scott Wales
2
FYI a entrada homem padrão para make não faz nenhuma menção do que acontece quando você não especificar um alvo ..
Sekm
2
Se o GNU make manual cobre esse material, por que essa pergunta foi feita? O manual é excelente para documentar como escrever regras, mas não faz menção sobre como escrever um Makefile.
Nick
1
Estou olhando para um arquivo make que includeé outro makefile, cujo primeiro objetivo é %.o : %.cpp. Portanto, o destino padrão é ... criar todos os arquivos .cpp?
Qwertie
178

Para salvar outras pessoas por alguns segundos e evitar que elas precisem ler o manual, aqui está a resposta curta. Adicione isso ao topo do seu arquivo make:

.DEFAULT_GOAL := mytarget

mytarget agora será o destino que será executado se "make" for executado e nenhum destino for especificado.

Se você tiver uma versão mais antiga do make (<= 3.80), isso não funcionará. Se for esse o caso, você pode fazer o que é mencionado anteriormente, basta adicioná-lo à parte superior do seu arquivo make:

.PHONY: default
default: mytarget ;

Referências: https://www.gnu.org/software/make/manual/html_node/How-Make-Works.html

Samuel
fonte
1
@nathan Torna mytarget o alvo padrão se alguém executar "make" sem nenhum parâmetro.
Samuel
1
Observe que .DEFAULT_GOAL não parece ser suportado no GNU make v3.80, e eu assumiria versões anteriores também (o v3.81 ainda o suporta). Se você estiver executando uma versão mais antiga do make, precisará garantir que seu destino padrão seja o primeiro / mais alto destino no seu arquivo make.
Samuel
4
"... para evitar que eles precisem ler o manual" é um dos pontos do SO: respostas rápidas a perguntas que, de outra forma, levariam algum tempo para serem encontradas na documentação antiga.
WattsInABox
1
"Adicione isto ao topo do seu arquivo make": adicionar ao topo não parece ser um requisito.
Aman profunda Gautam
2
Essa deve ser a resposta correta. Vitórias explícitas sobre implícitas neste caso.
Sion
34

O GNU Make também permite especificar o destino padrão do make usando uma variável especial chamada .DEFAULT_GOAL. Você pode até desmarcar essa variável no meio do Makefile, fazendo com que o próximo destino no arquivo se torne o destino padrão.

Ref: Manual do Gnu Make - Variáveis ​​Especiais

Sandip Bhattacharya
fonte