재귀적 Make, 이제 그만! 단일 Makefile로 빌드 시간 단축!
대규모 UNIX 프로젝트에서 재귀적 make(Recursive Make) 사용 시, 빌드 시간이 과도하게 증가하는 문제 발생
재귀적 make의 근본적인 문제점은 빌드 과정을 인위적으로 분할하여 의존성 그래프(DAG)를 불완전하게 만드는 것임
단일 Makefile 사용을 통해 DAG를 완전하게 구성하고, 빌드 시간 단축 및 의존성 관리 효율성을 높일 수 있다고 주장
단일 Makefile의 유지보수 어려움에 대한 우려를 불식시키고, 개발 생산성 향상에 기여할 수 있음을 강조
재귀적 Make의 문제점: 불완전한 DAG
본 논문은 재귀적 make(Recursive Make) 사용 시 발생하는 주요 문제점으로 불완전한 의존성 그래프(DAG) 생성을 지적한다. 재귀적 make는 프로젝트를 여러 하위 디렉토리로 분할하고 각 디렉토리에 Makefile을 두어 빌드를 수행한다. 기술적으로 보면, 이러한 분할은 make가 전체 프로젝트의 의존성을 정확하게 파악하는 것을 방해하여, 불필요한 재빌드(Rebuild) 또는 빌드 누락(Missing Build)을 초래한다. 결과적으로, 빌드 시간 증가와 개발 생산성 저하로 이어진다.
단일 Makefile의 장점: 완전한 의존성 관리
저자는 단일 Makefile 사용을 통해 이러한 문제점을 해결할 수 있다고 주장한다. 단일 Makefile은 전체 프로젝트의 모든 파일과 의존성을 명시적으로 정의하므로, make는 정확한 DAG(Directed Acyclic Graph)를 구축할 수 있다. 특히, 포스트오더 순회(Postorder Traversal)를 통해 변경된 파일과 관련된 부분만 정확하게 빌드할 수 있다. 이는 빌드 시간 단축뿐만 아니라, 의존성 오류(Dependency Errors)를 조기에 발견하는 데 기여한다.
단일 Makefile의 실용성: 유지보수 및 확장성
단일 Makefile의 유지보수 어려움에 대한 우려를 해소하기 위해, 저자는 include 문(Include Statements)을 활용한 모듈화를 제안한다. 각 모듈의 Makefile 조각을 include하여 전체 Makefile의 크기를 관리하고, 코드 중복을 줄일 수 있다. 기술적으로 보면, 이러한 접근 방식은 모듈 간의 의존성(Dependencies)을 명확하게 관리하고, 변경 사항의 파급 효과를 쉽게 파악할 수 있도록 돕는다. 또한, VPATH 기능(VPATH Feature)을 활용하여 개발 환경을 구축하고, 개발자가 안전하게 코드를 변경할 수 있도록 지원한다.
효율적인 Makefile 작성 기법: 지연 평가 및 include 파일 활용
본 논문은 효율적인 Makefile 작성을 위한 몇 가지 기법을 제시한다. 특히, 지연 평가(Deferred Evaluation)를 통해 매크로(Macro)의 과도한 재평가를 방지하고, 빌드 시간을 단축할 수 있다. 또한, include 파일(Include Files)을 적극적으로 활용하여 중복되는 텍스트 처리 작업을 줄이고, 의존성 정보를 효율적으로 관리한다. 실제 사례로는, 자동 의존성 추적(Automatic Dependency Tracking)을 위해 GCC의 -MM 옵션을 사용하는 방법을 제시하며, 이를 통해 빌드 정확성을 높이고, 불필요한 재빌드를 방지할 수 있다.