[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3. 몇몇 예제 패키지


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.1 간단한 예제, 시작부터 끝까지

당신의 머리가 소용돌이에서 소용돌이 사이로 떠다니게 하는 프로그램인, zardoz의 작성을 끝냈다고 가정하자. 호환성 높은 구조를 위해 autoconf를 사용했지만 ‘Makefile.in’ 파일들은 임기응변으로 만들었다. 이 파일들을 튼튼하게 하기 위해서, automake로 눈을 돌렸다.

첫번째로 할 일은, ‘configure.in’에 automake가 필요로 하는 명령을 포함시키는 것이다. 가장 간단한 방법은 AC_INIT 바로 다음에 AM_INIT_AUTOMAKE를 추가하는 것이다.

 
AM_INIT_AUTOMAKE(zardoz, 1.0)

이 프로그램은 어떤 복잡한 요소도 없기 때문에 (예를 들어, gettext를 사용하지도 않고, 동적 라이브러리를 만들려고 하지도 않는다), 이 부분은 끝마쳤다. 아주 쉽다!

이제 ‘configure’를 다시 만들어야 한다. 하지만 이 일을 하려면, autoconf에게 당신이 사용중인 새로운 매크로가 어디있는지 알려줘야 한다. 가장 쉬운 방법은 aclocal 프로그램을 사용해서 ‘aclocal.m4’ 파일을 만드는 것이다. 하지만 아직... 이 프로그램을 위해서 이미 몇개의 매크로를 어렵게 작성해서, 이미 ‘aclocal.m4’ 파일을 가지고 있을 수도 있다. aclocal에서는 손수 작성한 매크로를 ‘acinclude.m4’에 넣을 수 있다. 그래서, 단지 이름을 바꾸고 실행하면 된다:

 
mv aclocal.m4 acinclude.m4
aclocal
autoconf

이제 zardoz를 위한 ‘Makefile.am’을 작성해야 할 때다. zardoz는 사용자 프로그램이기 때문에, 나머지 다른 사용자 프로그램이 있는 디렉토리에 설치하고 싶다. 또 zardoz는 Texinfo 문서도 가지고 있다. ‘configure.in’ 스크립트에서는 AC_REPLACE_FUNCS를 사용하기 때문에, ‘@LIBOBJS@’와 링크해야 한다. 즉 다음과 같이 작성해야 한다:

 
bin_PROGRAMS = zardoz
zardoz_SOURCES = main.c head.c float.c vortex9.c gun.c
zardoz_LDADD = @LIBOBJS@

info_TEXINFOS = zardoz.texi

이제 automake --add-missing을 실행하면, ‘Makefile.in’을 만들고, 필요한 몇몇 보조 파일들을 가져온다. 그리고 당신은 해냈다!


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.2 전통적 프로그램

GNU hello는 그 전통적인 간단함과 융통성때문에 유명하다. 이 절은 Automake가 GNU Hello 패키지에 어떻게 사용될 수 있는지 설명준다. 아래의 예는 가장 최신의 GNU Hello에서 온 것이지만, 저작권에 관한 언급과 같이 메인테이너에게만 필요한 코드는 전부 뺐다.

물론, GNU Hello는 소스가 두줄밖에 안 되는 전통적인 Hello보다 훨씬 더 기능이 많다. GNU Hello는 국제화 되어 있고, 옵션을 처리하고, 매뉴얼과 테스트 모음이 들어 있다. GNU Hello는 deep 패키지이다.

여기에 GNU Hello의 ‘configure.in’이 있다:

 
dnl Process this file with autoconf to produce a configure script.
AC_INIT(src/hello.c)
AM_INIT_AUTOMAKE(hello, 1.3.11)
AM_CONFIG_HEADER(config.h)

dnl Set of available languages.
ALL_LINGUAS="de fr es ko nl no pl pt sl sv"

dnl Checks for programs.
AC_PROG_CC
AC_ISC_POSIX

dnl Checks for libraries.

dnl Checks for header files.
AC_STDC_HEADERS
AC_HAVE_HEADERS(string.h fcntl.h sys/file.h sys/param.h)

dnl Checks for library functions.
AC_FUNC_ALLOCA

dnl Check for st_blksize in struct stat
AC_ST_BLKSIZE

dnl internationalization macros
AM_GNU_GETTEXT
AC_OUTPUT([Makefile doc/Makefile intl/Makefile po/Makefile.in \
           src/Makefile tests/Makefile tests/hello],
   [chmod +x tests/hello])

AM_’ 매크로들은 Automake가 (혹은 Gettext 라이브러리가) 제공하는 것이다; 나머지는 표준 Autoconf 매크로이다.

가장 윗 디렉토리에 있는 ‘Makefile.am’은:

 
EXTRA_DIST = BUGS ChangeLog.O
SUBDIRS = doc intl po src tests

보시다시피, 실제 작업은 서브디렉토리에서 일어난다.

po’와 ‘intl’ 디렉토리는 gettextize를 써서 자동으로 만들어 진다: 이것에 대해서는 여기서 설명하지 않는다.

doc/Makefile.am’에서는:

 
info_TEXINFOS = hello.texi
hello_TEXINFOS = gpl.texi

이것만 있으면 충분히 GNU Hello 매뉴얼을 만들고, 설치하고, 그리고 배포하는 데 충분하다.

다음은 ‘tests/Makefile.am’이다:

 
TESTS = hello
EXTRA_DIST = hello.in testdata

hello’ 스크립트는 configure가 만들어 낸다. 그리고 이 스크립트는 유일한 테스트케이스이다. make check가 이 테스트를 실행할 것이다.

실제로 모든 작업이 일어나는 ‘src/Makefile.am’을 보자:

 
bin_PROGRAMS = hello
hello_SOURCES = hello.c version.c getopt.c getopt1.c getopt.h system.h 
hello_LDADD = @INTLLIBS@ @ALLOCA@
localedir = $(datadir)/locale
INCLUDES = -I../intl -DLOCALEDIR=\"$(localedir)\"

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.3 Building etags and ctags

여기에 또다른, 트릭이 더 많이 사용된 예제가 있다. 이 예제에서는 같은 소스 파일(‘etags.c’)에서 어떻게 두개의 프로그램(ctagsetags)을 만들어 낼 수 있는지 알수 있다. 여기서 어려운 부분은 ‘etags.c’를 각각 컴파일할때 다른 cpp 옵션이 필요하다는 것이다.

 
bin_PROGRAMS = etags ctags
ctags_SOURCES =
ctags_LDADD = ctags.o

etags.o: etags.c
        $(COMPILE) -DETAGS_REGEXPS -c etags.c

ctags.o: etags.c
        $(COMPILE) -DCTAGS -o ctags.o -c etags.c

ctags_SOURCES는 값이 없는 변수로 정의된다는 것에 유의하자—이렇게 하면 이 변수의 값으로 어떤 내포적인 값이 사용되지 않는다. 하지만, ‘etags.o’에서 etags를 만드는 것은 내포적인 규칙이다.

링크 명령에 ‘ctags.o’가 들어가도록 하기 위해 ctags_LDADD가 쓰인다. 한편 ctags_DEPENDENCIES는 Automake로 만들어진다.

만약 컴파일러가 ‘-c’와 ‘-o’ 옵션을 동시에 받아들일 수 없다면, 위의 룰(rule)은 동작하지 않는다. 이걸 간단히 고치는 방법은 가짜 의존성을 하나 추가시키는 것이다 (병렬적으로 make 실행할때 문제를 피하기 위해서).

 
etags.o: etags.c ctags.o
        $(COMPILE) -DETAGS_REGEXPS -c etags.c

ctags.o: etags.c
        $(COMPILE) -DCTAGS -c etags.c && mv etags.o ctags.o

또, 만약 ANSI C 문법을 없애는 기능을 사용한다면(see section 자동 ANSI문법 없애기), 이 룰은 동작하지 않을 것이다; ANSI C 문법을 없애는 기능까지 지원하려면 조금 더 작업해야 한다:

 
etags._o: etags._c ctags.o
        $(COMPILE) -DETAGS_REGEXPS -c etags.c

ctags._o: etags._c
        $(COMPILE) -DCTAGS -c etags.c && mv etags._o ctags.o

[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Autobuild on June 20, 2017 using texi2html 1.82.