Debian Gnu/Linux 3

-데비안 패키지 만들기의 실체 (1)

박주연 / 나우누리 리눅스 동호회 시샵

들어가기에 앞서

지난호까지 데비안의 dselect의 메뉴 시스템을 통해 원하는 패키지를 설치하는 방법과 중간수준의 패키지 관리 프로그램인 dpkg를 통해 데비안 패키지를 조작하는 방법에 대하여 살펴보았다. 개념상 알아두어야 할 부분이 많고 생소할 수 있는 데비안 패키지라고 생각할 수 있지만 많이 사용되어 온 레드햇과 비교할 때 별 다른 차이점은 없다. 레드햇은 그 패키지에 방식과 설치작업을 데비안의 그것에서 많이 차용해왔기 때문에 둘의 개념이 비교적 비슷하다. 하지만 비교적 어렵게 느껴졌을지도 모르겠다. 이번 호에서는 지난 호까지 다루었던 데비안 메뉴시스템인 dselect 그 뒤에서 패키지의 설치./ 추가 /.삭제를 실질적으로 행하는 프로그램인 dpkg와 그 부속 프로그램에 대한 개념을 갖고 패키지 작성 프로그램을 알아보고 실제로 하나의 프로그램을 예로 들어가며 패키징을 해보기로 한다.

여기에서 소개하는 패키징은 극히 초보적인 단일 에플리케이션에 대한 패키징 방법만을 다루며 그외의 것들은 이 글의 범주를 벗어나게 되므로 생략하기로 한다.

우선 알아두어야 할 전체적 개념

레드햇에서는 패키징과 관련한 파일이 소스파일내에 spec 파일이 있는데. 데비안도 역시 그와 비슷한 역할을 하는 내용들이 잇다 데비안에서는 소스파일이 root 트리에서 debian 디렉토리에 관련된 파일이 저장되게 된다 우리는 우선 그 예로 GNU Hello 프로그램을 들 것이다 GNU Hello 프로그램은 GNU 프로젝트의 정신을 가장 잘 나타내는 프로그램인 동시에 GNU 프로그램이 모두 이 프로그램의 코딩방식을 따른다는 것을 보여주는 좋은 예이다. 마찬가지로 데비안 패키징의 예제로 GNU Hello는 훌륭한 역할을 해낼 것이다.

우선 GNU Hello 패키지를 받아 묶음을 풀어내자 아마도 GNU Hello는 다음과 같은 버전번호를 가질 것이다.

hello-1.3.tra.gz

이 패키지의 다음의 위치에서 받아올 수 있다.

ftp://src.doc.ic.ac.uk/gnu/hello-1.3.tar.gz

한국 내에 거주하는 사람이라면 유명FTP 사이트에서 받아올 수 있을 것이다. 우선 이 패키지를 풀어내게 되면 hello-1.3/이라는 디렉토리가 생겨난다. 이제 이 원래의 소스에 살을 붙여(?) 데비안 패키지를 빌드해 내는 데비안 소스패키지를 만들어내게 된다 이때 원래의 소스파일의 변형이 없도록 하는 것이 가장 중요하나 소스패키지를 데비안 배포본정책이나 리눅스 FSSTND에 맞춰야 한다면 소스를 그에 맞게 수정하는 것도 필요하다 하나하나 만들기는 복잡하므로, 이때에 사용되는 효과적인 프로그램이 있다. 이 프로그램의 이름은 deb-make 이고  debmake 패키지를 설치하면 사용할 수 있다.

debmake 의 최신버전은 필자가 이 글을 쓸 때에 3.5.4였다 아마도 이 글을 여러분이 볼 때 즈음에도 이것이 최신버전일 것 같다. 이 debmake가 없으면 사실 데비안 패키징은 중노동(?) 일수밖에 없다. 하지만 사람은 언제나 편한 쪽으로 가게 마련 아닐까 . 데비안 패키징을 자동화하는 작업을 해주는 프로그램(deb-make,debstd, dpkg-shilbdeps등)은 복잡하게 느껴질 수도 있는 패키지 관리를 편리하게 해준다.

그러면 하나하나 차례차례 해보도록 하자

풀려 나온 hello-1.3/디렉토리로 이동하도록 한다. 다음 파일들이 나타날 것이다. :

