하위 프로젝트 용 Makefile은 하위 프로젝트를 컴파일하지 않습니다

StackOverflow https://stackoverflow.com/questions/692925

  •  22-08-2019
  •  | 
  •  

문제

실제로 3 개의 하위 프로젝트를 포함하는 릴리스를 위해 노력하고있는 프로젝트가 있으며,이 모든 부분에는 한 번에 편집해야합니다. 내 makefile은 대략 이것처럼 보입니다.

all: a b c

a:
    @cd a && make

b:
    @cd b && make

c:
    @cd c && make

프로젝트 A와 B는 모두 잘 컴파일하지만 세 번째 프로젝트의 경우 C 디렉토리로 전환하고 실행중인 MATE는 실제로 코드를 컴파일하지만 할 일이 없다고 알려줍니다.

좀 더 구체적으로 말하면 : 위의 예에서 프로젝트 C는 실제로 Mozilla의 Spidermonkey입니다. A와 B는 내가 쓴 코드/makefiles이지만 C는 Mozilla 웹 사이트에서 Spidermonkey의 원시 사본 일뿐입니다. 실제로 컴파일 명령은 다음과 같습니다.

make JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1

내 주인 Makefile에는 다음과 같습니다.

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

"Make SpiderMonkey"출력 "실행 :`SpiderMonkey '를 위해 할 일이 없습니다." 명령을 실행하려면 어떻게해야합니까?

편집 : MakeFile에 다음 줄을 추가하려고 시도했습니다.

.PHONY: spidermonkey

Spidermonkey 규칙을 SM으로 바꾸는 것뿐만 아니라 여전히 변화는 없습니다.

편집 : 내 나쁜! 탭이 있어야했을 때 공백이있었습니다. 도!

도움이 되었습니까?

해결책

"Spidermonkey"라는 대상에 파일이나 디렉토리가있을 것입니다. 이것이 이것이 만들어 져야한다고 생각하고, 이미 존재하기 때문에 멈추십시오.

makefiles를 쓸 때 따라야 할 가장 중요한 규칙 중 하나는 각 대상은 대상과 동일한 이름을 가진 하나의 파일을 작성해야합니다.. 다시 말해, 당신이 있다면

 a:
       <some command>

해당 명령은 "a"라는 단일 파일을 생성해야합니다.

파일을 생산하지는 않지만 자리 표시자가 호출되는 규칙 가짜 목표, 그리고 다음과 같이 선언해야합니다.

 .PHONY: a

그런 다음 Make는 항상 A가 다시 만들어야한다고 가정합니다.

또한 일반적인 규칙으로 "Make"를 사용하여 재귀 적으로 만들고 대신 $ (Make)를 사용하지 마십시오..

편집 : "의사"가 "Phony"로 변경되었습니다.

다른 팁

규칙 대상과 동일한 파일 (또는 디렉토리)의 존재에 대해서만 확인하고, 의존성보다 더 새롭다면 Make의 관점에서 더 이상 할 일이 없습니다.

따라서 문제는 SpiderMonkey 규칙 (종속성이없는)과 SpiderMonkey라는 디렉토리를 가지고 있다는 것입니다. 그런 다음 "목표는 이미 만들어졌습니다. 원하는 것을 수행하려면 SpiderMonkey 규칙 (또는 디렉토리)의 이름을 바꿉니다.

그건 그렇고, 재귀 적 제작에 대해 말하면, 이것은 좋은 생각이 아닙니다. 재귀는 해로운 것으로 간주됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top