Autotools 소개

Autotools
는 autoconf, automake, libtool 도구들로 구성되어 있는 build system 입니다. 대부분의 GNU 프로그램들은 Autotools를 사용해 Build 환경을 구성합니다. 사용자 입장에서는 다음의 명령어로 소스 패키지를 컴파일 하고 설치할 수 있는데, 이러한 빌드 환경을 제공하는 것이 Autotools의 역할입니다.

$] ./configure
$] make
$] make install

./configure 스크립트는 현재 시스템에 어떤 프로그램과 라이브러리가 설치되어 있는지를 분석해 Makefile을 생성합니다. 만약 빌드시 필요한 라이브러리가 없다면 사용자에게 로그를 통해 필요한 정보를 알려줍니다. 이는 사용자 입장에서 꽤 유용할 수 있는데 굳이 많은 시간이 소요되는 빌드를 하지 않고도 필요한 정보를 얻을 수 있기 때문입니다. 그리고 ./configure의 옵션을 이용해 빌드시 사용되는 환경변수를 설정하거나 다양한 플랫폼을 지원하는 Makefile을 생성할 수 있습니다.

make 는 실제로 소스를 컴파일하는 명령어입니다. make install은 make 명령어를 통해 빌드된 바이너리와 라이브러리를 prefix(configure 스크립트의 옵션 중 하나)로 지정된 폴더에 설치하는 명령어입니다.

현재 개발중인 소스에 Autotools를 적용하려면 다음의 두 파일을 작성해야 됩니다.

'Makefile.am'                 An input to automake 
'configure.ac'                 An input to autoconf

Makefile.amautomake 명령어의 입력으로 사용되는데, automake는 Makefile.am을 기반으로 Makefile.in 파일을 생성합니다. Makefile.in은 Makefile을 생성하기위한 템플릿이라고 보면 될 것 같습니다.

configure.acautoconf 명령어의 입력으로 사용되는 파일입니다. 내부적으로 복잡한 과정을 거치지만 결과적으로 configure 스크립트를 생성하게 됩니다. configure.ac의 경우 autoscan 이라는 명령어를 통해 configure.scan 이라는 기본 파일을 생성할 수 있습니다. 일반적으로 configure.scan 파일을 configure.ac로 복사한 후 필요한 옵션들을 추가하는 방법을 사용합니다.

Tutorial

Learning the GNU developement tools에 나와있는 예제를 바탕으로 간단한 tutorial을 소개하겠습니다. (http://autotoolset.sourceforge.net/tutorial.html#SEC50)
작업 디레토리를 hello로 생성 한 뒤, 아래의 파일들을 생성합니다.


hello/Makefile.am
SUBDIRS = src

hello/src/hello.c
#include <stdio.h>

int main(void)
{
printf("Hello autotools\n");
return 0;
}

hello/src/Makefile.am
bin_PROGRAMS = hello
hello_SOURCES = hello.c

hello 폴더에 있는 Makefile.am은 SUBDIRS 변수를 이용해 source가 있는 하위 디렉토리(src)를 설정합니다. 여러 폴더에 소스가 있는 경우 상위 폴더에서 위와 같이 작성하면 빌드시 재귀적으로 Makefile이 수행 됩니다.

src 폴더의 Makefile.am는 실제 컴파일 될 소스와 target을 작성합니다. 위의 경우 실행파일 hello를 생성할 것이며 hello 바이너리를 생성하기 위한 source로 hello.c 파일을 컴파일 한다는 의미입니다.

이제 configure.ac 파일을 만들기 위해서 autoscan 명령어를 입력합니다.

hello $] autoscan

autoscan 입력 후 configure.scan 파일이 생성된 것을 확인할 수 있습니다.

hello $] ls
autoscan.log  configure.scan  Makefile.am  src

