Makefile로 incremental build 하기

프로젝트를 빌드할 때 GUI 툴도 좋긴 하지만, Xcode가 아닌 이상에는 (심지어는 Xcode도 가끔) 꼬이는 경우가 많다. 그러나 Makefile은 매우 간단하면서도 정직해서 딱 정해놓으면 배신하는 경우가 없다. 내가 실수해서 꼬이게 만들지 않는 이상에는.

Eclipse CDT로 작업하는 이들 중에 내가 알기로 많은 수는 어떤 과정으로 빌드가 일어나는지 모르는 이가 대부분이다. 스스로 빌드 과정을 세팅한 경험이 없다면 대부분 남이 만들어준 빌드 설정을 그대로 이용하고 안되면 불평하는 수준에 머물게 된다. 이런 이들이 95%가 넘는 그룹에서 일할 때는 누구 하나가 프로젝트를 개판 만들면 그 누구도 수습을 하지 못해서 구원 등판을 해야 하는 경우가 있다.

사실 eclipse CDT가 문제가 아니라 많은 사람들이 모여서 일을 하면 구원투수로 등판 시킬 사람이 없다면 그 프로젝트는 망가져도 속수무책이라고 봐야 한다.

Eclipse CDT는 internal builder가 알아서 일을 하게 할 수도 있고 Makefile을 따로 쓸 수도 있는데, 대부분 internal builder를 쓴다. 이넘 저넘이 개판 만들어서 문제가 생기게 되면 Makefile에 어쩔 수 없이 기대야 한다.

Makefile을 쓰는 방법은 참으로 다양한데, 나도 참 오랫동안 Makefile을 (어쩔 수 없이) 써오지만 문법을 늘 쉽게 까먹기 때문에 만들 때마다 새로울 지경이다. 사실 Makefile을 건드는 일은 좀처럼 없는데, 커맨드라인으로 자동화를 할 때, 아니면 시간이 없는데 프로젝트가 죄다 망가져서 바닥부터 시작해야 되는 경우에 쓴다.

incremental build는 시간이 급할 때 더더욱이나 도움이 되는데, 프로젝트가 개판이 되어서 급히 뜯어고치고 있을 땐 (구원투수로 등판했을 땐) 사실 이것도 필요없을 때가 많지만 그래도 incremental build를 하는 것이 도움이 되긴한다. (사실 그보다 컴퓨터를 좋은 것으로 바꾸는 것이 파일 몇 십개 더 빌드하더라도 반응이 훨씬 더 빠르다.)

gcc/g++ 옵션에 보면 다음이 있다.

-MMD : dependancy file에 사용자 header를 포함시킨다. -MF [file name]: dep file의 이름을 명시한다. -MD : 사용자와 시스템 헤더 파일을 dependancy file에 넣는다.

대개 이 3가지 옵션을 넣어서 빌드하고 Makefile에는

include [dep_file]

을 추가한다.

그러면 Makefile이 알아서 일을 해준다. 즉, 헤더가 변동사항이 생기면 관련 파일 전체를 새로 빌드하고 그냥 c/c++ 파일이 변동되면 해당 파일만 새로 빌드한다.

암기할 필요는 없지만 (어차피 또 찾게 되어있다. 구원 투수로 매일 같이 등판해야 되는 경우가 아니면) 대충 M으로 시작하는 옵션들이라고 생각하면 좀 편해진다.