depurando uma declaração em um Makefile no OpenBSD

1

Não está claro para mim, de onde vem o erro, segue o código Makefile:

platform_id = $$( uname -s )

platform = $$( \
    case $(platform_id) in \
        Linux | FreeBSD | OpenBSD | NetBSD ) echo $(platform_id) ;; \
        * ) echo Unrecognized ;; \
    esac )

e o primeiro alvo no Makefile é:

check:
    echo $(platform); echo

No Linux Mint 19.0, e no FreeBSD 11.2, ele funciona sem problemas, testado com GNU make e BSD make . Quero dizer, em ambos os sistemas com gmake e bmake .

Eu sou novo no OpenBSD 6.4, e ser incapaz de encontrar a causa do erro é frustrante.

A mensagem de erro com o comando segue:

echo $(  case $( uname -s ) in Linux | FreeBSD | OpenBSD | NetBSD ) echo $( uname -s ) ;; * ) echo Unrecognized ;;  esac ); echo
/bin/sh: syntax error: ';;' unexpected
*** Error 1 in /root (Makefile:47 'check')

Como não tenho adições de convidado instaladas ainda, devo ter transcrito, mas verificado duas vezes, deve estar correto.

    
por Vlastimil 23.10.2018 / 09:22

1 resposta

2

Você está usando um shell com um analisador quebrado ...

Segundo plano: a análise de $(command) precisa de um analisador recursivo para funcionar corretamente.

Observe que a expressão completa $(command) precisa estar em uma única string e command pode ser realmente complexo. Para encontrar o fim do comando, os shells modernos chamam recursivamente o analisador e deixam que ele pare no primeiro coilde% supérfluo. ) e mksh então convertem a árvore de sintaxe binária de volta em um comando, enquanto bosh embaralha os caracteres lidos pelo analisador recrusivo em um buffer.

POSIX (realmente ksh88) acreditava que isso funcionaria com um analisador de cadeia simples que só conta ksh93 e ( e adicionou um requisito para adicionar ) antes dos rótulos de caso.

Como seu comando não está correto em relação ao que POSIX acredita, você pode tentar novamente com a mudança:

    Linux | FreeBSD | OpenBSD | NetBSD ) echo $(platform_id) ;; \

para:

    ( Linux | FreeBSD | OpenBSD | NetBSD ) echo $(platform_id) ;; \

e

* ) echo Unrecognized ;; \

em

( * ) echo Unrecognized ;; \

Se o seu shell estiver usando um analisador de contagem tão primitivo, ele deve funcionar com essa mudança.

    
por 23.10.2018 / 09:39