CPK 2.1 디렉토리 구조
제품을 개발하는 단계를 아주 단순화해보면 요구사항분석, 설계, 개발, 테스트(, 수금??)으로 분류할 수 있습니다. 개발 단계만 생각해보면 개발 단계에서 가장 첫번째 단계가 빌드 환경을 작성하는 것입니다. 빌드라는 것은 간단하게 말하자면 여러 디렉토리에 여러개로 흩어져있는 소스들을 컴파일하고, 외부 라이브러리를 링크해서 최종 제품을 생산하는 일이라고 생각할 수 있습니다. 빌드 환경이 꾸며진 다음부터는 차례대로 소스를 작성해나가면서 수시로 빌드와 테스트를 진행하게 됩니다.
사실 아무것도 없는 상태에서 개발이 시작될 일은 거의 없으리라 생각됩니다. 거의 대부분이 뭔가 다른 소스가 있거나 이미 개발 시작된 소스를 가지고 시작하게 됩니다. 내가 발전시켜나가야할 소스에서 가장 먼저 살펴봐야 할 부분이 빌드 과정이라고 생각합니다. 많은 리눅스 커널 분석 책들이 커널 빌드에 대한 설명으로 시작되는 것을 보면 알 수 있습니다. 빌드 단계를 알아야만 내가 원하는 기능을 어디에 추가해야하는지를 파악할 수 있습니다. 또 제품의 전체적인 동작 방식도 짐작해볼 수 있고, 제품의 최종 목표가 무엇인지도 어느정도 알 수 있습니다. 때로는 개발팀의 조직도까지도 짐작해볼 수 있습니다.
현재는 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. 유닛테스트 완료
빌드 환경을 준비할 때도 이와같은 순서로 실행되도록 약간의 예제 소스를 만들어서 빌드를 확인하겠습니다. 빌드 환경 준비가 끝나면 그때부터 본격적인 프로그램 작성을 시작합니다.
댓글
make 수준 이상의 공부가 필요한것이 autoconf 라는 말씀 공감갑니다.
make 수준 이상의 공부가 필요한것이 autoconf 라는 말씀 공감갑니다.
autoconf 예제는 확실히 쉽습니다. 하지만 예제를 벗어난 것을 하고자 할땐,
make 파일과 소통하는 방법을 익혀야 하는데, 도통 어떻게 해야 할지 모르겠네요.
아무래도 순수 Makefile 조작으로 가야겠네요.
동의해주시는 분이 계셔서 참 맴이 좋습니다
동의해주시는 분이 계셔서 참 맴이 좋습니다 ;-)
autoconf를 안쓰고 make를 계속 쓰는게 더 복잡하고 번거로워 보일 수 있고..
변태처럼 보일까봐 걱정을 쬐금 했었습니다.
감사합니다.
귀찮아서 덧글을 안달았는데
꾸준히 보고 있다는 사람이 있다는거 알아주셨으면 좋겠네요 ^^
댓글 달기