$ cd hello-1.3/
$ ls -F
COPYING      TAGS     getopt1.c    hello.info mkinstalldirs*
ChnageLog    alloca.c    gpl.texinfo   hello.ky    testdata
INSTALL configure*   hello.c hello.pg texinfo.tex
Makefules.in configure.in hello.cp hello.texi version.c
NEWS   etopt.c    hello.cps    hello.tp
README   getopt.h    hello.fn   hello.vr
$

이제 우리는 여기에서 deb-make를 실행시킬 것이다 deb-make를 실행시키면 사용자 대화방식으로 몇 가지를 물어 오게 되는데 이에 대해서 차근 차근히 대답해주면 된다 실행하면 다음과 같은 내용을 볼 수 있다.

$ deb-make
Email- Address : kokids@doit.ajou.ac.kr 
Date used   : Tue, 18 Nov 1997 02:49:54 +0900 
Maintainer    : Chu-yeon Park
 Package Name    :hello 
Version : 1-3
Type of Package (S=Single Binary, M=Multi-Binary , L =Libarary, X=About? s/m/l/x

deb-make를 실행하면 위와 같은 메시지를 볼 수 있다. 우선 deb-make를 실행하기 전에 알아두어야 할 사항이 있는데 소스 디렉토리의 이름은 <패키지이름>-<버전번호> 의 형식을 띠고 있어야 한다는 점이다 즉 GNU hello 와 같은 경우 hello-1.3과 같은 디렉토리가 지정되어야 한다 패키지의 이름에는 영어 소문자,숫자,그리고 대쉬(-)만이 가능하다 몇 가지 예를 들어보면 다음과 같다.

afterstep-1.0
sendmail-8.8.8       glibc-2.0.5c
grep-2.1           xfree86-3.3.1
patch-2.1          wu-ftpd-2.4
bash-2.01         elm-me+-2.4pl25me+37(*)

예로 든 패키지 이름 중 .elm-me+ 는 패키지 이름에 플러스(+) 부호가 들어가 있는데 사실상 별문제는 없다. 그러나 패키지 이름에 (+) 등의 기호를 넣는 것은 가급적 삼가야 한다.

우리가 위에서 본 메시지를 다시 한번 하도록 하자 deb-make는 소스 트리에서 만들어낼 패키지가 어떤 종류인지 물어온다. 보는 바와 같이 패키지의 종류는 세가지가 있다 우선 가장 단순한 패키지로 하나의 소스에서 단일의 패키지가 생성되는 경우이다 대부분의 경우 S를 통해 Single Binary 로 만들어내게 된다. 그 다음의 경우는 하나의 소스에서 여러 가지의 패키지가 나오게 되는 경우이다 보통 짧은 프로그램은 그렇지 않지만 소스가 긴 X 윈도우는 소스만 45만 메가바이트가 넘는 용량이다. 그리고 빌드하면 상당히 많은 양의 프로그램이 나오기 때문에 이것을 단일패키지로 만든다는 것은 좀 무리가 있다. 실제로 xfree86-3.3.1에서 만들어지는 패키지는 32개나 된다. 마지막으로는 라이브러리 패키지이다. 라이브러리 패키지는 보통 두 개의 패키지를 생성해낸다.하나는 일반적인 공유 라이브러리(Shared libarary)와 나머지 하나는 그와 관련된 헤더파일이다 보통 전자는 /usr/lib 디렉토리에 설치되게 되는 것들이며 후자는 *-dev_*.deb의 이름을 갖는 패키지이다.

hello-1.3/ 디렉토리에서 우리는 하나의 패키지만을 생성해낼 것이므로 S를 선택하면 되겠다. 혹은 만들지 않고 취소하려 할 때에는 X를 누르면 된다 물음이 나오기 전에 화면에 나타난 5줄의 정보가 맞는지 확인해봐야 한다. 이 내용은 패키지 전체에 걸쳐 적용이 된다.

S를 누르면 다음과 같은 메시지를 남기고 종료된다.

hello debianzed .It uses a configure script which probably
means that you do not have to edit the Makefile.

이제 패키지 만든 는 작업은 상당히 간단해졌다. hello 프로그램은 데비안 패키지로 만들어지는 첫 단계를 무사히 통과했다. 영어권 사람들이 말 만들어내는데는 귀신(?)인 듯 '데비안화' 리는 debianize라는 단어를 그대로 쓰니 말이다. 어쨌든 몇 가지 부분을 수정해야만 실제 hello 패키지가 만들어지니 시험 삼아 처녀작을 만들어보자 나타난 메시지대로 원래의 소스 Makefile을 고칠 필요는 없다. ( 그러나 FSSTND 때문에 고쳐야 할 때도 있음을 반드시 명심하길 )

커맨드 프롬프트가 나타난 후 어떤 변화가 생겨났는지 살펴보자

$ ls-F

COPYING      TAGS     getopt1.h    hello.fn hello.vr
ChnageLog    alloca.c    getopt1.c   hello.info  mkinstalldirs*
INSTALL configure*   gpl.texunfo hello.ky testdata
Makefules.in configure.in hello.c hello.pg texinfo.tex
NEWS   debian/   hello.cp     hello.texi version.c
README   getopt.c    hello.cps  hello.tp
$

별다른 변화는 없어 보인다. 그러나 그렇지 않다. 못보던 디렉토리 하나가 생겨났음을 알 수 있다. 바로 debian/ 디렉토리이다. 이 디렉토리 내부를 살펴보기 전에 상위 디렉토리를 살펴보자

$cd
$ls-F
hello-1.3/  hello-1.3.orig/
$

hello-1.3/ 디렉토리뿐 아니라 hello-1.3.orig/ 디렉토리가 나타난 것을 볼 수 있다.deb-make는 실행된 후 원 소스를 *.orig로 바꾸어 놓게 된다.즉 hello-1.3.orig/에는  맨처음 우리가 풀어놓은 원 소스가 위치하고 있는 것이고 hello-1.3/ 에는 데비안 패키지 빌드용 소스가 위치하게 된다.

다시 hello-1.3/ 디렉토리 내부로 이동하고 그 내부의 debian/디렉토리로 들어가보도록 하자

$cd hello-1.3/debian/
$ls -F
README.denian   copyright    diversions.ex   init.d.ex  rules*
changelog      crontab.ex   inetd.conf.ex   manpage.1.ex   watch.ex
control     dirs    info.ex    menu.ex
$

.ex 의 확장자를 가진 파일들이 많다는 것을 볼 수 있다. 몇 가지는 본 적이 있는 파일이, 몇 가지는 전혀 생소한 파일도 있다. 이 파일의 역할을 하나 하나 알아보도록 하자

READMEdebian:

이 파일에는 일반적인 패키지에 대한 설명이 들어가게 된다 이 파일은 최종적으로 ./usr/doc/<패키지이름>/디렉토리에 설치가 된다. 내부는 좀 초라할지 모르지만 간단한 설명이 삽입되어 있다. README.debian 의 내부는 다음과 같다

hello for DEBIAN

Comments regarding the Package

Chu-yeon Pakr <kokid@doit.ajou.ac,kr>.Tue 18 Nov 1997 03:00:25 +0900

맨 아랫줄에는 패키지를 만들어내는 사람의 E-mail주소와 언제 debianized 되었는지 그 날짜와 시간을 명시한다. 손 수 고쳐도 되지만 deb-make를 실행시킬 때 저장된 것으로 놔두는 것이 좋겠다.

changelog:

프로그래밍 때에는 반드시 무엇 무엇이 바뀌었는지 그에 대한 변화를 적어두면 추후에 다른 사람이 보거나 자기 자신이 확인해 볼 때 언제 무엇이 바뀌었는지 알아보기가 편하다 역시 데비안 패키지는 한번 만들고 없어지는 것이 아니기 때문에 지속적인 변화에 대한 로그가 필요하다 changelog파일의 내부를 살펴보자

hello (1.3-1) unstable : urgency-low
* Initial Release
-Chu-yeon Park <kokods@doit.ajou.ac.kr> Tue 18 Nov 1997 03:00:25 + 0900
Local variables :
mode : debian-changelog
add-log-mailing-address:"kokids@doit.ajou.ac.kr"
End:

changelog의 형식은 반드시 위와 같아야 한다 이 형식이 틀리면 패키지를 만들 때 마다 손수 작성하기는 상당히 번거롭다 이럴 때에는 dechange라는 프로그램을 통해 이 역시 자동화할 수 잇다 changelog가 제대로 기록되어야만 올바른 패키지가 만들어지게 된다 왜냐하면 데비안 패키지는 이 changelog의 내용과 control파일의 내용을 참조하여 이 패키지를 생성해 내기 때문이다.

debchange 프로그램의 사용법은 다음과 같다. 소스트리의 최상위에서 실행시키거나 debian/ 디렉토리에서 실행시키면 된다.

debchang[-v 버전번호][-n][내용]

dch[-v 버전번호][-n][내용]

debchange를 옵션없이 실행시키게 되면 다음과 같다

hello (1.3-1) unstable : urgency-low
*
* Initial Release
-Chu-yeon Park <kokods@doit.ajou.ac.kr> Tue 18 Nov 1997 03:00:25 + 0900
Local variables :
mode : debian-changelog
add-log-mailing-address:"kokids@doit.ajou.ac.kr"
End:

바뀐 점이라면 (*) 가 하나 더 생기고 커서틑 그 위치에서 깜빡이고 있다는 점이다 바뀐 점을 이제 하나하나 이곳에서 첨가하여 써 나가면 된다 혹시 리버전 번호 (Revision number)를 한단계 높이고 싶을 때 (1.3-1dptj 1.3-2로 )에는 -n 옵션을 사용하면 된다 실행 후 다음과 같이 됨을 볼 수 있다.

$ debchange -n

그러나 리비전 번호만 바뀌지는 않는다 전체 패키지의 판이 올라가면(Version-up) 버전의 숫자가 올라가야 한다 즉 1.3-2에서 1.4로 변화할 수도 있는 것이다. 그럴 때에는 -V 옵션을 이용하면 된다 다음과 같이 해보자 .
이렇게 하면 다음과 같이 변화하게 된다.

$ debchange -v 1.4

별다른 어려움은 없겠지만 changelog쓰는 것을 게을리 하지 말기 바란다.

hello (1.3-1) unstable : urgency-low
*
-Chu-yeon Park <kokods@doit.ajou.ac.kr> Tue 18 Nov 1997 03:41:44 + 0900
hello(1.3-1)unstable : urgency=low
Initial Release
-Chu-yeon Park <kokods@doit.ajou.ac.kr> Tue 18 Nov 1997 03:00:25 + 0900
Local variables :
mode : debian-changelog
add-log-mailing-address:"kokids@doit.ajou.ac.kr"
End:

changelog는 패키지 관리자의 성실도를 나타내며 패키지를 빌드할 때 에도 필수적임을 명심하기 바란다. 주의 할 점은 changelog 파일 내부는 debchange를 실행시킴과 동시에 변화하여 이미 저장되어 있는데 , 잘 못 기제되었거나 할 때에는 changelog 파일을 수동으로 고쳐주면 된다

control

이 파일은 데비안 패키지의 핵심이라고 할 수 있다. control 파일내부에는 패키지의 의존성과 대립성 그리고 이 패키지와 관련된 내용이 총망라되어 있다 우선 hello-1.3/debian/control 파일의 내부는 위와 같다

Source: hello
Section : unknow
Priority extra
Maintainer : Chu-yeon Park <kokids@doit.ajou.ac.kr>
Stands-Version: 2.3.0.0
Package : Hello
Architecture :any
Depends : ${shlibs: Depends]
Description : Missing
Missing

현재 하나의 소스에 하나의 패키지가 존재함을 볼 수 있다 이것은 deb-make를 실행시켰을 때 하나의 패키지만을 만들고자 하였기 때문에 이렇게 지정된 것이다. control 파일내부는 이처럼 Sourse 섹션은 반드시 하나여야하고 패키지섹션은 여러 개가되어도 상관없다 보통 이 control 파일은 패키지 대해 다음과 같은 명령을 주면 볼 수 있다. 설치가 안되어 있는 패키지라면 다음과 같이 타이핑한다. 지난호까지 다루었던 내용이므로 위에 대해 설명을 하지 않겠다.

$ dpkg- info <패키지 이름>_<버전번호>_<리버전번호>_<아키텍처명>.deb

설치가 되어있는 패키지라면 다음과 같이 하면 되겠다.

원래 GNU Hello 프로그램의 데비안 패키지에서 control

$ dpkg- s <패키지 이름>

은 어떻게 되어 있는지 살펴보도록 하자

Source: hello
Section :devel
Priority : optional
Maintainer : lan Jackson <ian@chiark.greenden.org.uk>
Stands-Version: 2.1.1.0
Package : hello
Architecture :any
Depends : ${shlibs: Depends]
Section: devel
Priority : optional
Description : The classic greeting , and a good example
The GNU hello program produces a familiar friendly greeting It allows nonprogrammers
to use a classic computer science tool which would otherwise be unavailable to them
Seriously. though : this is an example of how to do a Debian package. It is the
Debian version of the GNU Project's hello world program (which is itself an example)
for the GNU Projest )

