Idioma do Makefile para instalar no primeiro diretório disponível

2

Eu tenho um Makefile que, entre outras coisas, Instala um script de conclusão do Bash :

install [...] /etc/bash_completion.d/

Isso funciona bem no Ubuntu, mas as conclusões do Arch Bash são instaladas em /usr/share/bash-completion/completions .

Qual seria o idiomático GNU ou POSIX make way para lidar com isso? Espero que uma solução legal tenha algo como esses recursos:

  1. Se o comando install falhar, o destino deverá falhar.
  2. Atravessa a lista de diretórios em sequência, conforme escrito. No primeiro diretório que já existe (se houver):
    1. Instale o arquivo, se ele não existir,
    2. sobrescrever o arquivo se ele existir e não estiver atualizado (de acordo com make semântica),
    3. pule o arquivo se ele existir e estiver atualizado e
    4. parar de processar diretórios.
  3. Não é um erro se o arquivo não estiver instalado em nenhum lugar.
  4. Não é um erro (nem o Makefile deve tentar resolver este caso) se o arquivo já tiver sido instalado em um diretório e as execuções subseqüentes o instalarem em outro diretório. Isto é, dada uma lista de diretórios /a /b , se alguém

    1. cria /b ,
    2. coloca o arquivo em /b ,
    3. cria então /a e
    4. executa make

    o Makefile deve não detectar a presença de /b .

  5. Não é um erro se nenhum dos diretórios existir.
  6. O feedback sobre quais diretórios foram tentados seria bom, mas não obrigatório.
por l0b0 07.08.2013 / 17:48

2 respostas

1

A solução óbvia de estilo de script seria fazer isso:

for dir in /etc/bash_completion.d /usr/share/bash-completion/completions; \
do \
    if [ -d "$$dir" ]; \
    then \
        install [...] "$$dir" || exit 1; \
        break; \
    fi; \
done

No entanto, isso não é muito bom:

  • Muitos caracteres de escape
  • Precisa usar o feio || exit 1 para verificar erros

E ele não verifica se o arquivo está atualizado (pontos 2.2, 2.3).

    
por 07.08.2013 / 17:48
0

Uma maneira simples é testar cada instalação e continuar até que funcione.

for d in /etc/bash_completion.d /usr/share/bash-completion/completions; do \
  { cmp -s $(COMPLETION_SCRIPT) $$d/$(COMPLETION_SCRIPT) || \
    install $(INSTALL_OPTIONS) $(COMPLETION_SCRIPT) $$d; } && exit; \
done; \
exit 1
    
por 08.08.2013 / 02:57

Tags