[완료] 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.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.