즉 hello 프로그램의 소스에서 데비안 패키지가 만들어지게 됨을 명시하고 있다 그리고 이 소스의 세션(Section)은 devel 즉 development 섹션임을 기재한다. 데비안에는 패키지의 용도에 따라 섹션을 구분하여 놓는다는 것을 지난호에서 알아보았다.

Pririty는 역시 optiomal로 지정이 되며 Maintainer. 즉 패키지 관리자는 Ian Jackson 이라는 사람임을 명시하고 있다 이부분은 deb-make 실행시 지정되는 부분이다.

Standards-Version 은 데비안 패키지관리 표준의 버전을 나타낸다. 현재 2.3.0.0 까지 나와 있다. 다음부분이 패키지 부분이다 hello 소스에서 hello 라는 패키지가 만들어져 나오게 된다. 그리고 Architecure 에는 만들어진 패키지가 사용할 될 수 있는 패키지 명을 명시하게 된다. 특정 아키택처, 이를 테면 i386이나 alpha, sparc등을 적어줘도 되나 보통 any라고 명시하면 현재 빌드 되고 있는 아키택처에 따라 기재되게 된다. 이 곳에 all 이라고 명시될 경우 그 패키지는 plaform-independent 한 패키지로 보통 문서 파일이나 쉘스크립트 ,Perl 스크립트등이 이에 속하게 된다.

