[완료] GNUmakefile vs Makefile (GNU autotools) 비교해보면 어떤가요?

oosap의 이미지

make 명령은 다양한 기술파일(Makefile, makefile, GNUmakefile, ...)을 사용할 수 있는 것으로 알고 있습니다.

저는 그 중 GNU autotools(autoconf, libtool, automake, ...)를 위시한 '''Makefile''' 을 사용하는 방법을 익혔지만 GNUmakefile 에 대해서는 전혀 알지 못합니다.

1. '''GNUmakefile''' 은 그렇다면 GNU autotools('''Makefile''') 를 사용하는 것과 비교해서 어떤 장단점이 있을까요? 제가 GNUmakefile 을 프로그램해본 적이 없어서 이 부분이 궁금합니다.
1-1. GNU autotools 는 다양한 *nix 시스템에서 호환성을 제공해주는 걸로 알고 있습니다. GNUmakefile 도 그러하겠죠?
1-2. GNU autotools 는 설치를 위한 타겟(install)과 제거를 위한 타겟(??)도 자동 생성이 되는 걸로 알고 있습니다. GNUmakefile 은 이런 것을 직접 기술파일에 수작업으로 명시해야 하는 건가요?

2. GNUmakefile 은 일반적인 Makefile 과 그 문법이 많이 다른 가요?

3. 어느 빌드 시스템을 더 많이 쓸까요?

저는 ACE 를 공부하면서 이 질문에 다다랏습니다. ACE 토론그룹(구글그룹스)에 문의해 본 바 ACE 의 예전 스폰서중의 한 측에서 GNU autotools 의 사용을 바랐었다고 하는 이유로 ACE 에서 GNU autotools 를 예전에 썼었다고 합니다. 지금 남아있는 Makefile.am, Makefile.in 은 그때의 잔재라고 하는군요. 그쪽(누군지는 모르겠으나)의 지원이 중단된 후로는 GNUmakefile 만을 사용한다고 하는군요..

(4) ACE 많이 쓰시죠? 공부하기 어렵네요... 공부하시는 분들 의견도 좀 듣고 싶은데.. 혹시 공부하시는 분 계신가요?

prolinko의 이미지


Makefile, makefile, GNUmakefile 등은 그냥 make의 입력으로 들어가는 makefile의 이름을 관습적으로 써주는 것으로 makefil 이름이 다르다고 그 문법이 달라지지는 않습니다. abcdef라는 이름으로 makefile을 작성해도 make -f abcdef 하면 make가 됩니다. 다만 고전적인 make의 문법에 GNU make 프로그램에서 지원하는 GNU의 확장 문법들이 있을 뿐입니다. android 코드를 보시면 Android.mk 와 같은 이름의 makefile을 사용하지만 결국 그 안의 문법은 GNU make manual을 보면 나오는 문법들입니다.(자체적으로 include 하는 macro들이 잔뜩 있을 뿐입니다.)

그리고 autotools는 이 makefile에 필요한 설정값들을 플랫폼에 맞게 자동적으로 설정해 주기 위한 도구로, 즉 결과적으로 makefile 생성을 위한 도구입니다. 이런 다양한 플랫폼에 맞는 설정을 맞춰주는 방법으로 이전에는 autotools를 많이 사용했으나 그 난해함 때문인지 요즘에는 Makefile 내에서 직접 그런 설정들을 맞춰주거나(Android), cmake(QT), GYP(chromium)등의 외부 툴을 사용해서 makefile을 설정에 맞게 generation하거나, 아예 make보다 더 flexible한 toolchain을 사용하거나(ant, scons, rake)등의 추세로 가고 있는 것 같습니다.

그리고 많은 큰 프로젝트에서 한가지 방식으로 build script를 작성하였다가 여러가지 문제에 직면하면서 다른 방식으로 transition함에 따라서 두가지 이상 방식의 build 방식이 존재하기도 합니다. 보통은 한쪽에서 다른 쪽으로 transition한 이후로는 나머지 방법은 제대로 관리가 잘 되지 않아서 해당방법을 사용하게 되면 많은 compile error들을 직접 소스 수정하면서 해처나가야 될 가능성이 큽니다. 결론적으로 최신 버전을 빌드할 경우에는 해당 프로젝트의 최신 guideline에서 추천하는 방법으로 빌드하는 것이 가장 골치아프지 않게 빌드할 수 있는 방법이고 ACE 커뮤니티에서 전자의 방법을 추천하니 해당 방법을 사용하는 것이 최선으로 보여지네요.

저도 ACE 한 5~6년전에 사용해 봤는데 덩치도 크고해서 배우고 사용하는데 상당히 고생했던 기억이 나네요. 그 당시에는 Linux와 Windows에서의 빌드 방법도 다르고 해서 양쪽에서 모두 빌드하는데 고생도 많이 했던 것으로 기억이 나네요.

oosap의 이미지

아.. 그렇군요.
다양한 사례를 들면서 설명해주시니까 무척 설득력이 있는 것 같습니다.

혹시 이 쓰레드를 검색해서 찾아올 지도 모를 누군가를 위해 최근에 제가 발견한 오아시스 같은 블로그 기사를 소개합니다.

http://studyfoss.egloos.com/5343014

autotools 의 메뉴얼을 보면 저같은 사람은 기겁을 할 수 밖에 없는데 위 블로그를 보면 쉽게 익힐 수 있더라구요. 물론 다른 책들을 통해 더 지식을 얻어야 겠지만 당장 써야하는 사람에게 오아시스 같은 좋은 설명입니다.

ACE 공부하면서 저역시 너무 힘드는군요. 알려진 책 3권이 모두 설명이 너무나 정제되지 않아있다는 느낌입니다. 프로그램이란게 직접 해봐야 하는데 책에서는 친절한 설명이 없어서 모두 직접 헤쳐나가야 하더군요. 초심자에게는 너무 힘겨운 과정입니다.

결국 GNUmakefile 이라고 해서 Makefile 보다 특별할 것 없는 것이군요. 지정된 타겟 아니면 자동으로 install, uninstall 같은 타겟이 생성되는 것도 아니구요.

알고나니 autotools 가 무척 좋은 것 같습니다.

풍부한 사례를 위주로 설명해주셔서 무척 감사드립니다.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.