150 likes | 337 Views
Autotools. Autoconf, automake Further Study Hojin Choi <pynoos@users.kldp.net>. 일반적인 Build. Build ./configure make make dist ( 배포본 만들 때 ) make install ( 설치할 때 ) configure 생성물 Makefile : 궁극적인 산출물 config.h : system 의존 요소에 대한 Macro 정의 Header
E N D
Autotools Autoconf, automakeFurther Study Hojin Choi <pynoos@users.kldp.net>
일반적인 Build • Build • ./configure • make • make dist (배포본 만들 때) • make install (설치할 때) • configure 생성물 • Makefile : 궁극적인 산출물 • config.h : system 의존 요소에 대한 Macro 정의 Header • config.status : Makefile.in을 Makefile로 만들기 위한 스크립트
make 확인하고 넘어가기 • Makefile 기본적인 구성은 • VARIABLE=CONTENTS • TARGET_FILES: DEPENDENCY_FILES<TAB>ACTION<TAB>ACTION • ACTION 상세 • <TAB>으로 되어있으면 한 줄 한 줄마다 다른 shell이 실행되어 수행됨, 따라서 연이은 동작은 “;”으로 구분하여 한줄에 써야함. • @ 로 시작하면 화면에 명령줄을 출력하지 않음 • 기본적으로 ACTION의 exit값이 0 이어야 다음줄이 수행되지만‘-’로 시작하는 줄은 exit 값 무시하고 다음줄로 수행을 계속함. • exit 0 이아닌 경우 예시 • gcc 가 compile error를 낼 경우 • rm 이 실패한 경우 • cp 등이 실패한 경우
Autotool Family • Autoconf family • autoconf : 모든일을 마무리하는 shell script • autoheader : config.h.in 을 만들어 주는 perl script • autoscan : configure.scan 을 만들어 주는 perl script • autoreconf : autoconf, aclocal, automake 를 하위 디렉토리까지 호출해주는 perl script • Automake family • automake : Makefile.in을 만들어 주는 perl script • aclocal : aclocal을 만들어 주는 perl script
Autoconf/Autoheader 세상 /usr/share/autoconf/*.m4 configure.in Makefile.in aclocal.m4 config.h.in autoheader autoconf configure(config.status) 모든 매크로 확장 설치된 library 개발자가 손으로 만드는 것 Makefile 개발자가 툴로 만드는 것 config.h 사용자가 configure로 만드는 것 참조되어생성 변환
Autoconf/Autoheader 세상(짜브버전) /usr/share/autoconf/*.m4 configure.in Makefile.in config.h.in aclocal.m4 autoheader autoconf configure(config.status) 설치된 library 모든 매크로 확장 개발자가 손으로 만드는 것 개발자가 툴로 만드는 것 Makefile 사용자가 configure로 만드는 것 config.h 참조되어생성 변환
Automake/Aclocal 세상 Makefile.am /usr/share/automake/*.m4 acinclude.m4 automake aclocal /usr/share/autoconf/*.m4 AM_ 계열 매크로 모음 configure.in Makefile.in config.h.in aclocal.m4 autoheader autoconf configure(config.status) 설치된 library 모든 매크로 확장 개발자가 손으로 만드는 것 개발자가 툴로 만드는 것 Makefile 사용자가 configure로 만드는 것 config.h 참조되어생성 변환
configure.in 만드는 자세 • configure.in 에서 autoconf가 주의깊게 보는 것은 AC_, AM_, AH_ 로 시작하는 단어이다. • AC_, AM_, AH_ 로 시작하는 단어가- /usr/share/autoconf/*.m4- aclocal.m4에서 발견 되지 않으면 autoconf는 멈춘다. • configure.in 은 sh script 라고 생각해도 무방하다. • autoconf 는 automake의 존재에 대해 모른다고 생각해도 좋다. • 되도록 [, ] 로 묶어서 블록 단위를 구별하자. 비록 한 단어라해도. • configure 를 직접 열어서 확인하자. • config.status 를 직접 열어서 확인하자.
Makefile.am 만드는 자세 • 모든 subdirectory에는 Makefile.am 을 만든다. • configure.in은 최상위 directory에 둔다. • configure에서 모든 하위 Makefile들을 다 만든다고 생각하자. • automake 는 dependency 마법사라고 생각하자. • Makefile.am 은 변수 설정만으로 마법사에게 일거리를 준다. • Makefile.am이 “bin_PROGRAMS”등과 같이 “_”에 의해 나뉘는 것을 좋아하는 이유가 있다. (변수 자격요건) • Makefile.am 은 Makefile.in 을 만드는 마음으로 생각한다.Makefile.in 은 Makefile 을 만드는 마음으로 생각한다. • Makefile.am에 @ENV@ 를 둘 수 있다. • Makefile.am에 dependency 를 추가할 수 있다. • automake에 의해 생성되는 Makefile.in 과 autoconf에 의해 생성되는 Makefile 을 자주 열어보자.
CH1. Makefile.in 만들기 • 내장 환경변수 알아 보기 • @PACKAGE_NAME@ • @PACKAGE_VERSION@ • @PACKAGE_BUGREPORT@ • config.status 를 열고 PACKAGE 라는 문자열을 찾는다. • sed 에 들어가는 치환 공식을 음미한다. • config.status 예제. • sed 's/,@/@@/; s/@,/@@/; s/,;t t$/@;t t/; /@;t t$/s/[\\&,]/\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t$/,;t t/' >$tmp/subs.sed <<\CEOF s,@SHELL@,/bin/sh,;t ts,@PACKAGE_NAME@,chapter1,;t t s,@PACKAGE_TARNAME@,chapter1,;t t s,@PACKAGE_VERSION@,1.0,;t t s,@PACKAGE_STRING@,chapter1 1.0,;t t CEOF
CH2. AC_SUBST 사용하기 • configure.in 에 다음과 같은 문장을 넣는다. • HOJIN="News from a far is seldom sooth. - King Theoden" MODEL=-DFORUNIXTHREADLIB=-lpthread AC_SUBST(HOJIN) AC_SUBST(MODEL) AC_SUBST(THREADLIB) • Makefile.in 을 다음과 같이 작성한다. • all: @echo Thread library link option: @THREADLIB@ @echo Message : @HOJIN@ gcc @MODEL@ a.c @THREADLIB@ • a.c 에 pthread 관련 프로그램을 작성한다. • Makefile 을 확인한다. • all: @echo Thread library link option: -lpthread @echo Message : News from afar is seldom sooth. - King Theoden gcc -DFORUNIX a.c -lpthread
CH3. Header File 존재 확인 • AC_CHECK_HEADERS • AC_CONFIG_HEADERS([config.h]) • AC_CHECK_HEADERS([pthread.h hserver.h]) 삽입 • autoheader • config.h.in 열어 적당한 autoheader template이 생성되었는지 확인한다. • /* Define to 1 if you have the <pthread.h> header file. */#undef HAVE_PTHREAD_H/* Define to 1 if you have the <hserver.h> header file. */#undef HAVE_HSERVER_H • 사용방법 • #ifdef HAVE_PTHREAD_H#include <pthread.h>#endif
CH4. config.h.in에 뭔가를? • 만약 ENDIAN 검출 후 특정한 Macro를 다음처럼 define해보자. • AC_C_BIGENDIAN( • [ AC_DEFINE([HS_BIGENDIAN]) ], • [ AC_DEFINE([HS_LITTLEENDIAN]) ] ) • AH_TEMPLATE([HS_BIGENDIAN],[We guess this host big endian]) • AH_TEMPLATE([HS_LITTLEENDIAN],[We guess this host little endian]) • config.h.in 을 확인해보면 • /* We guess this host big endian */#undef HS_BIGENDIAN/* We guess this host little endian */#undef HS_LITTLEENDIAN • 그리고 ./configure한 후에 config.h 를 확인한다. • /* We guess this host big endian *//* #undef HS_BIGENDIAN *//* We guess this host little endian */#define HS_LITTLEENDIAN 1
CH5. Basic Makefile.am • CH2의 Code를 가지고 Makefile 마법사에게 의뢰한다. • Makefile.am 은 변수 설정만으로 dependency를 만들어 낸다고 했다. • bin_PROGRAMS = samplebinsamplebin_SOURCES = a.c • automake를 돌려 Makefile.in을 만들어 낸다. • 위 내용이 Makefile.in에 들어 있는지 확인한다. • 덤으로 따라 오는 것들 • make all / make dist / make install / make uninstall • make dist 를 해본다. (tar ball 만들기) • 만들어지는 .tar.gz 파일을 gunzip –c <tar.gz file> | tar tvf –로 확인 해본다.
CH6. Makefile.am 친구되기 • 하위 디렉토리의 Makefile.am 도 Makefile.in으로 만들기또한 build tree에 참여시키기. • SUBDIRS = lib src test • dist tar ball에 포함시키기 • EXTRA_DIST = ChangeLog.old CONTRIBUTORS • 만들어 지는 binary file 목록 지정하기 • bin_PROGRAMS = chkstatus • chkstatus_SOURCES = 각종 .c .h • chkstatus_CFLAGS = chkstatus 만들때 들어갈 c flags • chkstatus_CXXFLAGS = chkstatus 만들때 들어갈 c++ flags • chkstatus_LIBS = static lib files ( -lsocket 꼴이 아님. libcom.a) • chkstatus_LDADD = shared lib files ( libcom.so 등) • chkstatus_LDFLAGS = -L경로 –l<lib> 등 옵션 목록.