Comecei a usar o modo organizacional para planejar minhas tarefas no sistema no estilo GTD . Colocando todos os arquivos org no diretório de uma pasta do Dropbox , eu executo o emacs para editar / gerenciar esses arquivos de três máquinas locais diferentes: Cygwin, Mac OS X e Debian. Como também uso o MobileOrg para acessar esses arquivos organizacionais no meu iPad, um checksums.dat
arquivo deve ser mantido atualizado quando forem feitas alterações. Isso pode ser feito executando md5sum *.org > checksums.dat
.
O problema é que existem três comandos diferentes para o md5sum
comando: md5sum.exe
no Cygwin, md5
no Mac OS X e md5sum
no Debian. A situação mais ideal é um makefile, armazenado em uma instalação do Dropbox, detecta qual comando está disponível na máquina atual e executa esse comando para executar a operação de soma de verificação md5.
autotools
make checksum
para gerar dados de soma de verificação em uma pasta Dropbox, desejo que o makefile use um comando apropriado após detectar qual comando de soma de verificação está disponível na máquina atual.Respostas:
Comandos possíveis para gerar uma soma de verificação
Infelizmente, não há utilitário padrão para gerar uma soma de verificação criptográfica. Há um utilitário padrão para gerar um CRC:
cksum
; isso pode ser suficiente para o seu objetivo de detectar alterações em um ambiente não hostil.Eu recomendaria o uso do SHA1 em vez do MD5. Não há muitos sistemas que possuem um utilitário MD5, mas não o SHA1, e se você usar somas de verificação criptográficas, use um algoritmo sem método conhecido para encontrar colisões (assumindo que você também verifique o tamanho).
Uma ferramenta que não é padrão, mas comum e pode calcular resumos é o OpenSSL . Está disponível para Cygwin, Debian e OSX, mas infelizmente não faz parte da instalação padrão no OSX.
No OSX 10.6, existe um
shasum
utilitário, que também está presente no Debian (faz parte doperl
pacote) e acredito no Cygwin também. Este é um script Perl. A maioria dos sistemas unix possui o Perl instalado, então você pode agrupar esse script junto com o makefile se estiver preocupado com esse script não estar disponível em todos os lugares.Selecionando o comando certo para o seu sistema
Ok, digamos que você realmente não consiga encontrar um comando que funcione em qualquer lugar.
Na concha
Use o
type
built-in para ver se um comando está disponível.GNU make
Você pode usar a
shell
função para executar um snippet de shell quando o makefile for carregado e armazenar a saída em uma variável.Portátil (POSIX) marca
Você só pode executar comandos shell na regra, portanto, cada regra que calcula uma soma de verificação deve conter o código de pesquisa. Você pode colocar o trecho em uma variável. Lembre-se de que linhas separadas nas regras são avaliadas independentemente. Lembre-se também de que os
$
sinais que devem ser passados para o shell precisam ser escapados$$
.fonte
-P
opção dotype
comando para obter o método "GNU make" descrito acima para funcionar corretamente, então eu acabei comsum := $(shell { type -P sha1sum || type -P sha1 || type -P shasum; } 2>/dev/null)
.type -P
só funciona se o seu shell for bash, não se for, por exemplo, ksh ou dash (que é o caso do Ubuntu entre outros). Você pode usarcommand -v
para portabilidade.type
para usarcommand
. Os outros métodos também devem ser atualizados?type
é uma maneira correta e portátil de testar a presença de um comando, o problema é que ele produz uma saída semelhantesha1sum is /usr/bin/sha1sum
ao nome do programa. Este foi o único local em que usei a saídatype
e não apenas o valor de retorno.É uma espécie de hack, mas você pode testar se cada um existe e executá-los se existirem:
Estou certo de que o cygwin reconhece comandos (incluindo
md5sum
) sem o.exe
, mas inclua-o se for necessário.fonte
which
os valores de saída não são portáteis. Use emtype
vez disso (e você provavelmente deseja usarif; then; elif
para evitar problemas, pois existem vários executáveis).which
etype
procure apenas executáveis de qualquer maneira, para que seu teste com -x seja inútil.Como você está executando o emacs, você pode usar o próprio emacs para calcular as somas de verificação: http://www.gnu.org/software/emacs/manual/html_node/elisp/MD5-Checksum.html .
fonte
As ferramentas automáticas GNU (como mencionadas em um comentário) ou também o CMake são uma opção.
As ferramentas automáticas do GNU são a abordagem mais tradicional, mas (e talvez falando apenas por mim) não acho que as pessoas estejam realmente empolgadas com a perspectiva de configurar inicialmente um projeto usando-as. Bem, é uma curva de aprendizado, em qualquer caso. O CMake é o garoto mais novo do setor, e talvez menos comum (e ainda tenha uma curva de aprendizado). Ele tem sua própria sintaxe e gera makefiles para sua plataforma. O CMake possui a vantagem distinta de não ser tão un * x-centric; funciona de maneira confiável no unix, windows e mac (por exemplo, pode gerar projetos msvc, por exemplo, em vez de makefiles.)
Edit: e, claro, desde que 'makefiles' foram sugeridos, esta resposta vai junto com essa presunção. Mas talvez apenas um script python ou (gasp) um programa Java simples seja mais apropriado para esta tarefa; a linguagem de script / programação faria o mesmo entre plataformas.
fonte