Eu sou iniciante make
e estou pensando em quando usar make clean
.
Um colega me disse que as compilações incrementais make
são baseadas nos registros de data e hora dos arquivos. Portanto, se você fizer o check-out de uma versão antiga de um arquivo no seu VCS, ele terá um carimbo de data / hora "antigo" e será marcado como "não há necessidade de recompilar esse arquivo". Em seguida, esse arquivo não seria incluído na próxima compilação.
Segundo o mesmo colega, seria uma razão para usar make clean
.
De qualquer forma, obtive a resposta para a pergunta "quando usar make clean
" de outras perguntas do StackExchange, mas minha outra pergunta é:
Por que construções incrementais usando
make
contam com registros de data e hora de arquivos e não no SHA-1, por exemplo? O Git, por exemplo, mostra que podemos determinar com êxito se um arquivo foi modificado usando o SHA-1.
É por problemas de velocidade?
make
foi criado nos anos 70. O SHA-1 foi criado nos anos 90. O Git foi criado nos anos 00. A última coisa que você deseja é que algumas construções obscuras que estavam trabalhando há 30 anos falhem repentinamente porque alguém decidiu se modernizar com um sistema testado e comprovado.make
seu software, ele não quebrará, no entanto,make
faz um esforço para ter compatibilidade com versões anteriores em novas versões. Mudar o comportamento do núcleo sem uma boa razão é praticamente o oposto disso. E as datas mostram por que não foi originalmente feito para usar o SHA-1 ou por que não foi fácil adaptá-lo quando ficou disponível (make
já tinha décadas antes).Respostas:
Um problema óbvio (e sem dúvida superficial) seria que o sistema de compilação teria que manter um registro dos hashes dos arquivos que foram usados para a última compilação. Embora esse problema possa certamente ser resolvido, seria necessário armazenamento lateral quando as informações de registro de data e hora já estivessem presentes no sistema de arquivos.
Mais seriamente, porém, o hash não transmitiria a mesma semântica. Se você sabe que arquivo T foi construído a partir de dependência D com hash de H 1 e, em seguida, descobrir que D agora hashes de H 2 , você deve re-build T ? Provavelmente sim, mas também pode ser que o H 2 realmente se refira a uma versão mais antiga do arquivo. Os carimbos de hora definem uma ordem, enquanto os hashes são comparáveis apenas para igualdade.
Um recurso que os carimbos de data / hora suportam é que você pode simplesmente atualizar o carimbo de data / hora (por exemplo, usando o utilitário de linha de comando POSIX
touch
) para tentarmake
pensar que uma dependência mudou ou - mais interessante - um destino é mais recente do que realmente é. Embora brincar com isso seja uma ótima oportunidade de se acertar no pé, é útil de vez em quando. Em um sistema baseado em hash, você precisaria de suporte do próprio sistema de compilação para atualizar seu banco de dados interno de hashes usados para a última compilação sem criar nada.Embora possa certamente ser argumentado o uso de hashes ao longo do tempo, meu argumento é que eles não são uma solução melhor para atingir o mesmo objetivo, mas uma solução diferente para atingir um objetivo diferente. Qual desses objetivos é mais desejável pode estar aberto ao debate.
fonte
D
agora for hashH2
, e você não tiver uma saídaT2
criadaD@H2
, precisará produzi-la e armazená-la. Posteriormente, independentemente de qual ordemD
alterna entre os estadosH1
eH2
, você poderá usar a saída em cache.Hashing de um projeto inteiro é muito lento. Você precisa ler todos os bytes de cada arquivo. O Git não mistura todos os arquivos sempre que você executa um
git status
. Os check-outs VCS também não definem normalmente a hora de modificação de um arquivo para a hora original de criação. Uma restauração de backup seria, se você tomar o cuidado de fazê-lo. Todo o motivo pelo qual os sistemas de arquivos têm registros de data e hora é para casos de uso como estes.Um desenvolvedor normalmente é executado
make clean
quando uma dependência não diretamente rastreada pelo Makefile é alterada. Ironicamente, isso geralmente inclui o próprio Makefile. Geralmente também inclui versões do compilador. Dependendo da qualidade do seu Makefile, ele pode incluir versões de bibliotecas externas.Esses são os tipos de coisas que tendem a ser atualizadas quando você faz uma atualização de controle de versão; portanto, a maioria dos desenvolvedores adquire o hábito de executá-
make clean
los ao mesmo tempo, para que saiba que está começando de uma forma limpa. Você pode fugir sem fazer isso o tempo todo, mas é realmente difícil prever os horários que você não pode.fonte
Alguns pontos sobre hashes versus timestamps em sistemas de compilação:
fonte