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
  • computer/programming/오픈소스를_이용한_프로그래밍3.txt
  • Last modified: 3 years ago
  • by likewind