Bash prorrogado globbing dentro de um Makefile

11

Eu quero fazer uma operação em todos os arquivos em uma pasta específica que não inicie com um prefixo específico (digamos, exclude_ ). Eu tenho um loop bash for com um glob estendido que se parece com isso:

for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done

Na linha de comando, isso funciona bem:

 $ for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
 foo/bar/apple
 foo/bar/pear
 foo/bar/banana

Mas, quando eu uso em um makefile:

target:
    for FILE in foo/bar/!(exclude_*) ; do echo $$FILE ; done

Eu recebo o seguinte erro:

$ make
for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
/bin/sh: -c: line 0: syntax error near unexpected token '('
/bin/sh: -c: line 0: 'for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done'

Existe algum escape necessário que eu perdi?

    
por Timothy Jones 15.07.2013 / 07:46

4 respostas

4
  1. Você precisa definir extglob .
  2. Você precisa dizer ao make para usar bash, não sh.

Makefile:

SHELL=/bin/bash
.SHELLFLAGS="-O extglob -c"
 ...
    
por 15.07.2013 / 07:54
8

Seria mais idiomático e mais portátil resolver isso com o Make e não com os hacks do Bash. E se alguém não tiver o Bash instalado?

De qualquer forma, aqui está a maneira correta de faça em Make:

FOOFILES = $(filter-out foo/bar/exclude_%,$(wildcard foo/bar/*))

target:
    for FILE in ${FOOFILES}; do echo $$FILE ; done
    
por 15.07.2013 / 09:19
2

Aqui está uma maneira mais simples:

SHELL:=/bin/bash -O globstar

que ativará a opção shell globstar (que também funciona no BSD / OS X).

    
por 10.05.2015 / 20:20
0

Adicione isto ao topo do Makefile:

SHELL := bash -O extglob
    
por 05.01.2017 / 17:29

Tags