Egloos | Log-in
F/OSS study
F/OSS study
[aclocal] m4 매크로 파일 추가하기
OS: Ubuntu 9.04
aclocal: 1.10.2


aclocal은 보통 autogen.sh 혹은 autoreconf 실행 시 제일 처음으로 불리며
configure.in 혹은 configure.ac 파일을 읽어 필요한 m4 매크로들을
aclocal.m4 파일로 정리해주는 perl 스크립트이다.

aclocal은 실행 시 m4 매크로 파일을 찾기 위해
다음과 같은 3가지 경로를 순서대로 탐색한다.

my @user_includes = ();
my @automake_includes = ("/usr/share/aclocal-$APIVERSION");
my @system_includes = ('/usr/share/aclocal');

여기서 user_includes는 aclocal 실행 시 -I 옵션으로 넘긴 디렉터리로 치환되며,
--acdir 옵션을 이용하여 automake_includes와 system_includes를 변경할 수 있다.
위에서 APIVERSION은 현재 automake 버전인 1.10으로 치환된다.
(aclocal은 automake와 함께 배포된다.)

user_includes에는 해당 프로그램의 개발자가 필요한 매크로들을
직접 정의해서 모아둔 디렉토리가 될 것이고,
automake_includes에는 automake에서 제공해 주는 기본 매크로들이 들어있다.

system_includes에는 그 외의 다른 다양한 프로그램(라이브러리)들이
configure 시 자신을 인식시키기 위한 테스트들을 포함한 매크로들이 들어있으며,
이는 명령행 인자 (--with-PACKAGE), 캐시 변수 (ac_cv_PACKAGE), pkg-config 등을 이용한다.

간단한 실험을 하나 해보자.
우선 테스트에 사용할 프로그램으로 GNU hello를 받도록 하자.

wget ftp://ftp.gnu.org/gnu/hello/hello-2.4.tar.gz -O- | tar xzf -

hello-2.4 디렉터리로 이동하여 configure.ac 파일을 열어보자.
이 파일은 비교적 간단한 구성으로 되어 있으며 중간쯤 보이는
AC_PROG_CC, gl_EARLY, gl_INIT, AM_MISSING_PROG, AM_GNU_GETTEXT 등이
외부 프로그램을 찾는 매크로이다.

여기서 gl_ 시작하는 매크로들은 hello 프로그램과 같이 배포되는
gnulib 라이브러리에 대한 것이므로
user_includes에서 찾을 수 있도록 다음과 같이 aclocal을 실행해야 한다.
(-I 옵션은 디렉터리를 재귀적으로 탐색하지 않는다는 것을 기억하자!)

aclocal -I gnulib/m4

여기에 한 번 glib에 대한 내용을 추가해 보도록 하자.

먼저 glib에 대한 매크로를 정의하는 m4 파일이 필요한데
우분투의 경우 libglib2.0-dev 패키지를 설치하면
/usr/share/aclocal/glib-2.0.m4 파일이 생긴다.
(물론 m4와 autotools에 익숙하다면 이 파일을 직접 작성해도 무방하다.)

이 glib-2.0.m4는 AM_PATH_GLIB_2_0 이라는 매크로를 제공하므로
우리의 configure.ac 파일에 다음과 같이 적당한 곳에 이것을 포함시켜 보자.

# We need a C compiler.
AC_PROG_CC

# Since we use gnulib: gl_EARLY must be called as soon as possible after
# the C compiler is checked. The others could be later, but we just
# keep everything together.
gl_EARLY
gl_INIT

dnl glib 테스트
AM_PATH_GLIB_2_0

# GNU help2man creates man pages from --help output; in many cases, this
# is sufficient, and obviates the need to maintain man pages separately.
# However, this means invoking executables, which we generally cannot do
# when cross-compiling, so we test to avoid that (the variable
# "cross_compiling" is set by AC_PROG_CC).
if test $cross_compiling = no; then
AM_MISSING_PROG(HELP2MAN, help2man)
else
HELP2MAN=:
fi

이제 다시 'aclocal -I gnulib/m4' 명령을 실행시켜보면
/usr/share/aclocal/glib-2.0.m4에서 정의한 AM_PATH_GLIB_2_0의 내용과
이것이 의존하는 /usr/share/aclocal/pkg.m4의 내용들이
aclocal.m4 파일에 추가된 것을 볼 수 있다.

또 한 가지 흥미로운 사실은
system_includes에 있는 매크로들은 aclocal.mp4 파일에 내용이 그대로 복사되지만
user_includes에 있는 매크로들은 m4_include([파일이름]) 형식으로만 추가된다는 것이다.

m4test 디렉터리를 만들어서
/usr/share/aclocal/glib-2.0.m4 파일을 복사해 넣고
autom4te.cache 디렉터리를 삭제한 후에 (그렇지 않으면 변경이 안된다!)
다시 'aclocal -I m4test -I gnulib/m4' 명령을 실행시켜보면
aclocal.m4에 AM_PATH_GLIB_2_0 매크로의 내용이 사라지고
맨 아래쪽에 m4_include([m4test/glib-2.0.m4])와 같은 내용이 생긴 것을 볼 수 있다.

...
m4_include([gnulib/m4/unistd_h.m4])
m4_include([gnulib/m4/wchar.m4])
m4_include([gnulib/m4/wctype.m4])
m4_include([gnulib/m4/wint_t.m4])
m4_include([gnulib/m4/xalloc.m4])
m4_include([m4test/glib-2.0.m4])
by namhyung | 2009/05/02 13:23 | Tips | 트랙백 | 덧글(0)
트랙백 주소 : http://studyfoss.egloos.com/tb/4922394
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지 다음 페이지 ▶

카테고리
General
Application
System
Kernel
Book
Tips
태그
awk block-layer blktrace patch elf computer-architecture gcc perf build C compiler kernel glibc emacs linux bash documentation synchronization CARM script binutils scm algorithm x86 vcs memory sed CAaQA3 SMP git
전체보기
이글루 파인더

최근 등록된 덧글
1번은 call-stack 금방 확인이 ..
by 혁 at 11/13
해당 문법에 대한 자세한 가이드 같..
by ㅇㄷㅎ at 11/07
perf에 대한 설명 감사드립니다! ..
by flavono123 at 10/24
최근 등록된 트랙백
Tod's Ferrari Homme
by Tods Pas Cher,Kodak did ..
Mocassin Femme
by Mocassins Homme, I got so..
natural garcinia cambogia
by
rss

skin by jiinny


X