Existe uma regra geral para quando você deve usar 'make clean' em vez de apenas 'make'?

11

Estou escrevendo um programa com vários arquivos no momento e, aparentemente, executando apenas 'make' (como se pensaria intuitivamente que precisa ser feito na maioria das situações) por algum motivo faz com que meu programa falhe. Acho que posso fornecer mais detalhes do problema, mas o importante é que ele seja executado ao usar 'make clean'. Então, eu queria saber se alguém sabia a regra geral para executar 'make clean' em vez de apenas 'make'

Templário Sombrio
fonte

Respostas:

17

Você executa o make clean em duas situações - quando deseja empacotar o código-fonte (e, portanto, não precisa / deseja os objetos construídos) OU quando tem algum motivo para acreditar que os objetos construídos são ruins.

No seu caso, você está usando 'make clean' para corrigir um problema que provavelmente é o resultado de um Makefile de buggy. Algo não está recompilando quando deveria, e isso está fazendo com que o binário de saída fique ruim.

Há muitas razões para isso acontecer, dependendo da complexidade do seu projeto e de como você usou o make, mas a essência é: você precisa gastar algum tempo depurando o Makefile.

Michael Kohne
fonte
6
Você esquece "algumas mudanças no ambiente de construção", como compilador atualizado, novas versões de bibliotecas etc. sempre é uma boa idéia "limpar" nesses casos, apenas para garantir que todos os módulos estejam cantando na mesma folha de música!
James Anderson
2
@ JamesAnderson Alguém poderia argumentar que essas são simplesmente instâncias de Makefiles de buggy.
Kristof Provost
4
@ KristofProvost: Não tenho certeza se classificaria "New ABI" (possivelmente pela introdução de uma nova versão do compilador) como 'Makefile de buggy'. Está suficientemente fora do escopo do que eu esperaria 'fazer' olhar.
Vatine 23/09
1
É verdade, mas é possível (e nem tão difícil assim) adicionar o compilador aos makefiles como um pré-requisito. Isso é suficiente para pegar o problema. Em suma, não é um problema enorme e é muito raro de qualquer maneira. Defendi isso porque usei (e escrevi) makefiles que levam em consideração os sinalizadores do compilador. Isso também é bastante incomum em makefiles, mas muito útil (mais do que verificar o compilador;)). Minhas expectativas de makefiles bons e bem escritos são bastante altas. Minhas expectativas da média makefile são bastante inferiores ...
Kristof Provost
8

Eu concordo com a resposta de Michael Kohne em geral. Eu acrescentaria que você precisa ler os documentos de instalação para saber o que "limpar" realmente faz. Pode haver diferentes níveis de limpeza que você pode precisar usar, como "make realclean" e "make distclean". Existem convenções informais para isso, mas nada esculpido em pedra.

Bill Ruppert
fonte
2
+1: "você precisa ler os documentos de instalação para saber o que" limpar "realmente faz". Não há "regra geral". Você precisa realmente ler os documentos.
S.Lott
5

Entendo que este é o seu projeto, por isso é seu makefile. Meu objetivo é make sempre produzir uma construção correta, se for possível produzir uma. Se make cleanfor necessário recuperar de alguma condição, na minha opinião, isso makefileestá errado e deve ser corrigido. Se suas dependências foram calculadas corretamente, um simples makedeve recompilar tudo o que precisa ser recompilado.

Kevin Cline
fonte
2
Concordo. Atualmente, não é mais um problema de espaço em disco quase infinito, mas eu tenho idade suficiente para lembrar quando limpar e tornar realclean foram usados ​​principalmente para economizar espaço em disco após a criação do executável vinculado. Fazer GCC, apache, perl, etc deixou muitas coisas por aí.
Bill Ruppert
1

Eu corria "make clean" antes de uma compilação noturna. Nesse caso, o tempo adicional necessário para fazer uma compilação completa provavelmente não importará muito, mas a segurança adicional que você terá ao garantir que tudo está na versão correta provavelmente vale a pena.

Zachary K
fonte
Isso vai depender do tamanho do seu projeto. Onde eu costumo trabalhar, uma compilação incremental levaria de 2 a 4 horas com as alterações de outros sites realizadas durante a noite. Uma construção limpa pode levar de 7 a 9 horas. Além disso, às vezes tínhamos 2 ou 3 filiais que gostaríamos de construir. Mesmo em máquinas rápidas, bases de código muito grandes precisam ser tratadas de maneira bastante diferente das menores.
Taft