Costumo achar a sintaxe do Bash muito útil, por exemplo, substituição de processos como em diff <(sort file1) <(sort file2)
.
É possível usar esses comandos do Bash em um Makefile? Estou pensando em algo assim:
file-differences:
diff <(sort file1) <(sort file2) > $@
No meu GNU Make 3.80, isso causará um erro, pois ele usa o shell
invés de bash
para executar os comandos.
/bin/sh: -c: line 0: syntax error near unexpected token
(''Respostas:
Na documentação do GNU Make,
Então coloque
SHELL := /bin/bash
no topo do seu makefile e você deve estar pronto.BTW: Você também pode fazer isso para um destino, pelo menos para o GNU Make. Cada destino pode ter suas próprias atribuições de variáveis, assim:
Isso será impresso:
Consulte "Valores variáveis de destino específicos" na documentação para obter mais detalhes. Essa linha pode ir a qualquer lugar no Makefile, não precisa ser imediatamente antes do destino.
fonte
man
. Fale sobre horários. : Pinfo
na verdade, mas acho que realmente ajudou Andy. Eu sei que tive dias assim ...SHELL=/bin/bash
como a primeira linha do Makefile (ou logo após o comentário).Você pode ligar
bash
diretamente, use a-c
bandeira:Obviamente, talvez você não consiga redirecionar para a variável $ @, mas quando tentei fazer isso, recebi
-bash: $@: ambiguous redirect
uma mensagem de erro; portanto, talvez você queira investigar isso antes de entrar nessa (embora eu usando o bash 3.2. algo, então talvez o seu funcione de maneira diferente).fonte
Se a portabilidade for importante, talvez você não queira depender de um shell específico no seu Makefile. Nem todos os ambientes têm o bash disponível.
fonte
Você pode chamar o bash diretamente no seu Makefile em vez de usar o shell padrão:
ao invés de:
fonte
make
ignora o valor da variável de ambiente SHELL.Existe uma maneira de fazer isso sem definir explicitamente sua variável SHELL para apontar para o bash. Isso pode ser útil se você tiver muitos makefiles, pois o SHELL não é herdado pelos makefiles subsequentes ou retirado do ambiente. Você também precisa ter certeza de que qualquer pessoa que compila seu código configura seu sistema dessa maneira.
Se você executar
sudo dpkg-reconfigure dash
e responder 'não' ao prompt, seu sistema não usará o traço como shell padrão. Em seguida, ele apontará para o bash (pelo menos no Ubuntu). Observe que usar o traço como shell do sistema é um pouco mais eficiente.fonte
sh
, o bash é executado no modo de compatibilidade (set -o posix
). A funcionalidade que o OP está tentando usar, substituição de processo, não está disponível neste modo.Uma maneira que também funciona é colocá-lo dessa maneira na primeira linha do seu destino:
fonte