Depends 부분에는 ${shilds:Depends}라는 부분이 삽입되어 있는데, 이부분은 패키지가 빌드될 때 dpkg-shilbdeps 프로그램을 통해 해당패키지로 치환된다. 즉 라이브러리가 필요할 경우 ldd등의 프로그램을 통해 필요한 라이브러리를 찾은 후 라이브러리가 어느 패키지에 속하는지 체크한 후 이 곳에 기재해 주게 되어 있다.보통 체크 후 Depends 에 명시해 주는 패키지는 /etc/dpkg/shlibs.defaults안에 명시해 주는 패키지와 그 버전 번호를 따르게 된다.

주의할 점은 패키지 내부에서 길드되는 바이너리가 없고 플랫폼에 독립적인 패키지라면 ${shlibs:Depends}라는 부분의 에러가 나므로 all 패키지가 확실하다면 그 부분은 빼 주어야 한다.

이제 마지막 부분이다. Descrition 에는 dselect를 실행시킨 후 화면의 하단 부분에 나타나는 패키지의 설명을 적어주는 부분이다 패키지의 제목은 Description : 후에 간략히 적어주고 패키지에 대한 설명은 그 다음줄부터 맨 앞에 한 칸을 띄우고 적어 나가면 된다. 한 줄을 띄려면 줄 맨 앞을 한칸 띄우고 연달아 점(dot)을 찍어주면 된다.

