Como este Makefile faz o programa C sem especificar um compilador?

41

Eu estava usando um Makefile do livro " Advanced Linux Programming (2001)" [código] . Foi estranho para mim ver que o GNU make compila o código corretamente, sem especificar um compilador no Makefile. É como assar sem receita!

Esta é uma versão mínima do código:

test.c

int main(){}

Makefile

all:            test

e faça realmente funciona! Este é o comando que ele executa:

cc     test.c   -o test

Não encontrei nada de útil na documentação. Como isso é possível?

P.S. Uma nota adicional: Até a linguagem não é especificada; Como test.c está disponível, o make do GNU usa cc . Se houver test.cpp ou test.cc (quando não houver test.c ), ele usará g++ (e não c++ ).

    
por Ho1 22.11.2016 / 19:17

1 resposta

68

Faça isso usando suas regras incorporadas . Estes dizem em particular como compilar o código C e como ligar programas de objeto único.

Você nem precisa de um Makefile:

make test

funcionaria sem um.

Para ver as regras ocultas que tornam tudo isso possível, use a opção -p sem Makefile:

make -p -f /dev/null

Como apontado por alephzero , o Make tem regras internas há muito tempo (se não sempre); A primeira versão de Stuart Feldman no Unix V7 define-os em files.c e seu artigo de 1979 os menciona. Eles também fazem parte da especificação POSIX . (Isso não significa que todas as implementações do Make o suportem - o antigo Borland Make para DOS não, pelo menos até a versão 3.0.)

    
por 22.11.2016 / 19:22