====== 오픈소스를 이용한 프로그래밍3 ======
====== Tar Ball ? ======
리눅스에서 프로그램을 설치하는 방법 중에는 크게 source 설치와 binary 설치가 있다.
일반적으로 source 의 경우에는 tar.gz 같은 확장자로 배포되며, binary 의 경우에는 각 배포판에 따라, rpm, ipk 등으로 배포된다.
손쉽게 설치할 수 있는 binary 설치에 반해, source 설치는 약간의 수고(?)를 필요로 한다.
거의 대부분의 source 프로그램이
#./configure
#make
#make install
이런식으로 설치가 이루지지만, 꼭 100% 그렇지는 않다. 반드시 readme 파일을 읽어보기 바란다!!
여기서는 바로 앞에서 만들었던 아주 간단한(?) 프로그램을 source package 로 만들어 보도록 할 것이다. 필자 역시, 남의 프로그램을 설치만 해왔기 때문에, 솔직히 어떤식으로 컴파일되고 설치되는지는 알지 못한다. 이번 과정을 통해서 위의 명령어들이 어떤 식으로 수행되는지 알게 될 것이다.
바로 작업(?)에 들어가기에 앞서 몇가지 알아두고 넘어가야 할 것들이 있다.
| autotool | autoconf 패키지나 automake 패키지에 들어있는 일련의 유틸리티 |
| autoconf | configure.ac 파일을 입력받아 configure 스크립트를 생성 |
| configure | config.status 스크립트 생성 |
| config.status | configure 스크립트가 수집한 시스템 정보를 바탕으로 Makefile.in 파일을 입력으로 받아 Makefile 생성 |
| Makefile.in | Makefile 의 템플릿 파일로 configure 가 수집한 시스템 정보를 바탕으로 Makefile 을 생성 |
====== 작업하기 ======
일단 가장 먼저 configure.ac 파일을 아래의 내용으로 만든다.
AC_INIT(mainu, 0.0.1, fat81@hanmail.net)
AC_PROG_CC
AC_CHECK_LIB([m], [sin])
AC_CHECK_HEADERS([libintl.h])
AC_CHECK_FUNCS([setlocale])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
만들었으면,
#autoconf
정상적으로 수행이 되었으면, configure 파일이 생성되었을 것이다. 기존의 Makefile 을 지우고, Makefile.in 파일을 아래와 같이 생성한다.
CC = @CC@
CFLAGS = @CFLAGS@
LDFLAGS = @LIBS@
main : main.c hello.c
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
clean :
@rm -rf *.o main
이제 다음과 같이 실행해보자!
#./configure
어디선가 많이 본듯한 메세지들이 출력되지 않는가?? 아주 간단한 프로그램이지만, 출력 메세지들을 실제로 보면, 정말 대단한 프로그램이구나! 하는 생각마저 든다. ^^;
에러없이 수행이 되면, Makefile 이 만들어졌을 것이다. vi 로 열어보면,
CC = gcc
CFLAGS = -g -O2
LDFLAGS = -lm
main : main.c hello.c
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
clean :
@rm -rf *.o main
예전과 같다는 것을 알 수 있다. 컴파일을 해보자!
#make clean
#make
이번에는 좀더 이식성(?) 높은 Makefile.in 을 만들어보자! configure.ac 파일을 다음과 같이 수정한다.
AC_INIT(mainu, 0.0.1, fat81@hanmail.net)
AM_INIT_AUTOMAKE([mainu], [0.0.1]) // 추가할 부분
AC_PROG_CC
AC_CHECK_LIB([m], [sin])
AC_CHECK_HEADERS([libintl.h])
AC_CHECK_FUNCS([setlocale])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
Makefile.in 파일을 지우고, 다음과 같이 명령한다.
#alocal
#autoconf
#automake --add-missing --foreign --copy
Makefile.in 파일이 새로 생성되었을 것이다. 직접 열어보자!
@SET_MAKE@
SHELL = @SHELL@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
sbindir = @sbindir@
libexecdir = @libexecdir@
datadir = @datadir@
sysconfdir = @sysconfdir@
sharedstatedir = @sharedstatedir@
localstatedir = @localstatedir@
libdir = @libdir@
infodir = @infodir@
mandir = @mandir@
includedir = @includedir@
oldincludedir = /usr/include
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = .
ACLOCAL = @ACLOCAL@
AUTOCONF = @AUTOCONF@
AUTOMAKE = @AUTOMAKE@
AUTOHEADER = @AUTOHEADER@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_HEADER = $(INSTALL_DATA)
...
...
...
앞에서 직접 작성했던 것보다 훨씬 더 많은 내용들로 만들어져 있는 걸 볼 수 있다.
#./configure
#make
직접 컴파일을 하면, 전과 다르게 뭔가 많은 메세지를 뿌리면서 컴파일이 된다.
source='main.c' object='main.o' libtool=no \
depfile='.deps/main.Po' tmpdepfile='.deps/main.TPo' \
depmode=gcc3 /bin/sh ./depcomp \
gcc -DPACKAGE_NAME=\"mainu\" -DPACKAGE_TARNAME=\"mainu\" -DPACKAGE_VERSION=\"0.0.1\" -DPACKAGE_STRING=\"mainu\ 0.0.1\"
-DPACKAGE_BUGREPORT=\"fat81@hanmail.net\" -DPACKAGE=\"mainu\" -DVERSION=\"0.0.1\"
-DHAVE_LIBM=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1
-DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_LIBINTL_H=1 -DHAVE_SETLOCALE=1 -I. -I.
-g -O2 -c `test -f 'main.c' || echo './'`main.c
main.c:4:1: warning: "PACKAGE" redefined
main.c:1:1: warning: this is the location of the previous definition
source='hello.c' object='hello.o' libtool=no \
depfile='.deps/hello.Po' tmpdepfile='.deps/hello.TPo' \
depmode=gcc3 /bin/sh ./depcomp \
gcc -DPACKAGE_NAME=\"mainu\" -DPACKAGE_TARNAME=\"mainu\" -DPACKAGE_VERSION=\"0.0.1\" -DPACKAGE_STRING=\"mainu\ 0.0.1\"
-DPACKAGE_BUGREPORT=\"fat81@hanmail.net\" -DPACKAGE=\"mainu\" -DVERSION=\"0.0.1\" -DHAVE_LIBM=1 -DSTDC_HEADERS=1
-DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1
-DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_LIBINTL_H=1 -DHAVE_SETLOCALE=1 -I. -I.
-g -O2 -c `test -f 'hello.c' || echo './'`hello.c
gcc -g -O2 -o main main.o hello.o -lm
----
{{indexmenu>:#1|skipns=/^(wiki|etc|diary|playground)$/ skipfile=/^(todays|about|guestbook)$/ nsort rsort}}
----