개발자들이 기본적으로 알아둬야할 Tool #1

Posted at 2008. 6. 18. 00:13 // in S/W개발 // by 김윤수


거의 모든 소프트웨어 개발 프로젝트에서 사용하는 Tool 은 뭐가 있을까요 ?

1. 제일 먼저 떠오르는 건 뭐니 뭐니 해도 make 죠. 소스 코드가 2개 이상만 되기 시작하면 makefile 부터 작성하기 시작하니 가장 기본적으로 알아야 하는 툴이 아닐까 합니다.

물론 Microsoft Visual Studio 나 Borland 의 C++ Builder 와 같은 툴을 쓴다면 Project 파일 생성하고 GUI에서 필요한 파일들 추가해 가면 자동으로 dependency 체크해 주고, 알아서 컴파일 해주니 편하긴 하지만 Automatic Nightly Build를 하거나 Build 과정이나 결과에 대해 좀 더 세밀한 제어를 원한다면 차라리 makefile 이 편하지요.

요즘은 make 종류도 하도 여러가지라서 지원하는 기능도 서로 달르고해서 헤깔리기도 하지만 기본적으로 거의 비슷하다고 볼 수 있죠. 제가 아는 것만 보통 make, nmake, gmake 등이 있네요. 그 중에 GNU toolchain이 워낙 여러 시스템에 포팅되어 있다 보니 요즘은 gmake 사용법을 기본으로 알고 있으면 대부분 시스템에서 먹힐 수 있지 않을까 생각합니다. Window 에서 조차 cygwin 이나 MinGW 설치하면 gmake 쓸 수 있으니까요.

기본적인 makefile의 형식은 rule 들의 집합이고, 각각의 rule 은

target: dependency list
[\t        action]

과 같은 형식이죠. 여기서 \t 은 실제 tab 문자가 입력되어야 하는 걸 뜻합니다. 당연히 다들 아시겠죠 ? 예를 들어,

all: test

test: test.o main.o
\t        g++ -o test main.o test.o

test.o: test.cpp
\t        g++ -c -o test.o test.cpp

main.o: main.cpp
\t        g++ -c -o main.o main.cpp


이런 식으로 말입니다.

그리고, make 를 실행할 때는

$ make [target]

와 같이 하면 target 이 build 되고, target 이 생략될 때는 makefile 의 제일 처음에 나오는 target(위의 예에서는 all)이 build 된다는 건 다 아시리라 생각합니다. makefile 작성법만 해도 manual 몇 백페이지 되는 분량이라서 이 글의 범위를 넘어가므로 여기까지만 하고 그냥 패~스

이런 makefile 은 기본적으로 C, C++, Objective-C와 같은 compile 되는 언어에서 많이 쓰는 build 방법이고 Java 언어에서는 Ant 라는 build tool을 많이 쓰나 보더군요. 다음은 Ant build file 예제입니다.

<project name="MyProject" default="dist" basedir=".">
    <description>
        simple example build file
    </description>
  <!-- set global properties for this build -->
  <property name="src" location="src"/>
  <property name="build" location="build"/>
  <property name="dist"  location="dist"/>

  <target name="init">
    <!-- Create the time stamp -->
    <tstamp/>
    <!-- Create the build directory structure used by compile -->
    <mkdir dir="${build}"/>
  </target>

  <target name="compile" depends="init"
        description="compile the source " >
    <!-- Compile the java code from ${src} into ${build} -->
    <javac srcdir="${src}" destdir="${build}"/>
  </target>

  <target name="dist" depends="compile"
        description="generate the distribution" >
    <!-- Create the distribution directory -->
    <mkdir dir="${dist}/lib"/>

    <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
    <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
  </target>

  <target name="clean"
        description="clean up" >
    <!-- Delete the ${build} and ${dist} directory trees -->
    <delete dir="${build}"/>
    <delete dir="${dist}"/>
  </target>
</project>

위 예제를 보고 대강 감을 잡으셨겠지만, 기본 idea 는 makefile 파일처럼 target, dependency list, action 으로 구성된 걸 아실 수 있을 것입니다. <tstamp /> <mkdir /> <javac /> <jar /> <delete /> 이런 것들이 action 이겠지요.

