como um makefile pode detectar se um comando está disponível na máquina local?

11

Comecei a usar o org-mode para planejar minhas tarefas em Sistema de estilo GTD . Colocando todos os arquivos org em um diretório de uma pasta Dropbox , eu executo o emacs para editar / gerenciar esses arquivos a partir de três máquinas locais diferentes: Cygwin, Mac OS X e Debian. Como eu também uso o MobileOrg para acessar esses arquivos organizacionais do meu iPad, um arquivo checksums.dat deve ser mantido atualizado quando qualquer mudanças são feitas. Isso pode ser feito executando md5sum *.org > checksums.dat .

O problema é que existem três comandos diferentes para o comando md5sum : md5sum.exe no Cygwin, md5 no Mac OS X e md5sum no Debian. A situação mais ideal é um makefile, armazenado em um foder 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 do md5.

    
por Federico Magallanez 13.01.2012 / 05:02

4 respostas

7

Comandos possíveis para gerar uma soma de verificação

Infelizmente, não há um utilitário padrão para gerar uma soma de verificação criptográfica. Existe um utilitário padrão para gerar um CRC: cksum ; isso pode ser suficiente para o propósito de detectar alterações em um ambiente não hostil.

Eu recomendaria o uso de SHA1 em vez de MD5. Não há muitos sistemas que possuam um utilitário MD5, mas nenhum SHA1, e se você for usar somas de verificação criptográficas, é melhor usar um algoritmo sem método conhecido para encontrar colisões (supondo que você também verifique o tamanho). / p>

Uma ferramenta que não é padrão, mas é comum e pode calcular resumos, é OpenSSL . Está disponível para Cygwin, Debian e OSX, mas infelizmente não faz parte da instalação padrão do OSX.

openssl dgst -sha1

No OSX 10.6, há uma shasum utilitário, que também está presente no Debian (é parte do pacote perl ) e eu acredito no Cygwin também. Este é um script em Perl. A maioria dos sistemas unix tem Perl instalado, então você pode empacotar esse script junto com seu makefile se estiver preocupado com o fato deste script não estar disponível em todos os lugares.

Selecionando o comando certo para o seu sistema

Ok, digamos que você não consegue encontrar um comando que funcione em todos os lugares.

No shell

Use o type integrado para ver se um comando está disponível.

sum=
for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do
  if type "${x%% *}" >/dev/null 2>/dev/null; then sum=$x; break; fi
done
if [ -z "$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi
$sum *.org

make do GNU

Você pode usar a shell function para executar um snippet de shell quando o makefile é carregado e armazena a saída em uma variável.

sum := $(shell { command -v sha1sum || command -v sha1 || command -v shasum; } 2>/dev/null)
%.sum: %
        $(sum) $< >$@

Portable (POSIX) make

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 as linhas separadas nas regras são avaliadas de forma independente. Lembre-se também que $ sinais que devem ser passados para o shell precisam ser escapados para $$ .

determine_sum = \
        sum=; \
        for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do \
          if type "$${x%% *}" >/dev/null 2>/dev/null; then sum=$$x; break; fi; \
        done; \
        if [ -z "$$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi

checksums.dat: FORCE
    $(determine_sum); \
    $$sum *.org
    
por 14.01.2012 / 02:51
5

É uma espécie de hack, mas você pode testar se cada um existe e executá-los:

[ -x "'which md5 2>/dev/null'" ] && md5 newfile >>sums
[ -x "'which md5sum 2>/dev/null'" ] && md5sum newfile >>sums

Tenho certeza de que o cygwin reconhece os comandos (incluindo md5sum ) sem o .exe , mas inclua-o se for necessário.

    
por 13.01.2012 / 06:21
2

Como você está executando o emacs, você pode usar o próprio emacs para calcular as somas de verificação: link .

    
por 13.01.2012 / 17:06
1

Ou GNU autotools (como mencionado em um comentário), ou também CMake é uma opção.

O GNU autotools é a abordagem mais tradicional, mas (e talvez falando apenas por mim) eu não acho que as pessoas estão realmente muito empolgadas com a perspectiva de inicialmente configurar um projeto usando-as. Bem, é uma curva de aprendizado, em qualquer caso. CMake é o garoto mais novo no bloco, e talvez menos comum (e ainda tem uma curva de aprendizado). Ele tem sua própria sintaxe e gera makefiles para sua plataforma. O CMake tem a vantagem distinta de não ser tão un-x-centric; Ele funciona de forma confiável em unix, windows e mac (por exemplo, ele pode gerar projetos msvc, por exemplo, em vez de makefiles.)

Editar: e, claro, desde que 'makefiles' foram sugeridos, esta resposta vai junto com essa presunção. Mas talvez apenas um script python ou (suspiro) um programa Java simples seja mais apropriado para essa tarefa; a linguagem de script / programação faria isso da mesma maneira em todas as plataformas.

    
por 13.01.2012 / 05:43