2011-04-06 2 views
0

나는이 양식의 make 규칙을 작성하는 시도 :Make는 디렉토리로 전환하기 전에 의존성을 추구합니까?

lib%.so: computations/%.h 
     make -C computations/ -f makefile $< 

출력 :

make -C computations/ -f makefile computations/test.h 
make[1]: Entering directory `/home/shai/csm/csm2/src/computations' 
make[1]: *** No rule to make target `computations/test.h'. Stop. 
make[1]: Leaving directory `/home/shai/csm/csm2/src/computations' 
make: *** [libtest.so] Error 2 

음,이 라이브러리를 전환 한 후 %.h를 찾는 것 같다. 아무 것도 아니야, 그냥 해봅니 다.

lib%.so: %.h 
     make -C computations/ -f makefile $< 

하지만 이제 규칙이 전혀 인식되지 않습니다.

출력 :

[email protected]:~/csm/csm2/src$ make libtest.so 
`make: *** No rule to make target `libtest.so'. Stop. 

내 마음을 가지고 노는 make인가? 종속성의 변경으로 대상을 인식하지 못하게 할 수 있습니까?

+1

, 나는 단지이 이상한 규칙입니다났습니다. 대상이 아닌 종속성을 업데이트합니다. 그것은'make '가 어떻게 사용되어지기위한 것이 아닙니다. – eriktous

답변

0

복사/붙여 넣기 방식 일 수도 있지만 두 번째 형식의 탭이 누락되었습니다.

+0

그래, 그 다음 붙여 넣기 문제 –

+0

, 난 몰라. 나는 너처럼 당황 스럽다. –

2

어떻게 종속성이 변경되면 대상 인식이 중단 될 수 있습니까?

test.h은 (는) 다른 디렉토리에 있기 때문에 종속성 패턴에 맞는 파일을 찾을 수 없기 때문일 가능성이 큽니다. VPATH을 사용하여 다른 디렉토리의 파일을 검색 할 수 있습니다.

편집 : $<computations/test.h로 치환되기 때문에 그러나 이것은 여전히 ​​(당신이있어 첫 번째 오류와 같이) 디렉토리 computations에서 찾을 수 없습니다되는, 완전히 문제가 해결되지 않습니다. $(notdir $<)을 시도해 볼 수는 있지만,보기 흉한 해킹이라고 생각합니다 (작동하는 경우, 시도하지 않았습니다). 이것은 메이크 파일과 프로젝트 구조의 디자인에서 기인합니다.

2

잘못된 것을 사용하고 있습니다.

만들기의 디자인은 마음에 실제로 매우 간단하다 : 당신이

  1. 대상을 작성할 (규칙의 본문)하는 방법을 말한다.
  2. 대상을 먼저 지정해야합니다 (종속성 목록).

다음으로 topological sorts을 종속 정보로 설정하면 본문이 올바른 순서로 실행됩니다.

$< (종속성 목록으로 확장 됨) 규칙은 호출 된 make에게 대상이 아닌 %.h 종속성을 작성한다고 알리는 것을 의미합니다. lib%.so. 규칙에서 대상을 만들어야합니다. 종속성을 작성해야하는 경우 make에게이 규칙에서 최신 상태인지 확인하기 위해가 아니라 다른 별도의 규칙으로이를 수행하는 방법을 알려야합니다.

디렉토리간에 조정을하려는 경우, 가능한 한 유일한 방법은 아니지만 종종 서류를 구성하는 좋은 방법이 될 수있는 Recursive make considered harmful 용지를 권장합니다.그런데