configure.scan 파일을 configure.ac로 복사한 후, 편집기로 configure.ac 파일에 다음을 추가합니다.

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.61)
AC_INIT(hello, 1.0, bug@repot-address.com)
AM_INIT_AUTOMAKE(hello, 1.0)
AC_CONFIG_SRCDIR([src/hello.c])
AC_CONFIG_HEADER([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile
                  src/Makefile])
AC_OUTPUT

AC_INIT은 순서대로 package name, version, bug-report-address를 뜻합니다. 그리고 아래의 AM_INIT_AUTOMAKE는 automake를 사용하기위해 추가된 매크로 입니다.

기본적인 configure.ac 파일이 완성되었으므로 이제 autoconf를 사용하여 configure 스크립트를 생성할 차례입니다. 다음의 명령어를 순차적으로 입력합니다.

hello $] aclocal
hello $] autoheader
hello $] autoconf

다음과 같이 configure 스크립트 파일이 생성된 것을 확인할 수 있습니다.

hello $] ls
aclocal.m4  autom4te.cache  autoscan.log  config.h.in  configure  configure.ac  configure.scan  Makefile.am  src

이제 automake를 이용하여 Makefile.in 을 생성할 차례입니다. 다음의 옵션을 이용하여 automake를 실행시킵니다.

hello $] automake --foreign --add-missing --copy

다음과 같이 hello 및 hello/src 폴더에 Makefile.in이 생성된 것을 확인 할 수 있습니다.

hello $] ls
aclocal.m4      autoscan.log  configure     configure.scan  install-sh   Makefile.in  src
autom4te.cache  config.h.in   configure.ac  depcomp         Makefile.am  missing

hello $] ls src
hello.c  Makefile  Makefile.am  Makefile.in

이제 빌드를 위한 모든 준비가 끝났습니다. ./configure 스크립트를 실행한 뒤, make && make install을 이용하여 소스를 빌드하면 됩니다.

hello $] ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating config.h
config.status: executing depfiles commands

hello $] make
make  all-recursive
make[1]: Entering directory `/home/jihan/Workspace/Autoconf/hello3'
Making all in src
make[2]: Entering directory `/home/jihan/Workspace/Autoconf/hello3/src'
gcc -DHAVE_CONFIG_H -I. -I..     -g -O2 -MT hello.o -MD -MP -MF .deps/hello.Tpo -c -o hello.o hello.c
mv -f .deps/hello.Tpo .deps/hello.Po
gcc  -g -O2   -o hello hello.o 
make[2]: Leaving directory `/home/jihan/Workspace/Autoconf/hello3/src'
make[2]: Entering directory `/home/jihan/Workspace/Autoconf/hello3'
make[2]: Nothing to be done for `all-am'.
make[2]: Leaving directory `/home/jihan/Workspace/Autoconf/hello3'
make[1]: Leaving directory `/home/jihan/Workspace/Autoconf/hello3'

개인적으로 autotools를 입맛에 맞게 적용할려니 생각보다 복잡했습니다. 내부적으로 동작하는 방식을 이해하는 것도 쉽지 않은데다가 소스 파일이 워낙 많고 폴더가 세분화 되어있는 경우 각각의 폴더마다 Makefile.am을 생성할려니 그것도 일이더군요. 결국에는 모듈별로 몇개의 Makefile.am에 VPATH 변수를 사용해서 하나의 파일로 대체 하긴 했지만 시간이 되면 confirue 스크립트에 옵션을 추가하는 등의 작업을 해봐야 될 것 같습니다.

참, GNU Autoconf, Automake and Libtool 이라는 책을 아는 분이 주셨는데 현재 이책은 웹상에서도 볼 수 있더군요. (http://sourceware.org/autobook/) 그리고 springnote에 어떤분이 이 책을 번역해 놓으셨더라구요. 짧은 영어로 원서보기가 힘들었는데 많은 도움이 됐습니다. Autotools를 공부하시는 분이라면 한번쯤 방문해보시면 도움이 되리라 생각됩니다. http://wariua.springnote.com/pages
Posted by 완소타코

댓글을 달아 주세요