copyright

패키지를 만들 때에 사용된 원 소스의 저작권을 명시한다. 소스의 저작권에 무감각 한 것이 우리나라 사람인데 이 저작권에 무감각하면 안된다 특히 패키지 관리자에게는 저작권의 범위에 따라 패키지 만드는 작업이 이루어져야 한다 왜냐하면 패키징을 통해 만들어진 것은 공공에 배포가 되는 것이고 원 저작자가 재 배포를 금하거나, 바이너리 형태로의 배포를 원하지 않는 경우가 있기 때문이다. 내부를 보고 빈칸만 적당히 고쳐 넣어주면 된다.

crontab, cron.daily cron,.weekly cron.monthly :

corntab에는 만약  이 패키지가 crom에 의해 주기적으로 실행되어야 하는 프로그램일 경우 crontab 의 형식에 맞춰 기재를 해주면, 자동으로 설치 후에 /etc/crontab을 수정하고 cron을 재 시작하게 된다. cron.daily. cron.weekly, cron.monthly 는 스크립트 파일로 dselect에 의해 자동으로 설치된다.

dirs:

debstd에 의해 호출되지는 않으나 빌드되어 패키지를 만들 때에 만들어질 디렉토리를 명시하게 된다. 보통 이 파일은 다음과 같이 기재되게 된다.

