자동화된 빌드 시스템 구축 본문

Programming

자동화된 빌드 시스템 구축

halatha 2009. 9. 21. 12:26
출처: 열씨미와 게을러의 리눅스 개발 노하우 탐험기
2009/08/17 - [Programming] - diff, find, md5sum, patch
2009/08/17 - [Programming] - find, grep, ctags, cscope, global
2009/08/17 - [Programming] - shared library, strace, ldconfig, ldd, gcc, strings, od, nm, c++filt, readelf
2009/09/14 - [Programming] - configure

configure.in

macro name
의미
비고
dnl 주석

AC_PREREQ
(autoconf) autoconf 버전 지정
여기서는 2.59 이상으로 지정
AC_INIT
(autoconf) AC_OUTPUT과 더불어 configure script에 최소로 필요한 구성요소로 다음 다섯 가지 macro를 생성
AC_PACKAGE_NAME(package name), AC_PACKAGE_TARNAME(package 축약 이름), AC_PACKAGE_VERSION(package version), AC_PACKAGE_STRING(package 긴 이름), AC_PACKAGE_BUGREPORT(package bug 주소)
 
AC_PROG_CC
(autoconf) 동작하는 컴파일러 특성 파악
 
AC_CHECK_HEADER
(autoconf) 특정 헤더 파일이 존재하는지 점검
여기서는 malloc.h를 점검
AC_DEFINE
(autoconf) 선행 처리 macro 정의
여기서는 HAVE_MALLOC_H를 정의
AC_CONFIG_FILES
(autoconf) 입력 파일을 복사해서 결과 값을 치환한 다음에 출력 파일을 생성
Makefile.in을 받아들임
AC_OUTPUT
(autoconf) config.status를
 

autoconf
autom4te.cache: configure.in을 매번 m4로 처리하는 것은 시간이 많이 걸리므로, 미리 autom4te.cache directory에 macro 확장에 따른 cache를 만들어 놓고 다음 번에 autoconf를 부를 때나 자매 utility인 autoheader, automake를 부를 때 수행 시간을 빠르게 만든다

Makefile.in
AC_INIT~뒤의 두 줄 추가

 macro name
의미
비고
AM_CONFIG_HEADER
(automake) configure 결과로 나온 macron를 담을 header file name 지정
config.h에 configure 결과를 기록
AM_INIT_AUTOMAKE
(automake) automake를 위한 AC_INIT 대응 macro
 

autoconf
autoconf에 정의된 macro는 configure용 뿐이었고, 나중에 automake가 추가되면서 autoconf를 확장해야 할 상황이 되자 개발자들이 autoconf와 automake package를 구분해서 만들었다

aclocal
aclocal.m4: automake에서 사용하는 추가 macro가 정의된 file

autoconf

Makefile.am
Makefile template으로 필요한 실행 file name, source code name, library를 지정하면 automake를 통해서 Makefile.in을 생성

automake

autoheader
configure.in을 읽어서 config.h.in을 자동으로 생성하는 utility

INSTALL, NEWS, README, AUTHORS, ChangeLog, COPYING
--add-missing option을 붙이면 공통 요소인 INSTALL(설치 방법), COPYING(GPL v2 license 소개 문서)은 생성하므로, README, AUTHORS, ChangeLog만 간단히 만들면 됨
여기서는 touch를 통해 빈 file을 생성

configure
./configure를 해 정상적으로 실행이 되면 끝

program 작성
config.h file을 include하기 위해 configure 결과와 연동해서 동작하도록 다음과 같이 program을 작성
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif

void stat_malloc(void)
{
#ifdef HAVE_MALLOC_H
    struct mallinfo m_info = mallinfo();
    printf("[info] stat malloc results:\n");
    printf("arena: %d, ordblks: %d, hblks: %d, uordblks: %d, fordblks: %d, keepcoast: %d\n", m_info.arena, m_info.ordblks, m_info.hblks, m_info.uordblks, m_info.fordblks, m_info.keepcoast);
#else
    printf("[warning] stat malloc is not available\n");
#endif
}
#endif

malloc.h를 include하고 mallinfo structure와 function을 이용하기 위해 HAVE_MALLOC_H를 활용한다

AC_CHECK_MEMBER, AC_CHECK_FUNC
struct mallinfo가 malloc.h에 선언되지 않을 수도 있는 가능성에 대한 검사 -> configure 과정에서 struct mallinfo를 명시적으로 점검
autoconf utility는 위의 macro를 configure script 내부에서 다음과 같이 확장해서 compile test를 진행한다. 즉 AC_CHECK_MEMBER 마지막에서 정의한 #include <malloc.h>를 include한 다음 직접 struct mallinfo.arena에 접근하는 방법으로 structure의 존재 유무를 파악한다

#include <malloc.h>

int main()
{
    static struct mallinfo ac_aggr;
    if ( ac_aggr.arena )
        return 0;
    return 0;
}

마찬가지로 mallinfo() function에 대한 정의는 AC_CHECK_FUNC를 통해 점검을 한다. 이 macro는 확장되면 char (*f)() = mallinfo;라는 program code 일부로 바뀌는데, link가 실패하면 해당 function이 없다는 결론을 내릴 수 있다.

이외에도 AC_SEARCH_LIBS macro를 사용해 특정 함수가 들어있는 library를 명시적으로 지정하는 방법도 있다.

결론
1. GNU 제공의 자동화된 build 구축 도구는 autoconf, automake, libtool
2. configure에서 따라오는 각종 file(configure script 자체, Makefile.in, config.h.in)은 모두 자동화된 build 구축 도구로 만든 결과물
3. 자동화된 build 구축을 위해 준비해야 하는 file은 크게 configure.in, Makefile.am 두 가지
4. 자동화된 build system 구축 단계
  • configure.in, Makefile.am 작성
  • aclocal(automake를 위한 macro package인 aclocal.m4 제작)
  • autoheader(config.h.in header file template 제작)
  • autoconf(configure script 자체 제작)
  • automake(Makefile.in template 제작)
5. 자동화된 build system 구축이 끝나면 configure script를 실행해 config.h와 Makefile이 생성되는지 확인
6. configure script 실행에 문제가 생기면 config.log를 확인해 원인을 파악 / configure script 내부에서 compile 도중에 실패하면 compile에 사용한 원시 code 그대로 config.log file에 dump하므로(configure script 내부에서 확인 가능) 이것을 참조

참고
GNU autoconf: http://www.gnu.org/software/autoconf
GNU automake: http://www.gnu.org/software/automake
GNU libtool: http://www.gnu.org/software/libtool
GNU autotoolset: http://autotoolset.sourceforge.net
GNU autotools: http://seul.org/docs/autotut
Autoconf, Automake, LIBTOOL online book: http://sourceware.org/autobook
Comments