2013-05-01 2 views
1

이 내 메이크입니다 : second라는 디렉토리, 완전히 메이크 무시됩니다 같은 이름을 가진 규칙이있는 경우메이크 : 하위 디렉토리와 같은 이름의 규칙은 무시

all: first second 

second: 
    @echo "==Building second==" 

first: 
    @echo "==Building first==" 

. 존재하지 않으면 모든 것이 정상적으로 진행됩니다.

second 폴더가 Makefile로 포함되어 있는지 여부에 관계없이 발생합니다.

프로젝트를 구성하는 동안이 문제가 발생했습니다. 일반적인 Makefile을 만든 다음 각 디렉터리의 Makefile을 호출하는 방법에 대해 생각했습니다. 따라서 규칙이 폴더와 동일한 이름을 갖는 것은 당연합니다.

해결책은 간단합니다. Makefile 내부에서 규칙 이름을 변경하십시오. 그러나이 동작은 다소 이상하게 보입니다.이 아이디어와 다른 가능한 해결책이 있습니까?

저는 Ubuntu 12.04.2 LTS에서 Bash 4.2.25의 GNU Make 3.81을 사용하고 있습니다.

+0

'second /'안에'second/Makefile'을 호출하려면'second' 규칙을 사용하고 싶습니까? 맞습니까? – Beta

답변

3

규칙이 실행되지 않는 이유를 찾고 있다면 간단합니다. make가 대상을 빌드하려고합니다. 대상은 파일 시스템에 아티팩트가 존재 함으로 인해 (기본적으로) 표시됩니다. 아티팩트가 파일인지 디렉토리인지 (또는 이론적으로는 다른 것) 여부는 중요하지 않습니다.

make가 파일이 오래되었다고 생각하여 업데이트해야하는 경우 (따라서 대상과 관련된 제조법을 실행하기 위해) 다음 두 가지 중 적어도 하나가 true이어야합니다. 대상 (즉, 파일 또는 디렉토리)이 존재할 수 없거나 존재하는 경우 마지막 수정 시간은 최소한 하나 이상의 사전 요구 사항보다 오래되어야합니다.

상황에 따라 second이 존재하므로 재구성을위한 첫 번째 요구 사항은 내가 아니며 전제 조건이 없으므로 두 번째 요구 사항이 충족되지 않으므로 대상이 밖으로 나가는 것으로 간주되지 않습니다 레시피가 호출되지 않습니다.

bobbogo가 암시 하듯이 대상을 .PHONY으로 선언하여 대상이 항상 재구성되어야한다고 말할 수 있습니다. make는 이 아니고이 파일 시스템의 이슈를 나타내지 만 빌드를 구성하는 데 사용되는 makefile의 가짜 타겟이라고 이해합니다.

1

파일 (또는 디렉토리) "second"가 이미 있는지 여부에 관계없이 항상 second 규칙을 실행하려는 것으로 보입니다. .PHONY의 사전 요구 조건으로 선언함으로써 상징적 인 목표를 두 번째로 만들 수 있습니다.

.PHONY: all 
all: first second 

.PHONY: second 
second: 
    @echo "==Building second==" 
... 
0

문제 설명을 올바르게 이해하면 echo이 아니라 $(MAKE) -Csecond입니다. Miller 's Recursive Make Considered Harmful을 읽을 시간이 많습니다! 이것들은 전통적 제작자들이 내재하는 고유 한 문제는 아니지만, 그들과 함께하는 것이 더 어려울 것입니다.

이러한 이유로 makepp이 생성되었습니다. 거의 동일한 makefile을 가질 수 있지만 재귀를 지정할 필요는 없습니다. 대상 디렉토리에 메이크 파일이 있으면 대개 같은 프로세스에 자동으로로드됩니다. 또는 대상이 다른 디렉토리로 생성 된 경우 makepp에게로드 할 메이크 파일을 알려 주어야합니다. 어느 쪽이든 한 프로세스는 모든 (자동으로 감지 된!) 종속성에 대한 개요를 가지고 있습니다.

makepp에는 훨씬 더 많은 것이 있습니다. GNU make가 할 수있는 거의 모든 것들을 수행하는 것 외에도, 훨씬 유용한 것들이 많이 있으며, 펄 파일을 사용하여 makefile을 확장 할 수도 있습니다.