usr/bin
 
usr/sbin

이렇게 기재된후 debain/rules내에서 다음과 같이 이용된다.

binary-arch: checkroot build
 
                  $(checkdir)
 
                 -rm -rf debian/tmp
 
                  install -d debian/tmp
 
                  cd debian/tmp & & install -d cat../dirs
 
                  make install prefix =pwd/debian/tmp/usr

diversion

이미 있는 패키지에 겹치지 않고, 추후의 패키지 업그레이드 때에는 이를 방지하여 줄 수 있는 기능을 제공한다. 간단히 예를 들면 이런 것이다 만약 SSL 보안 기능이 있는 아파치 웹데몬을 설치하고 싶은데 이럴 경우 기존의 SSL보안 기능이 없는 웹데몬에 겹쳐 써지게 되는 문제점이 발생한다. 이럴 경우 diverision파일에 이를 명시하여 SSL보안기능이 없는 웹데몬을 다른 이름으로 바꾸어 놓은 후 ( 이를테면 apach.nossl) 이를 패키지 관리자에게 알려주어서 나중에 보안 기능이 없는 웹데몬을 설치할 때 apache를 설치하게 되면 apache.nossl 로 인식하도록 하는 것이다. 이렇게 하면 보안 기능이 없는 아파치 웹데몬이 패키지로 업그레이드가 되더라고 보안 기능이 있는 웹데몬을 지우지 않고 업그레이드를 할 수 있게 된다.

inetd.conf :

이 파일에 기록된 것은 패키지가 설치될 때 /etc/inetd.conf를 자동으로 수정하여 주게 된다.

postinst , postrm preinst, prerm

이것은 패키지 설치때 사용되는 스크립트들이다. 이 스크립트는 셀 스크립트나 펄 스크립트로 만들어지게 된다. 앞에서부터 차례대로 보면 postinst 는 패키지를 unpack한 후에 실행되며 , postrm는 패키지를 remove 한 후에 실행되고 preinst는 패키지를 remove 하기 전에 실행된다. 좀 복잡한 것같지만 복잡한 것은 아니고 이를 얼마나 효과적으로 사용하느냐에 따라 패키지 설치의 무결성이 입증될 수 있다 무엇보다도 패키징은 하나의 프로그래밍과 같아서 어떠한 상황에서도 문제없이 설치되고 , 어떠한 상황이라도 그 예외 처리가 정확히 이루어져야 한다 GUN Hello 프로그램의 postinst와 prerm 파일을 첨부한다. 참고가 되길 바란다.

#!/bin/sh
 
set -e
 
install-info -description ='GNU Hello. Print a classic greeting.\
 
              -quite/usr/info/hello.info

GNU Hello 의 debian/postinst

#!/bin/sh
 
set-e
 
install-info -quiet -remove/usr/hello.info

GNU Hello의 debian/prerm

conffles

보통 /etc 디렉토리에 설치되는 configuration files 들 (예를 들어 *.conf 와 같은 것들)을 명시해 놓게 된다 이렇게 하면 패키지를 설치할 때 설정파일이 존재하면 이 파일에 덮어 쓰기를 하여 패키지와 함께 배포되는 설정파일을 설치할지 아니면 그대로 놔둘 것인지를 물어오게 된다 또한 dpkg-remove <패키지이름>을 통해 패키지의 삭제를 할 경우 이곳에 명시된 파일은 제외하게 된다.

rules :

가장 중요한 파일이다. 이 파일은 보통 Makefile 의 형식을 따르고 있다. 이 파일은 가장 만들기 어렵기도 하지만 매우 간단하기도 하다 GNU Hello를 만들어 낼 때는 일반적인 GNU  프로그램이 그러하지만 다음과 같은 절차를 통해 설치가 된다.

