[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
3.1 간단한 예제, 시작부터 끝까지 | ||
3.2 전통적 프로그램 | ||
3.3 Building etags and ctags |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
당신의 머리가 소용돌이에서 소용돌이 사이로 떠다니게 하는 프로그램인,
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] | [ ? ] |
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] | [ ? ] |
여기에 또다른, 트릭이 더 많이 사용된 예제가 있다. 이 예제에서는 같은
소스 파일(‘etags.c’)에서 어떻게 두개의 프로그램(ctags
와
etags
)을 만들어 낼 수 있는지 알수 있다. 여기서 어려운 부분은
‘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 July 8, 2017 using texi2html 1.82.