Eu sei que posso interromper um make
processo a qualquer momento sem precisar recompilar toda a árvore de origem novamente. Como eu sei, make
apenas compila um destino se ainda não estiver compilado, ou o código fonte é modificado após a última compilação.
Mas se eu interromper make
, certamente haverá um ou mais binários semi-prontos (dependendo do nível de simultaneidade). O que isso faz com eles na próxima vez que corro make
? Ou termina o destino atual quando pressiono Ctrl+ Cpara evitar binários parcialmente compilados?
11
Respostas:
Em termos simples, você pode pensar
make
em ter um número (possivelmente grande) de etapas, em que cada etapa recebe vários arquivos como entrada e cria um arquivo como saída.Uma etapa pode ser "compilar
file.c
parafile.o
" ou "usarld
para vincularmain.o
efile.o
entrarprogram
". Se você interrompermake
com CtrlC, então a etapa atualmente em execução será terminada que vai (ou deveria) remover o arquivo de saída que estava trabalhando. Geralmente, não existem "binários semi-prontos" deixados para trás.Ao reiniciar
make
, ele examinará os carimbos de data e hora de todos os arquivos de entrada e saída e execute novamente as etapas em que:Isso geralmente significa que, se uma etapa demorar muito para ser executada (é raro em computadores modernos, mas a
ld
etapa para programas grandes pode levar facilmente alguns minutos quandomake
foi projetada), a interrupção e a reinicializaçãomake
iniciarão essa etapa desde o início.A realidade da sua média
Makefile
é consideravelmente mais complicada do que a descrição acima, mas os fundamentos são os mesmos.fonte
Ctrl+ Cfaz com que
SIGINT
a seja enviada para o processo em execução. Este sinal pode ser capturado pelo processo. No código-fonte make, você pode encontrar uma armadilha para este sinal emcommands.c
:remove_intermediates()
é a função de limpeza demake
, veja sua definição aqui:E mais tarde, na função que você vê, eles serão efetivamente excluídos:
Conclusão: Geralmente não tenha medo de interromper uma compilação com
make
. Se não for um sinal inacessível (SIGKILL, SIGSEGV, SIGSTOP
), ele fará uma limpeza nos arquivos intermediários.fonte
SIGSEGV
é alcançável em muitos Unices.Quando algo pára
make
(seja ctrl-C, desligamento ou até mesmo um comando que falha), o trabalho já realizado permanece. Quando atualizado,make
faz como sempre: ele descobre o que ainda precisa ser feito (porque um arquivo foi alterado oumake
nunca foi processado, não importa) e continua o trabalho.A descrição acima pressupõe claramente que os
Makefile
s relevantes descrevem as dependências e comandos para executar corretamente; portanto, tudo o que precisa ser (re) feito é.fonte