CPK 2.1 디렉토리 구조

gurugio의 이미지

제품을 개발하는 단계를 아주 단순화해보면 요구사항분석, 설계, 개발, 테스트(, 수금??)으로 분류할 수 있습니다. 개발 단계만 생각해보면 개발 단계에서 가장 첫번째 단계가 빌드 환경을 작성하는 것입니다. 빌드라는 것은 간단하게 말하자면 여러 디렉토리에 여러개로 흩어져있는 소스들을 컴파일하고, 외부 라이브러리를 링크해서 최종 제품을 생산하는 일이라고 생각할 수 있습니다. 빌드 환경이 꾸며진 다음부터는 차례대로 소스를 작성해나가면서 수시로 빌드와 테스트를 진행하게 됩니다.

사실 아무것도 없는 상태에서 개발이 시작될 일은 거의 없으리라 생각됩니다. 거의 대부분이 뭔가 다른 소스가 있거나 이미 개발 시작된 소스를 가지고 시작하게 됩니다. 내가 발전시켜나가야할 소스에서 가장 먼저 살펴봐야 할 부분이 빌드 과정이라고 생각합니다. 많은 리눅스 커널 분석 책들이 커널 빌드에 대한 설명으로 시작되는 것을 보면 알 수 있습니다. 빌드 단계를 알아야만 내가 원하는 기능을 어디에 추가해야하는지를 파악할 수 있습니다. 또 제품의 전체적인 동작 방식도 짐작해볼 수 있고, 제품의 최종 목표가 무엇인지도 어느정도 알 수 있습니다. 때로는 개발팀의 조직도까지도 짐작해볼 수 있습니다.

현재는 make라는 빌드 툴이 가장 많이 사용되는것 같습니다. 윈도우에서도 make와 유사한 툴이 있고 많이 사용되고 있고, 유닉스에서는 절대적으로 대다수가 사용하고 있습니다. 몇몇 회사들이 유사한 툴들을 제공하고 있지만 기본은 make와 동일합니다. make가 널리 사용되고 있긴 하지만 많은 단점들이 있습니다. 제가 생각하는 가장 큰 단점은 직관적이지 못한 사용법입니다. make는 Makefile이라는 설정 파일을 만들어서 실행 방식을 지정하는데 Makefile을 작성하기가 매우 어렵습니다. 금방 익숙해질 수는 있지만, 정말 이상한 형식으로 작성해야합니다. 최근에 좀더 쉽고 편리한 툴들이 나오고있지만 아직은 널리 사용되는 툴이 없어서 아쉽습니다.

2장에서는 주로 gnu make를 사용하는 방법을 알아보겠습니다. make를 사용하기 위해서는 먼저 autoconf라는 툴을 사용할 수 있어야 합니다. Makefile의 작성법이 워낙 복잡하다보니 autoconf, automake 등 쉽게 Makefile을 생성할 수 있도록 도와주는 툴들이 출시되었습니다. 하지만 저는 오히려 이런 툴들을 다 활용하기 위해 배우고 익히는 일이 그냥 Makefile 작성법을 익히는 시간보다 더 오래 걸리고 노력도 더 필요하다고 생각합니다. 그래서 이 책에서는 autoconf를 이용한 configure 작성과 configure의 결과물을 이용한 Makefile 작성만을 다루겠습니다. Makefile은 몇몇 설정은 configure의 결과 파일을 이용하지만 대부분 손으로 직접 작성하겠습니다.

먼저 해야할 일은 디렉토리 구조를 결정하는 것입니다. 제품의 특성에 따라 디렉토리 구조가 달라질 수 있습니다. 가장 먼저 필요한 디렉토리는 소스가 저장될 src 디렉토리입니다. 그리고 헤더파일이 저장될 include 파일과 빌드가 완료되면 생성될 라이브러리 파일이 저장될 lib가 있습니다. 그리고 유닛테스트용 소스 파일들이 저장될 test 디렉토리가 필요합니다. 요약해보면 다음과 같은 디렉토리 구조가 됩니다.

- calib
- include
- lib
- src
- test

각 디렉토리마다 Makefile이 존재하고, 가장 상위 디렉토리 calib에 configure 파일이 존재합니다. 빌드는 calib/configure 파일을 실행한 후, calib 에서 make를 실행하는 순서로 실행됩니다. lib 디렉토리에 최종 생성 파일인 libcalib.a가 생성되면 빌드가 완료된 것입니다. 빌드가 완료된 후 libcalib.a의 기능들을 테스트하는 유닛테스트가 빌드되고 실행됩니다. 요약하면 다음과 같은 순서가 됩니다.

1. configure 실행
2. make 실행
3. src/에 있는 소스가 컴파일됨
4. lib/에 libcalib.a 파일이 생성됨
5. test/에 있는 소스가 컴파일됨
6. test/에 있는 테스트 실행 파일들이 실행됨
7. 유닛테스트 완료

빌드 환경을 준비할 때도 이와같은 순서로 실행되도록 약간의 예제 소스를 만들어서 빌드를 확인하겠습니다. 빌드 환경 준비가 끝나면 그때부터 본격적인 프로그램 작성을 시작합니다.

댓글

emptynote의 이미지

make 수준 이상의 공부가 필요한것이 autoconf 라는 말씀 공감갑니다.

autoconf 예제는 확실히 쉽습니다. 하지만 예제를 벗어난 것을 하고자 할땐,

make 파일과 소통하는 방법을 익혀야 하는데, 도통 어떻게 해야 할지 모르겠네요.

아무래도 순수 Makefile 조작으로 가야겠네요.

gurugio의 이미지

동의해주시는 분이 계셔서 참 맴이 좋습니다 ;-)
autoconf를 안쓰고 make를 계속 쓰는게 더 복잡하고 번거로워 보일 수 있고..
변태처럼 보일까봐 걱정을 쬐금 했었습니다.
감사합니다.

익명 사용자의 이미지

꾸준히 보고 있다는 사람이 있다는거 알아주셨으면 좋겠네요 ^^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.