Makefile 내부의 확장 확장판


15

특정 접두사로 시작하지 않는 특정 폴더의 모든 파일 (예 :)에서 작업을 수행하려고합니다 exclude_. for다음과 같은 확장 글로브 가있는 bash 루프가 있습니다.

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

커맨드 라인에서 이것은 잘 작동합니다.

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

그러나 makefile에서 사용할 때 :

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

다음과 같은 오류가 발생합니다.

$ 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'

내가 놓친 탈출구가 있습니까?

답변:


7
  1. 을 설정해야합니다 extglob.
  2. sh가 아니라 bash를 사용하도록 make에 지시해야한다.

메이크 파일 :

SHELL=/bin/bash
.SHELLFLAGS="-O extglob -c"
 ...

2
흠. 어떤 이유로 든 .SHELLFLAGS나를 위해 작동하지 않았지만 깃발을 직접 넣는 것이 SHELL=/bin/bash -O extglob -c좋습니다. 어떤 아이디어가 있습니까?
Timothy Jones

1
GNU make를 사용하고 있지 않을 수도 있습니다. 또는 따옴표가 필요하지 않을 수도 있습니다.
Ignacio Vazquez-Abrams

GNU Make 3.81 및 GNU bash, 버전 4.1.2. 따옴표없이 시도했습니다. 기묘한.
Timothy Jones

어쨌든, 한 줄에 모두 넣으면 당신의 대답이 나를 위해 해결했습니다. 감사!
Timothy Jones

1
.SHELLFLAGS변수는 GNU 메이크 3.82에서 추가되었다. : 당신은 NEWS 파일을 통해 어떤 버전에 추가 된 기능을 확인하실 수 있습니다 git.savannah.gnu.org/cgit/make.git/tree/NEWS
매드 사이언티스트

11

Bash 핵이 아닌 Make 로이 문제를 해결하는 것이 관용적이고 휴대하기 쉽습니다. 누군가 Bash를 설치하지 않으면 어떻게됩니까?

어쨌든, 다음 은 Make에서 올바른 방법입니다 .

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

target:
    for FILE in ${FOOFILES}; do echo $$FILE ; done

2

더 간단한 방법은 다음과 같습니다.

SHELL:=/bin/bash -O globstar

이것은 globstar 쉘 옵션을 활성화합니다 (BSD / OS X에서도 작동합니다).


0

이것을 Makefile 상단에 추가하십시오 :

SHELL := bash -O extglob

1
작동하지 않습니다. 위의 버전이 맞습니다.
Desik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.