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 fazer realmente funciona! Este é o comando que ele executa:
cc test.c -o test
Não encontrei nada útil na documentação. Como isso é possível?
PS Uma nota adicional: Mesmo o idioma não está especificado; Como test.c
está disponível, o GNU make
usa cc
. Se existe test.cpp
ou test.cc
(quando não há test.c
), ele usa g++
(e não c++
).
make
para ferver água, e usando suas regras internas,make
só vai descobrir como;)make
verifica sua geladeira e descobre que há farinha disponível e, em seguida, assa um bolo padrão para você a partir de sua receita interna. :-)Respostas:
O Make faz isso usando suas regras internas . Eles dizem em particular como compilar código C e como vincular programas de objeto único.
Na verdade, você nem precisa de um Makefile:
funcionaria sem um.
Para ver as regras ocultas que tornam tudo isso possível, use a
-p
opção sem Makefile:Como apontado por alephzero , o Make possui regras embutidas há muito tempo (se não sempre); A primeira versão de Stuart Feldman no Unix V7 as define
files.c
, e seu artigo de 1979 as menciona. Eles também fazem parte da especificação POSIX . (Isso não significa que todas as implementações do Make os suportam - o antigo Borland Make for DOS não, pelo menos até a versão 3.0.)fonte
test.c
pode ser usado para produzirtest
.make -d
irá mostrar-lhe o processo em detalhe ...make
muito antes da invenção do GNU ou POSIX. A primeira versão foi escrita há quase 40 anos, e havia algumas versões de protótipo criadas a partir de shell scripts, mesmo antes disso.CPP
ainda chama o pré-processador (cc -E
normalmente); o compilador C ++ éCXX
.CXX
nesse contexto é a variável Make, não um comando -$(CXX)
em um Makefile será substituído por um comando para executar um compilador C ++.