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