2010-06-15 3 views
1

당신은 왜 메이크 규칙 나를 설명 할 수 없습니다 :. 메이크 및 RM -f 파일 {EXT1, EXT2, EXT3} 문제

clean: 
    rm -f foo.{bar1,bar2,bar3} 

파일을 제거 발생하지 않습니다 : foo.bar1의 foo.bar2 및 foo는. bar3? 여러 Makefile에서 그 패턴을 여러 번 보았지만, 현재 내 자신의 Makefile을 작성 중이며이 규칙이 올바르게 작동하지 않을 수 있습니다 (파일이 제거되지 않음).

내가 사용하고 있습니다 :

$ echo test.{a,b,c} 
test.a test.b test.c 

감사 :

  • GNU는 3.81 나는 의심으로 패턴
  • GNU bash는 4.1.5

배쉬 evals을! 다윗의 힌트에

UPDATE

감사합니다 내가 위에서 설명한 문제에 대한 해결책을 발견했다. gnu make는 기본적으로/bin/sh를 사용하기 때문에 a. {1,2,3}은 a.1 a.2 a.3으로 평가되지 않습니다.

만들 당신의 메이크에 행 다음에 쉬 추가 대신 사용 bash는 'make'를하려면. 지금부터

SHELL=/bin/bash 

{1,2,3} A.1의 A.2 A와 간주됩니다 .3

+0

@ Ak91 : 일반적으로 자기 대답 *을 답으로 쓰십시오. 자신의 질문에 답하는 것이 허용되고 권장됩니다. 그러나 자신의 답변을 수락하기 전에 며칠이 걸리며 그에 대한 포인트는 없습니다. – dmckee

+0

@dmckee : 죄송합니다, Stackoverflow 사이트를 처음 사용했습니다. 나는 그 규칙을 배워야 만한다. – user360872

+0

@ AK91 : 오리엔테이션을 통해서만이 문제를 언급 했으므로 나는 올바른 자기 대답을 투표하게되어 기쁩니다. – dmckee

답변

1

디렉토리에 clean이라는 파일이 있습니까? 그렇다면 make는 해당 타겟을 최신으로 간주하고 해당 명령을 실행하지 않습니다. 이 문제를 해결하려면 메이크 파일에이 줄을 추가 : 당신이 make clean을 실행할 때 출력

make: `clean' is up to date. 

을받을 경우

.PHONY: clean 

가 그 아마 당신의 문제입니다.

+0

디렉토리에 'clean'이라는 파일이 없습니다. 규칙은 입력 할 때 시작됩니다 : "make clean",하지만 {}은 평가되지 않으므로 rm은 foo.bar가 아닌 "foo. {bar1, bar2, bar3}"를 제거하려고 시도합니다 ... – user360872

-1

셸이 여기서 호출되지 않고 rm이 직접 호출되기 때문입니다. 쉘이 {} 대체를하기 때문에, rm '보는'원시 foo. {bar1, bar2, bar3} 문자열입니다. 그런 파일이 없기 때문에 아무 일도 일어나지 않습니다.

GNUmake의 문자열 매크로 중 하나를 사용하여 확장을 수행해야합니다.

+0

질문의 makefile 어떤 매크로도없이 나를 위해 일했다. (3.80과 bash 3.00에서) 나는 이것에 대해 나의 의구심을 가지고있다. –

+1

아, 그리고'make '문서에 따르면, 명령은'/ bin/sh'에 의해 해석됩니다. –

+0

매크로가없는 패턴을 평가하는 것이 가능하기 때문에 매크로를 사용하고 싶지 않습니다. 참조 : http://google.com/codesearch?q=file:Makefile$+rm.*\{.*, - 불행히도 저를 위해 작동하지 않습니다. – user360872