Por que as strings aqui no Makefiles não usam o Bash?

2

Acabei de resolver um problema com o meu Makefile (s). Faça viagens por cada <<< com a mensagem de erro

/bin/sh: 1: Syntax error: redirection unexpected

E eu gostaria de saber por quê. (Estou usando o Bash como SHELL )

Nos meus projetos atuais, experimentei muitas receitas ao longo das linhas:

target:
    read FOO <<< "XXX"; \
    read BAR <<< "YYY"; \
    read BAZ <<< "ZZZ"; \
    someprog -a param0 -b $$FOO -c param1 -d $${BAR} -e param2 -f $${BAZ} >$@

Tentar isso resultará em um erro para cada <<< , conforme descrito no início. Minha solução alternativa é

target.dep:
    echo "XXX YYY ZZZ" >$@

target: %: %.dep
    read FOO BAR BAZ < $<;\
    someprog -a param0 -b $$FOO -c param1 -d $${BAR} -e param2 -f $${BAZ} >$@

o que significa que eu coloco minhas coisas em arquivos temporários que eu li com < , o que funciona muito bem. Quando copio e colo minha saída do make em um prompt bash normal, todos os comandos funcionam da maneira esperada, mesmo com o <<< . Estou bastante certo de que meu problema é que usar o operador <<< , ou seja, aqui strings, quebra algo. Por que isso e existe uma maneira de fazer aqui as strings funcionarem no Makefiles?

P.S .: Sim, às vezes eu sinto que a autotools seria a melhor escolha do que a make.

    
por Bananguin 22.05.2018 / 13:50

2 respostas

5
/bin/sh: 1: Syntax error: redirection unexpected

significa que você não usa o bash como seu shell, apesar de suas expectativas em contrário. bash como sh reconhece aqui strings fine (então seu Makefile funcionaria no Fedora), mas por exemplo traço como sh não. A menos que seja dito o contrário, utilize o /bin/sh como seu shell; ele ignora seu shell de usuário padrão.

Configuração

SHELL=/bin/bash

no seu Makefile deve consertar as coisas para você; pelo menos, faz para mim em um sistema mostrando os mesmos sintomas que o seu.

P.S.: Yes, sometimes I feel autotools would be the better choice over make.

Autotools e Make não abordam os mesmos problemas; eles são complementares e usar o Autotools ainda significaria usar o Make ...

    
por 22.05.2018 / 13:55
4

Como você pode ver na mensagem de erro, o shell que o make chama não é bash , mas /bin/sh . sh geralmente não entende strings aqui.

Se você definir o make variable SHELL to /bin/bash (ou qualquer que seja o caminho para esse shell em seu sistema), ele usará bash em vez de sh .

Veja também a documentação relevante do GNU make sobre isso em link

    
por 22.05.2018 / 13:54