이외에도 boost 에서 사용하는 bjam이라는 것도 있는 것 같습니다.

다른 make 류의 툴이 있을까요 ?

2. 좀 더 크게 보면 make 는 build 툴 중의 하나라고 말할 수 있을 것 같습니다. build 툴은 컴파일러, 링커 등을 호출하는 과정을 자동화해서 최종적인 executable 이나 library 파일을 쉽게 만들 수 있도록 해주는 툴을 통틀어서 나타낸 것이죠. 그 중에 가장 대표적인 것인 make 라고 할 수 있을테구요.

소스 코드 수가 그리 많지 않았던 옛날이나 build configuration 이 비교적 단순했던 때는 make 만 가지고 충분했겠지만 갈수록 복잡해지는 요즘에는 make 만으로는 많이 벅차지요. 소프트웨어가 복잡해지다 보면 각 컴파일되는 target platform 환경에 맞도록 option 들을 세세하게 조정해 줘야 하는데, 그런 작업을 잘 documentation 한다고 해도 항상 에러의 소지가 있기 마련이고, 또 세세하게 조정할 수 있도록 만들어 주기 위해서는 매 프로젝트마다 그런 게 가능할 수 있도록 해주는 작업을 해줘야 하고... 이런 반복되는 작업이 있다보면 천성이 게으른 프로그래머들이 창조적인 게으름을 피워서 그런 작업 자체가 자동화될 수 있도록 하는 툴을 만들기 마련이죠.

그리하여 나오게 된 툴이 autoconf, automake 라고 할 수 있습니다. GNU build process 를 따르는 패키지들은 보통 configure 라는 script 로 target platform 에 맞는 build configuration 을 만들어 주는데 이 configure script 를 만들어 주는 프로그램이 autoconf 이고, portable 한 makefile template 으로부터 target platform specific 한 makefile 을 만들어 주는 프로그램이 automake 라고 생각하시면 됩니다.

상당히 여러 Open Source 프로젝트에서 autoconf, automake 를 쓰다 보니 이제는 안쓰는게 이상할 정도가 됐죠. 그런데 autoconf, automake 가 아쉬운게 있다면 Unix 계열 OS는 대부분 잘 지원하는데 다른 OS는 잘 지원하지 않는다는 점이었습니다.

그래서 autoconf, automake 로 잘 build 되는 소프트웨어를 Windows 계열 OS에 포팅을 하려면 소스 코드도 portable 하게 바꿔야 하지만 build 과정도 porting하기 위해서 Visual Studio 용 프로젝트 파일을 별도로 만들거나 아니면 사용자가 cygwin이나 MinGW를 설치하도록 강요하는 방법 밖에는 별로 없었습니다.

또, 이런 문제점을 해결하기 위해 나온게 CMake 입니다. cross platform make 라는 뜻으로 Unix 계열 OS에서 makefile 을 만들어 줄 뿐 아니라 Visual Studio 용 workspace 파일도 만들어 주고, Mac OS X Framework 도 지원해 준다고 하네요. 다음 그림은 Window 에서 CMake 를 실행한 화면입니다.

사용자 삽입 이미지

3. 마지막으로 build 툴로 하나 추가하자면 Cruise Control을 들 수 있을 것 같습니다. Cruise Control 은 Continuous Integration 을 가능하게 해주는 툴로 주기적으로 소스 코드 트리를 Build 하고 Build 한 결과를 Dashboard로 확인할 수 있게 해줍니다. 다음 그림은 Dashboard 화면 샘플입니다.

사용자 삽입 이미지

Continuous Integration 은 개발 과정 마지막에 One big integration에서 발생할 수 있는 문제점을 피할 수 있는 가장 효율적인 대안이니 Cruise Control 같은 툴에도 익숙해질 필요가 있을 것 같습니다.

Build 툴로 알아둬야 할만한 게 이것들 말고 또 뭐가 있을까요 ? 여러분은 build 툴로 뭘 주로 쓰시나요 ?

제 글이 유익하셨다면 오른쪽 버튼을 눌러 제 블로그를 구독하세요. ->
블로그를 구독하는 방법을 잘 모르시는 분은 2. RSS 활용을 클릭하세요.
RSS에 대해 잘 모르시는 분은 1. RSS란 무엇인가를 클릭하세요.