2009-04-07 6 views
8

makefiles을 배우고 간단한 메이크 파일을 만드는 방법을 알고 있습니다. 나는 중첩 된 메이크 파일로 이동하고있다. 여기 내 디렉토리 구조중첩 된 메이크 파일 만들기

루트 메이크이라고합니다
/src 
...makefile 
...main.cpp 
...foo 
......makefile 
......foo.cpp 
......foo.h 

, 그것은 디렉토리 foo는에서 메이크를 호출합니다. 여기 내 질문 내가 모든 오브젝트 파일을 링크하는 코드를 작성하는 데 사용한다

  1. 메이크은? 루트 메이크 파일에 있다면, 거기에 모든 오브젝트 파일 이름을 지정해야합니까?
  2. 이 중첩 된 메이크 파일은 모범 사례입니까? 또는 루트에 하나의 makefile 만 있으면 좋습니까?

도움이 될 것입니다.

답변

15

이 아니라면에 대한 언급이 많습니다. Recursive Make Considered Harmful을 읽으십시오. PDF form에도 있습니다.

짧은 짧은 버전은 재귀 적 make가 여러 개의 분리되어 있지만 가능하게 중복되는 종속성 트리를 효과적으로 빌드하고 정확하거나 최대로 효율적인 빌드를 보장 할 수 없다는 것입니다. 병렬로 구축하기를 원한다면 문제는 더욱 악화됩니다.

문제를 해결하기 위해 위의 모든 문제를 해결할 수있는 단일 스팬 종속성 트리를 만드는 단일 비 재귀 적 make를 조정합니다.

+1

그렇게하지 않으시는 것이 좋지 않을 수도 있습니다. 대안으로 제시 할만한 해결책이 될 수 있습니다. – deadalnix

+1

예. 이 답변은 사이트에서 더 이상 수용 할 수없는 형태입니다. 수정 사항은 부분적으로 만 결함을 복구하지만 뭔가 있습니다. – dmckee

3

재귀 적 make는 일반적으로 유해한 것으로 간주됩니다.

"make"를 루트 디렉토리에 입력하고 POSIX 메이크 파일 만 사용하여 모든 것을 빌드 할 수있게하려면이 방법이 유일한 방법입니다. 이 경우 하위 디렉토리를 자신의 디렉토리에 링크하고 마지막 항목을 루트 디렉토리에 함께 연결하십시오.

는 gmake를 구문을 사용하고자하는 경우, 여기에 메이크를 살펴 : http://github.com/singpolyma/theveeb-ecosystem

+1

POSIX (non-GNU) make를 사용하여 비 재귀 빌드를 두 단계로 나누어 수행 할 수 있습니다. 1) 모든 subdir의 모든 make.inc 파일을 연결합니다. 2) 결과 메이크 파일을 실행합니다. 그러나 대부분의 사람들은 어쨌든 GNU make를 사용하는데, "include"지시어가 있습니다. –

+0

아, 그건 사실입니다, 나는 해킹 해킹을 한 번도 해본 적이 없다. 나는 include를 사용하는 경향이있다. 일반적으로 나는 아주 POSIX가되고 싶다. 그러나 메이크 파일을 가지고 가끔은 약간의 털이 나있다. – singpolyma

0

하고 메이크업의 많은 함정을 피하기보다 쉽게 ​​구문이 SCons 같은 더 현대적인 빌드 시스템이 있습니다. 예를 들어 SCons는 소스 파일을 스캔하여 자신의 종속성을 판별하는 반면, make는 종속성을 수동으로 지정해야합니다. 예 : 새 #include 문을 구현 파일에 추가합니다. 헤더가 변경되면 make는 해당 구현 파일을 다시 컴파일하지 않습니다 (새 종속성을 추가하지 않는 한). SCons는 자동으로 새 종속성을 감지하고 필요한 경우 다시 컴파일합니다.