2009-03-28 2 views
2

저는 실제로 3 개의 서브 프로젝트를 포함하고있는 프로젝트를 출시했습니다.이 프로젝트는 모두 한 번에 컴파일해야합니다.서브 프로젝트의 마스터 메이크 파일은 서브 프로젝트를 컴파일하지 않습니다

all: a b c 

a: 
    @cd a && make 

b: 
    @cd b && make 

c: 
    @cd c && make 

돌출와 B는 잘 컴파일 모두 만 3 프로젝트를 위해, 그것은 실제로 코드를 컴파일 않는 C 디렉토리 및 실행 메이크업으로 전환하더라도 수행 할 것이없는 나에게 말한다 : 내 메이크는 다음과 같이 대략 보인다 .

좀 더 구체적으로 : 위의 예에서 프로젝트 C는 실제로 Mozilla의 SpiderMonkey입니다. A와 B는 내가 작성한 코드/메이크 파일이지만 C는 Mozilla 웹 사이트의 SpiderMonkey의 원시 복사본입니다. 그것의 실제로 컴파일 명령은 다음과 같습니다

내 마스터 메이크에서
make JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1 

, 나는이 없다 :

spidermonkey: 
    @cd spidermonkey/src && $(MAKE) JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1 

가 출력 "의 SpiderMonkey을"실행 "합니다. 아무것도`의 SpiderMonkey '에 대한 수행되어야" make 명령을 실행하려면 어떻게해야합니까?

편집 : 내 메이크 파일에 다음 줄을 추가하지 시도했다 : 변화 여전히

.PHONY: spidermonkey 

뿐만 아니라 SM에 SpiderMonkey를 규칙의 이름을 변경하지만.

편집 : 나쁘다! 나는 탭이 있어야했을 때 공간이있었습니다. doh!

+0

이 GNU make입니까? – JesperE

+0

TAB과 make의 공간 문제는 다소 까다 롭습니다. 그러나 대부분의 현대적인 편집자 (예 : Emacs)는 탭이 있어야 할 공간이있을 때 매우 분명하게 강조 표시합니다. 이맥스는 정말로 공간이 필요한지 묻지 않고 저장하지 못하게 할 것이다. – JesperE

답변

4

"spidermonkey"라는 최상위 디렉토리에 파일 또는 디렉토리가있을 수 있습니다. Make는 이것이 생성 된 것으로 생각하고 이미 존재하기 때문에 중단합니다.

메이크 파일을 작성할 때 따라야 할 가장 중요한 규칙 중 하나는 입니다. 각 대상은 대상과 동일한 이름의 파일 하나를 만들어야합니다. 즉, 가지고있는 경우

a: 
     <some command> 

해당 명령은 "a"라는 단일 파일을 생성해야합니다. 파일을 생성하지만 자리가 가짜 목표라고로만이 있고, 그들은 다음과 같이 선언해야하지

규칙 :

.PHONY: a 

만들기 다음 항상하는 가정합니다은 다시 만들어 져야한다.

또한 일반적으로 은 make를 재귀 적으로 호출하는 데 "make"를 사용하지 말고 대신 $ (MAKE)를 사용하십시오.

편집 : "pseudo"를 "phony"로 변경

+0

혼란 스럽다고 생각합니다. 답에 .PHONY가있는 .PSEUDO! (변경하면 나에게서 +1을 얻습니다 :-)) –

+0

Jesper의 대답은 그의 "pseudo targets"이 실제로 "phony targets"라고 불리며 대신 ". PHONY :"로 선언된다는 것 외에는 훌륭합니다 .PSEUDO : ". –

+0

JesperE에게 감사드립니다. 내 질문을 업데이트했습니다. 불행히도. PHONY는 make 동작을 변경하지 않습니다. 이유를 모르겠다. –

1

make는 규칙 대상과 동일한 이름의 파일 (또는 디렉토리) 만 존재하는지 확인하고, 존재하는 경우 (그리고 종속 파일보다 새로운 경우) make의 관점에서 더 이상 할 일이 없습니다 .

그래서 문제는 spidermonkey 규칙 (종속성 없음)과 spidermonkey라는 디렉토리가 있다는 것입니다. 그러면 make는 "대상이 이미 만들어졌으며 나에게 할 일이 없다"고 생각합니다. 원하는 것을하기 위해 make를하려면 스파이더 맨 키 규칙 (또는 디렉토리)의 이름을 변경하십시오.

그런데 재귀 적으로 말하면, 이것은 반드시 좋은 생각이 아닙니다. Recursive Make Considered Harmful을 참조하십시오.