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)?

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.


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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.