2013-05-14 2 views
0

여기에 실험용 Makefile이 있습니다.

.SECONDEXPANSION: 

~/hello.txt: $(shell echo '$$(@D)/')$(shell echo '$$(@F)' | sed -e 's/hello/bye/') 
    echo "$^" 

어떻게 든 나오지 명령이 작동하고 있는지 확인하지 않는 것은 대한 순환 종속성에게 불평

gmake: Circular /users/sim/hello.txt <- /users/me/hello.txt dependency dropped. 
gmake: *** No rule to make target `echo', needed by `/users/me/hello.txt'. Stop. 

내 예상되는 동작은 GNU가 ~/bye.txt 대신 찾고 확인했다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

이 작은 예제에서는 "bye.txt"를 명시 적으로 지정할 수 있지만 여전히 sed 명령이 적용되지 않는 이유는 알고 싶습니다. 도와 줘서 고마워.

+0

-1 오해의 소지가 제목. 허용 된 솔루션은 파이프 또는 sed와는 아무런 관련이 없습니다. – danorton

답변

1

나는 이유가 무엇인지 이해하지 못합니다. $(shell echo '$$(@D)/'); 왜 바로 $$(@D)/을 작성하지 않으십니까?

두 번째 확장에서는 $(shell ...) 함수가 즉시 평가되므로 두 번째 확장에서는 작동하지 않으므로 두 번째 확장은 작동하지 않습니다. $$(shell ...)을 써서 쉘 기능을 연기해야합니다.

그러나 작동 여부를 확신하지 못합니다. 나는 왜 너가 이것을하고 있는지 이해하지 못한다. 유용하게 만드는 몇 가지 큰 상황이 있다고 가정합니다. 때문에, 당신은 당신이 정적 패턴 규칙을 사용하여 훨씬 더 노골적 이상 수행 할 작업을 정확하게 수행 할 수 있습니다

~/hello.txt : %/hello.txt : %/bye.txt 
     echo "$^" 
+0

너는 놀랍다. 정말 고맙습니다!!!! – xorxorxor