2013-09-02 4 views
0

내가 다른 디렉토리에있는 파일에 대한 심볼릭 링크를 생성하기위한 것입니다 내 Makefile의 규칙이 안 : 비록GNU는 VPATH와 함께합니다 원형 표시 대상,하지만 정말

VPATH = ../source 
foo: foo 
    ln -s $< [email protected] 

을 나는 ./foo으로 해결할 대상을 찾고 ../source/foo으로 해결해야하는 종속성을 알기 때문에 왜 make이 원형으로 간주되는지 이해합니다. 원형이 아닌 방식으로이 규칙을 표현할 수있는 방법이 있습니까?

+0

왜'foo'를 의존성으로 제거하지 않고'$ <'를'../ source/foo'로 바꾸지 않습니까? 나는 당신이'foo'에서'../ source/foo'로 의존성을 바꿀 수 있고'VPATH' 형을 제거 할 수 있었다고 생각합니다. –

+0

의존성을'.. ../ source/foo' 그리고'VPATH'를 없애는 것은 효과가있는 것처럼 보이지만, 그것은'VPATH'에 의존하는'Makefile'에서 다른 것을 수정해야한다는 것을 의미합니다. 나는 그것을 피하기를 바랬지 만 너무 많은 일이 아닙니다. – Anthony

답변

0

링크는 링크 대상의 변경에 의존하지 않습니다. 그것은 단지 존재할 필요가있다. 따라서이 전혀 필요 평범한 전제 조건은 없으며, 간단한 조각은 여전히 ​​다른 목적을 위해 VPATH 필요한 경우

foo: 
    ln -sf ../source/[email protected] 

그러나,이 제대로 작동하지 않을 것 원하는 것을 할 수 있습니다. 파일 ../source/foo 다음,도 만들기에 의해 생성되는 대상의 경우

VPATH := ../source 
$(CURDIR)/foo: 
    ln -sf ../source/$(@F) 

마지막 : 그 그렇다면, 가장 간단한 방법은 절대 경로를 사용하여이 규칙에 대한 VPATH을 무시하는 것입니다 날 것으로 보인다 아마도 가장 좋은 방법은 다음과 같습니다 우리는 그것의 존재에, 여기에 전제 조건의 변화에 ​​따라되지 않습니다

VPATH := ../source 

.SECONDEXPANSION: 
$(CURDIR)/foo: | ../source/$$(@F) 
    ln -sf $| 

참고. 그런데

, 내가 -f 옵션을 확인 -B 옵션을 지원해야하기 때문이다 사용하고 이유. 이 옵션은 여기에서 -f을 사용하지 않으면 작동하지 않습니다.

0

나는 당신이 여기하려는 것은 "VPATH 남용"의 범주에 해당 생각합니다.

내 경험이 반복 만트라 "명시 적 암시보다 낫다"이는 이유 중 하나입니다으로 나를 가리키고 있습니다. 수동 구성하는 GNU의 주장과는 달리, 내 경험은 크기가하지 않는 한 더 어렵게, 파일을 찾을 수 있기 때문에 더 크고 복잡한 프로젝트에서, 당신은 명시 적, 이하를 할 필요가 있다고 생각하는 저를 주도하고있다 그들의 경로는 명시 적입니다.

는 또한 VPATH를 사용할 필요 많은 당신이 완료 의존성 트리를 구축하지 않는 재귀 메이크업의 사용에서 비롯된 것을 믿는다 빌드 시스템을 올바르게 작성하면 VPATH가 전혀 필요하지 않습니다. 최상위 레벨 src/include/ 디렉토리를하고 이러한 경로를 기준으로 모든 inclussions합니다 관련 주제에

, 나는 하나 또는 두 개의 -I 디렉토리를 지정하는 확고한 신자입니다. 다시 말하면, 더 크고 복잡한 프로젝트의 경우 #include "my/really/cool/thing.h"은 단순히 #include "thing.h"보다 훨씬 유익합니다.

즉, -lfoo 구문을 사용할 수 있기 때문에 라이브러리, 특히 시스템 라이브러리에 VPATH를 사용한다는 아이디어에 대해 열려 있지만, 일반적으로이 구문을 사용하면 빌드를 위협 할 수 있으므로 사용하지 않을 것입니다. 재현성.