$./configure
 
$./make
 
$./make install

이에 대해 debian/rules파일에 기재를 해주면 되는 것이다.

GNU  Hello 패키지를 만들어낼 때 사용되는 rules 파일은 어떻게 기재가 되어 있는지 보도록 하자

#! /usr/bin/make -f
 
# Sample debian.rules file -for GNU Hello(1.3)
 
# Copyright 1994 ,1995 by lan Jackson
 
# I hereby give you perpetual unlimited permission to copy
 
# modify and relicence this file , provided that you do not remove
 
# my name from the file it self (I assert my moral right of
 
# paternity under the Copyright . Designs and Patents Act 1988)
 
# This file may have to be extensively modified
 
# There used to be source and diff targets in this file, an many
 
# package also had changes' and dist' targets These functions
 
# have been taken over by dpkg-source. dpkg-genchages and
 
# dpkg- buildpackage in a package-indepandent way, and so these targets
 
# are obsolete
 
package= hello
 
build:
 
             $(checkdir)
 
             ./configure-prefix= /usr
 
             $(MAKE) CFLAGS =-O2 LDFLAGS=
 
            touch build
 
clean:
 
            $(checkdir)
 
            -rm -f build
 
            -$(MAKE) -i distclean ||$ (MAKE) -f Makefile.in distclean
 
            -rm -rf* ~ debian/tmp debian/*~ debian/files* debian/substvars
 
bibary-indep : checkroot build
 
            $(checkdir)
 
# There are no architecture-independent files to be unloaded
 
# generated by this package. If there were any they would be
 
# made here
 
binary-arch: checkroot build
 
              $(checkdir)
 
              -rm -rf debian /tmp
 
              install -d debian/tmp  debian/tmp/DEBIAN
 
              install -d debian/tmp/usr/doc/$(package)
 
             cp debian/{postinst.prerm} debian/tmp/DEBIAN
 
             cdmod + X debian/tmp/DEBIAN/{postinst.prerm}
 
             $(MAKE) CFLAGS=-o2 LDFAGS=-s install_program='install-c-s'\
 
                    prefix=debian/tmp/usr install
 
             gzip -9v debian/tmp/usr/info/*
 
             cp debian/copyright debian/tmp/usr/doc/$(Package)/.
 
             cp debian/changelog debian/tmp/doc/$(package)/changelog.Debian
 
 
             cp Changelog debian/tmp/usr/doc/$(package)/changelog
 
 
             gzip -9v debian/tmp/usr/doc/$(package)/changelog{,.Debian}
 
 
             dpkg -shlibdeps hello
 
             dpkg-gencontrol
 
             chown -R root.root debian/tmp
 
             chmod -R g -ws debian.tmp
 
             dpkg -bulid debian.tmp..
 
define checkdir
 
            test -f $(package).c -a -f debian/rules
 
endef
 
# Below here is fairly generic really
 
binary :    binary-indep binary-arch
 
source diff :
 
             @echo> &2'source and diff are obsolete - use dpkg -source -b' :false
 
checkroot:
 
             $(checkdir)
 
             test root = "whoami"
 
.PHONY : binary bibary-arch-indep clean checkroot

그밖에 매우 많은 관련파일이 존재한다. debian/디렉토리 내에 존재하는 파일은 하나하나 그 쓰임새가 있으며, 패키징을 할 때 꽤 도움을 주는 파일이다. 자세한 것은 debstd(1)를 참조하기 바란다 .

패키징 절차 끝, 이제 빌드해 보자

참 지루하지만 힘든 일은 대충 끝났다. 패키징시에는 changelog,control, rules 파일이 우선적으로 만들어진다.

다 되었으면 hello -1.3 디렉토리로 이동한 후 다음과 같이 타이핑한다.

$debian/rules build

이렇게 하면 컴파일을 한후 마지막 줄에서 touch bulid를 통해 패키지의 build 절차가 마쳐졌음을 알려준다. 이제는 이것을 데비안 바이너리로 만들 차례이다.

프롬프트에서 다음과 같이 타이핑한다. 이절차를 하기 전에 root 권한 이 있어야 한다.

$debian/rules binary

맨 마지막 줄에 다음과 같이 메시지가 나온다면 성공이다.

이렇게 한 후 바로 상위 디렉토리에 원하는 패키지가 만들어 병摸?처녀작인 GNU  Hello 패키징은 끝나게 된 셈이다.

dpkg - build debian/tmp..
 
dpkg-deb : building package hello'in../hello_1.3-1_i386.deb'.

소스패키지 관리

아주 간단한 일부분에 대해서 설명해서 여러분들이 극도로(?) 당황하였거나 헤메는 사태가 있지 않았는지 모르겠다. 무엇이나 마찬 가지겠으나 , 백문이 불여 일견이다. 필자는 너무 간단한 내용만을 전달했는지 모르겠다. . 이제 여러분들이 할 일은 패키지소스를 살펴보고 그 작동원리를 추측해보는 것이 가장 현명한 일이다 패키지를 만들어 냈으며 dpkg-source 프로그램을 이용하여 배포를 준비하여야 한다.

데비안 소스 패키지는 다음과 같은 형식을 따른다.

위의 세가지가 데비안 소스패키지를 이룬다. 이 소스패키지를 풀어내는 방법은 간단하다 추후에 소스를 받아서 컴파일한다던가 혹은 몇 가지 수정하여 새로운 패키지를 리빌드할 때에 사용할 수 있겠다.

<패키지이름>_<버전번호>_<리비전 번호>.dsc
 
<패키지이름>_<버전번호>_<리비전번호>.diff.gz(없을수도 있음)
 
<패키지이름>_<버전번호>_orig.tar.gz

패키지를 풀어내는 방법은 다음과 같다.

$ dpkg-source-x <패키지이름>_<버전번호><리비전번호>.dsc

이렇게 하면  데비안 소스 패키지가 풀려 나오게 된다.

마치며

데비안 패키징 하는 방법을 레드햇과 비교할 때 좀 알아야 되는 것이 많다는 점이 흠이다. 하지만 조금만 머리를 쓰면 금세 만들어 낼 수 있는 것이 데비안 패키지 이기도 하다.

또한 데비안은 각 배포본 간의 우수한 이식성도 제공한다. alien 패키지를 통해 rpm. tgz 즉 레드햇과 슬렉웨어 의 패키지를 데비안패키지로 만들어낼 수도 있다. 어떻게 하는가는 여러분의 손에 달렸다. 필자의 바램은 어떤 특정한 사람이 패키징하고 그 패키징 한 것을 여러 사람이 쓰는 것보다 여러 사람이 함께 만들어서 공유하는 것을 바란다. 더 많은 사람들이 패키징에 참여하고 앞으로 이 패키징 작업을 통해 데비안 공식 배포본에 프로그램이 들어가게 된다면 그보다 더 좋은 일이 어디 있을까 ?

이미 일본은 kon이 데비안 2.0 공식 배포본에 들어가게 되었다 우리도 뭔가 노력해야 하지 않을까 ?

데비안 패키지 관리자가 되기 위한 절차와 조건을 설명한 패키지는 developers-reference_2.0.deb 이다. 이 패키지를 참조하길 바란다.

총 3회에 걸친 데비안 기사가 이번호로 마무리 되게 되었다. 필자나름대로 쉽게 전달하려 노력했는데 미흡한 부분이 많았으리라 생각한다. 내년초에 Debian-KR프로젝트가 마무리되어 여러분 앞에 선을 보일 것이다 여러분도 Debian 의 패키지 관리자로 할동해봄이 어떨까 . 몇 가지 참고 될 만한 URL을 첨부한다. 여러분들에게 도움이 되었으면 좋겠다.

Resource

http://www.debian.org.international.html  현재 데비안의 국제화가 이루어지는 상황에 대해 알 수 있다.

http://www.denian.org/developers_corner.html -데비안 배포본 개발자를 위한 코너

ftp://ftp.debian.org - 데비안 공식 배포 사이트

ftp://doit.ajou.ac.kr/pub/debian-kr - Debian-KR 공식 배포 사이트

http://www.linux.or.jp JLUG  홈페이지

http://www.debian.linux.or.jp Debian-JP 홈페이지

 

Debian Gnu/Linux 1 소개와 dselect 사용법

Debian Gnu/Linux 2 중간수준의 패키지 관리 프로그램 dpkg-


 이글은 리눅스월드 '97년 12월호 기사입니다.