프로그램의 주 디렉토리(`gentoo-0.9.12') 아래에 `debian'이라는 새로운 서브 디렉토리가 만들어져 있다. 이 디렉토리 안에는 여러개의 파일들이 들어 있다. 이제 패키지를 제대로 조정하려면 차례로 이 파일들을 편집한다. 이 중에 가장 중요한 파일은 `control', `changelog', `copyright', 그리고 `rules'이다. 이 파일들은 모든 패키지에 필요하다.
이 파일 안에는 dpkg나 dselect에서 패키지를 관리할 때 필요한 여러가지 값들이 들어 있다. 다음은 dh_make가 자동으로 만들어 주는 control 파일이다.
1 Source: gentoo
2 Section: unknown
3 Priority: optional
4 Maintainer: Josip Rodin <jrodin@jagor.srce.hr>
5 Standards-Version: 2.4.0.0
6
7 Package: gentoo
8 Architecture: any
9 Depends: ${shlibs:Depends}
10 Description: Missing
11 <긴 설명을 쓴다. 줄 앞에 공백으로 들여 쓴다>
(줄 번호를 앞에 붙였다.)
1-5줄은 소스 패키지를 위한 컨트롤 정보이다. 첫번째 줄은 소스 패키지의 이름이다.
두번째 줄은 이 패키지가 들어가야 할 배포본의 섹션이다. 이미 알고 있을지도 모르지만, 데비안은 여러개의 섹션으로 나누어져 있다: main (자유 소프트웨어), non-free (자유 소프트웨어가 아닌 것들) 그리고 contrib (자유롭지 않은 소프트웨어에 의존하는 자유 소프트웨어). 이 아래에 이 패키지가 어떤 종류인가를 간단히 설명하는 서브섹션이 있다. 관리 전용 프로그램은 `admin', 기본적인 도구는 `base', 프로그래머의 도구는 `devel', 문서는 `doc', 라이브러리는 `libs', 이메일 읽기 프로그램 및 데몬은 `mail', 네트워크 프로그램과 데몬은 `net', X11에 관계된 프로그램은 `x11', 그 외에도 많이 있다.
그러면 unknown을 x11로 바꾸면 된다.
세번째 줄은 사용자가 이 패키지를 설치하는 일이 얼마나 중요한지를 나타낸다. Section과 Priority는 패키지를 정렬하고, 기본 패키지를 선택하는 용도로 dselect에서만 사용된다. 또 Section과 Priority는 FTP 관리자에 의해 다시 정의될 수 있다 (대부분의 경우 그렇게 된다). 이 필드의 값을 결정하는 문제는 데비안 정책 매뉴얼에 쓰여 있다.
gentoo의 우선순위는 보통이므로, 그대로 optional로 남겨둔다.
네번째 줄은 관리자의 이름과 이메일 주소이다.
다섯번째 줄은 이 패키지가 따르는 데비안 정책 표준(Debian policy standard)의 버전이다 (debian-policy 패키지의 앞의 두개의 숫자가 데비안 정책 표준의 버전이다).
패키지를 빌드할 때 표준이 아닌 도구가 필요할 때, `Build-Depends' 줄을 추가하고, 거기에 필요한 패키지를 쓴다. 이에 대한 자세한 정보는, Packaging Manual(섹션 8.7)과 `build-essential' 패키지의 문서에 들어 있다.
일곱번째 줄은 이진 패키지의 버전이다.
여덟번째 줄은 이 이진 패키지가 컴파일될 수 있는 CPU 아키텍처를 쓴다. 우리는 이
필드를 any라고 남겨놓고 dpkg-gencontrol(1) 프로그램이 알아서
컴파일된 기계에 맞는 값을 집어 넣도록 한다(패키지 포팅에 대한 설명은
Developer's Reference 참고). 만약 여러분의 패키지가 아키텍처에 무관하다면
(예를 들어, 셸 스크립트나 펄 스크립트, 문서일 경우), 이 부분을
"all"로 바꾸고, 뒷 부분의 `rules'
파일, 4.4에서 "binary-arch" 대신에 "binary-indep" 룰을
이용하는 방법을 살펴본다.
아홉번째 줄은 데비안 패키징 시스템의 가장 강력한 기능들중 하나이다. 패키지는 여러가지 방법으로 또 다른 패키지들과 관계를 맺을 수 있다. Depends 말고, 패키지간의 관계를 나타내는 필드로는 Recommends:, Suggests:, Pre-Depends:, Conflicts:, Provides:, 그리고 Replaces:가 있다.
dpkg, dselect, APT(그리고 APT 프론트엔드)와 같은 패키지 관리 도구는 보통 이
패키지 관계에 따라 동일하게 동작한다. 그렇지 않은 경우가 있는데, 다음에
설명한다. (dpkg(8), dselect(8), +
apt(8), console-apt(8), + gnome-apt(8)
참고)
각각의 의미는 다음과 같다:
의존하는(depends) 패키지가 설치되어 있지 않으면 프로그램을 설치하지 않는다. 어떤 패키지가 없을 경우 이 프로그램이 절대 동작하지 않을 때만 (혹은 심각한 문제를 발생할 경우) Depends를 사용한다.
dselect는 추천하는(recommends) 패키지가 설치되어 있지 않으면 이 패키지를 설치하지 않는다. 하지만 dpkg와 APT는 추천하는 패키지가 설치되어 있지 않은 경우에도 설치한다. 여러분의 프로그램이 꼭 필요로 하지는 않지만, 대부분의 경우에 필요한 패키지인 경우에만 Recommends를 사용한다.
사용자가 이 프로그램을 설치할 때, dselect는 제안하는(suggests) 패키지를 설치하도록 안내한다. Dpkg와 APT는 아무 신경쓰지 않고 설치한다. 꼭 필요한 패키지는 아니지만, 여러분의 프로그램과 함께 멋지게 동작하는 패키지에 대해서 Suggests를 사용한다.
Depends보다 더 강력하다. 미리 의존하는(pre-depends) 패키지가 설치되고, 또 제대로 설정되었을 경우에만 이 패키지를 설치할 수 있다. Pre-Depends는 삼가해서 사용하고, 꼭 debian-devel 메일링 리스트에서 토의한 다음에 사용한다. 즉: 아예 사용하지 않는다. :-)
충돌하는(conflicts) 패키지가 삭제되지 않는 한 패키지는 설치되지 않는다. 여러분의 프로그램이 어떤 패키지가 존재할 때 동작하지 않을 경우 (혹은 심각한 문제를 발생시키는 경우) Conflicts를 사용한다.
여러개 중에 하나를 선택할 수 있는 패키지를 위해 가상 패키지(virtual package)가 정의되어 있다. 가상 패키지의 리스트는 /usr/share/doc/debian-policy/virtual-package-names-list.text.gz에서 구할 수 있다. Provides는 여러분의 프로그램이 가상 패키지를 제공(provides)하는 경우에 사용한다.
당신의 프로그램이 다른 패키지의 파일들을 대체(replaces)하는 경우, 혹은 그 패키지 전체를 대체(replaces)하는 경우(이 경우에는 COnflicts:와 함께 사용한다)에 사용한다. 여기서 지정된 패키지의 파일들은 여러분의 패키지를 설치하기 전에 삭제된다.
이 필드들은 모두 통일된 문법이 있다. 이 필드에는 패키지 이름들을 쉼표로 구분해서 나열해 놓는다. 패키지 이름은 세로줄 표시 | (파이프 표시) 를 이용해서 여러개 중에 하나를 선택하는 식으로 만들 수도 있다. 각 패키지의 특정 버전을 지정할 수도 있다. 각 패키지 이름 다음에 괄호 안에 버전과 함께 그 앞에 버전번호의 관계를 나타내는 다음 관계 기호를 쓴다. 사용할 수 있는 관계는 <<, <=, =, >= 그리고 >>이다. 각각은 앞 버전, 이전 버전, 정확히 같은 버전, 이후 버전, 그리고 뒤 버전을 나타낸다.
마지막으로 알려줄 기능은 $(shlibs:Depends)이다. 이 부분은
dh_shlibdeps(1)와 dh_gencontrol(1)에 의해 (나중에
설명) 자동으로 libc6나 xlib6g같은 여러분의 프로그램이 사용하는 동적
라이브러리의 이름으로 바뀐다. 즉, 각 라이브러리를 직접 지정할 필요가 없다.
때문에, 아홉번째 줄은 그대로 남겨두면 된다.
열번째 줄은 제안할 패키지를 나열하는 곳이다. 여기에는 `file'밖에 없다. gentoo는 file 프로그램/패키지의 기능들을 이용한다.
열한번째 줄은 짤막한 설명이다. 대부분의 사람들은 80 컬럼 화면을 사용하므로 이 부분은 60자 이상되지 않도록 않다. 나는 이 부분을 "A fully GUI configurable GTK+ file manager"라고 바꿔 놓을 것이다.
열두번째 줄은 긴 설명이 들어간다. 이 부분은 패키지에 대해 좀 더 자세히 설명하는 한개의 문단이다. 각 줄의 첫번째 열은 공백이어야 한다. 절대로 빈 줄이 들어가서는 안 된다. 빈 줄이 들어가야 할 곳에서는 대신에 .을 쓴다. 또, 이렇게 긴 설명을 끝낸 다음에는 빈 줄을 두개 이상 넣지 않는다.
다음은 수정된 control 파일이다:
1 Source: gentoo
2 Section: x11
3 Priority: optional
4 Maintainer: Josip Rodin <jrodin@jagor.srce.hr>
5 Standards-Version: 3.0.1
6
7 Package: gentoo
8 Architecture: any
9 Depends: ${shlibs:Depends}
10 Suggests: file
11 Description: A fully GUI configurable GTK+ file manager
12 gentoo is a file manager for Linux written from scratch in pure C. It
13 uses the GTK+ toolkit for all of its interface needs. gentoo provides
14 100% GUI configurability; no need to edit config files by hand and re-
15 start the program. gentoo supports identifying the type of various
16 files (using extension, regular expressions, or the 'file' command),
17 and can display files of different types with different colors and icons.
18 .
19 gentoo borrows some of its look and feel from the classic Amiga file
이 파일에는 해당 패키지의 상위 정보, 저작권과 라이센스 정보가 들어 있다. 이 형식은 데비안 정책에서 정의되지 않았지만, 그 내용은 지정되어 있다 (섹션 6.5). dh_make가 기본적으로 만드는 파일이 있는데, 다음과 같다:
1 This package was debianized by Josip Rodin <jrodin@jagor.srce.hr> on
2 Wed, 11 Nov 1998 21:02:14 +0100.
3
4 It was downloaded from <fill in ftp site>
5
6 Upstream Author(s): <put author(s) name and email here>
7
8 Copyright:
9
10 <Must follow here>
(줄 번호를 앞에 붙였다)
이 파일에 써 넣어야 할 매우 중요한 것은 첫째로 이 패키지를 가져온 위치이고, 또 하나는 실제 저작권 명시와 라이센스이다. GNU GPL 혹은 LGPL, BSD, Artistic 라이센스와 같은 유명한 자유 소프트웨어 라이센스가 아니라면, 완전한 라이센스를 포함해야 한다. 이런 유명한 라이센스의 경우에는 모든 데비안 시스템에 있는 /usr/share/common-licenses/ 디렉토리 밑의 해당 파일을 참고하면 된다. Gentoo의 라이센스는 GNU General Public License이므로 copyright 파일을 다음과 같이 바꿀 것이다:
1 This package was debianized by Josip Rodin <jrodin@jagor.srce.hr> on
2 Wed, 11 Nov 1998 21:02:14 +0100.
3
4 It was downloaded from ftp://ftp.obsession.se/gentoo/
5
6 Upstream author: Emil Brink <emil@obsession.se>
7
8 This software is copyright (c) 1998-99 by Emil Brink, Obsession
9 Development.
10
11 You are free to distribute this software under the terms of
12 the GNU General Public License.
12
13 On Debian systems, the complete text of the GNU General Public
14 License can be found in /usr/share/common-licenses/GPL file.
이 파일은 꼭 필요하다. 이 파일은 Packaging Manual의 3.2.3절에서 설명한 고유의 형식으로 쓰여진다. 이 형식은 dpkg에 의해 사용되고 그 밖의 프로그램들이 버전(version), 개정(revision), 배포판 및 이 패키지의 긴급성(urgency)을 알아 내는데 사용한다.
초보자를 위해서도 이 파일은 중요하다. 수정한 모든 사실에 대해 문서화하는 것이 좋다. 여러분의 패키지를 내려받게 될 사람들이 이 파일을 통해 패키지에 해결되지 않은 문제가 있는지 즉각 알아 볼 수 있다. 이 파일은 바이너리 패키지에서 /usr/share/doc/gentoo/changelog.Debian.gz 파일로 저장된다.
다음은 dh_make가 만들어 주는 기본 changelog 파일이다:
1 gentoo (0.9.12-1) unstable; urgency=low
2
3 * Initial Release.
4
5 -- Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 21:02:14 +0100
6
7 Local variables:
8 mode: debian-changelog
9 End:
(줄 번호를 앞에 추가했다.)
첫 줄은 패키지 이름, 버전, 배포판, 그리고 긴급성이다. 이름은 소스 패키지의 이름과 같아야 한다. 배포판은 unstable이나 experimental이 되어야 하고, 긴급성은 `low'보다 높은 걸로 바꾸지 않도록 한다. :-)
3-5 줄은 기록하는 부분으로, 여기에 이 패키지 개정판에 바뀐 점을 쓴다. (상위
소스코드의 변화를 쓰지 않는다 - 이 이런 목적의 파일은 상위 개발자가 만들고
/usr/doc/gentoo/changelog.gz 파일로 설치된다.) 맨 위에 별표(`*')로 시작하는 줄
앞에는 빈 줄이 들어가야 한다. 이 작업은 dch(1),
emacs(1) (7-10번째 줄은 Emacs 편집기를 위한 정보이다), 혹은 이런
기능을 가진 문서 편집기를 이용해서 쉽게 할 수 있다. 이제 여러분은 다음과 같이
해서 이 파일 편집을 마치면 된다.
1 gentoo (0.9.12-1) unstable; urgency=low
2
3 * Initial Release.
4 * This is my first Debian package.
5 * Adjusted the Makefile to fix $DESTDIR problems.
6
7 -- Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 21:02:14 +0100
8
9 Local variables:
10 mode: debian-changelog
11 End:
(줄번호를 앞에 붙였다.)
새로운 버전을 내놓을 때, 버전 번호를 증가시켜야 한다. 이 작업은 `dch -i` 혹은 직접 <version>-<revision>'를 실행해서 하고, 그 다음에 좋아하는 편집기를 이용해서 주석문을 쓴다. 팁: 필요한 날짜 형식을 쉽게 얻는 방법은? `822-date' 명령, 혹은 `date -R'을 사용한다.
새로운 버전 정보는 changelog 파일의 맨 위에 추가된다. 다음은 changelog의 미래 모습이다:
1 gentoo (0.9.12-2) unstable; urgency=low
2
3 * Fixed a glitch in the menu file.
4
5 -- Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 22:15:39 +0100
6
7 gentoo (0.9.12-1) unstable; urgency=low
8
9 * Initial Release.
10 * This is my first Debian package.
11 * Adjusted the Makefile to fix $DESTDIR problems.
12
13 -- Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 21:02:14 +0100
14
15 Local variables:
16 mode: debian-changelog
17 End:
(줄번호를 앞에 추가했다.)
새로운 패키지 버전/개정판에 관해서는 뒤의 패키지 갱신, 6.4에서 보다 자세하게 읽을 수 있다.
이제 dpkg-buildpackage(1)가 실제로 패키지를 만들 때 사용할
규칙(rules)을 살펴볼 때다. 사실 이 파일은 `make -f'로 실행되는 또 다른
메이크파일이지만, 상위 소스에 들어 있는 메이크파일과는 다른 파일이다.
`rules' 파일은, 다른 메이크파일과 마찬가지로, 소스를 빌드하는 방법이 쓰여진 여러개의 룰(rule)로 구성되어 있다. 각 룰은 타겟 파일이름 혹은 수행할 동작의 이름(`build:'나 `install:' 따위)가 들어 있다. 실행하고 싶은 룰이 있으면 명령행 인자로 타겟을 넘겨줘야 한다 (예를 들어, `./debian/rules build'나 `./debain/rules install'). 타겟 이름 다음에, 디펜던시(dependency)를 쓴다. 디펜던시는 그 타겟이 의존하는 프로그램이나 파일이다. 그 다음에는 여러개의 명령어가 올 수 있고 (<tab>로 시작한다는 점에 주의!), 빈 줄이 발견되면 끝난다. 그 다음에 또 다른 룰이 시작된다. 빈 줄이 여러 개 나타나는 경우나, 해쉬(`#')로 시작하는 주석문은 무시된다.
지금쯤 혼란스러울 것이지만, dh_make가 기본적으로 만들어 주는 `rules' 파일을 들여다 보면 모든 것이 명확해 질 것이다. 더 자세한 사항은 info의 `make' 항목을 읽어본다.
dh_make가 만드는 rules 파일에서 중요한 점은, 이 파일은 단지 하나의 예일 뿐이라는 점이다. 간단한 패키지에서는 이 파일이 그대로 동작하겠지만 좀 더 복잡한 경우에는 그렇지 않다. 필요에 따라서 이 파일에 무언가를 추가하거나 지워야 한다. 바꾸지 말아야 할 것은 각 룰의 이름으로, 이 이름들은 Packaging Manual에 설명된 각종 빌드도구에서 이용한다.
1 #!/usr/bin/make -f
2 # Made with the aid of dh_make, by Craig Small
3 # Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess.
4 # Some lines taken from debmake, by Christoph Lameter.
5
6 # Uncomment this to turn on verbose mode.
7 #export DH_VERBOSE=1
8
9 # This is the debhelper compatability version to use.
10 export DH_COMPAT=1
11
12 build: build-stamp
13 build-stamp:
14 dh_testdir
15
16 # Add here commands to compile the package.
17 $(MAKE)
18
19 touch build-stamp
20
21 clean:
22 dh_testdir
23 dh_testroot
24 rm -f build-stamp
25
26 # Add here commands to clean up after the build process.
27 -$(MAKE) clean
28
29 dh_clean
30
31 install: build-stamp
32 dh_testdir
33 dh_testroot
34 dh_clean -k
35 dh_installdirs
36
37 # Add here commands to install the package into debian/tmp.
38 $(MAKE) install DESTDIR=`pwd`/debian/tmp
39
40 # Build architecture-independent files here.
41 binary-indep: build install
42 # We have nothing to do by default.
43
44 # Build architecture-dependent files here.
45 binary-arch: build install
46 # dh_testversion
47 dh_testdir
48 dh_testroot
49 # dh_installdebconf
50 dh_installdocs
51 dh_installexamples
52 dh_installmenu
53 # dh_installemacsen
54 # dh_installpam
55 # dh_installinit
56 dh_installcron
57 dh_installmanpages
58 dh_installinfo
59 # dh_undocumented
60 dh_installchangelogs
61 dh_link
62 dh_strip
63 dh_compress
64 dh_fixperms
65 # You may want to make some executables suid here.
66 dh_suidregister
67 # dh_makeshlibs
68 dh_installdeb
69 # dh_perl
70 dh_shlibdeps
71 dh_gencontrol
72 dh_md5sums
73 dh_builddeb
74
75 binary: binary-indep binary-arch
76 .PHONY: build clean binary-indep binary-arch binary install
(줄 번호를 앞에 붙였다.)
아마 셸 스크립트나 펄 스크립트를 통해 첫번째 줄과 같은 줄에 익숙해 있을 것이다. 그 줄은 해당 파일이 /usr/bin/make를 통해 실행된다는 사실을 OS에 알려 준다.
12번째 줄에서 19번째 줄은 `build' 룰(및 부수적인 build-stamp룰)로, 이 룰에서는 프로그램을 컴파일하는 프로그램을 실행시킨다.
21-29 줄에 쓰인 `clean' 룰은 필요없는 바이너리나 패키지 빌드 과정에서 자동으로 생성된 파일들을 지운다. 이 룰은 언제나 실행 가능해야 한다 (소스 트리가 이미 clean된 상태에서도!). 그러므로 강제 옵션을 (rm의 경우에는 `-f' 옵션) 이용하거나, 리턴 값을 무시한다 (명령 앞에 `-'를 붙인다).
`install' 룰의 인스톨 과정은 31번째 줄에서 시작한다. 기본적으로 프로그램 자체 Makefile의 `install' 룰을 실행하지만, `pwd`/debian/tmp 디렉토리에 추가한다 - gentoo의 Makefile에서 $(DESTDIR)를 설치 디렉토리로 지정한 이유가 바로 이것이다.
주석문이 나타내듯, 41번째 줄의 `binary-indep' 룰은 아키텍처와 무관한 패키지들을 만드는 데 사용된다. 하지만, 우리는 이렇게 빌드할 게 전혀 없기 때문에, 아무것도 쓸 필요가 없다. 여러분의 패키지가 `Architecture all'일 경우에는 이 룰에서 해당 패키지를 빌드하는 명령어를 쓰고, 대신에 다음 룰(`binary-arch')를 비워 놓아야 한다.
다음 45-73 줄의 `binary-arch' 룰에서는 debhelper 패키지에 있는 여러가지 작은 프로그램들을 실행해서 패키지를 데비안 정책에 맞도록 만든다.
이 프로그램들은 dh_로 시작하고, 그 뒤의 이름을 통해 이 작은 프로그램들이 실제로 무슨 일을 하는지 알아 챌 수 있을 것이다. 하지만 추가로 설명을 하면:
dh_testdir(1)는 올바른 디렉토리(소스 디렉토리 맨 위)에서 빌드하는
지 확인한다.
dh_testroot(1)는 root 권한이 있는지 검사한다. root 권한은
binary*, clean 타겟에서 필요하다.
dh_installmanpages(1)는 소스 트리에서 찾을 수 있는 모든 맨
페이지를 설치 위치로 복사한다. (조심, 맨페이지가 아닌 것도 복사할 수 있음.)
dh_strip(1)은 실행 파일과 라이브러리에서 디버깅 헤더를 제거해서
크기를 작게 만든다.
dh_compress(1)는 4 킬로바이트보다 큰 맨 페이지와 문서를 gzip으로
압축한다.
dh_installdeb(1)은 패키지와 관련된 파일들을 debian/tmp 디렉토리로
복사한다.
dh_shlibdeps(1)는 라이브러리와 실행 파일의 동적 라이브러리에 대한
의존성을 검사한다.
dh_gencontrol(1)은 control 파일에 내용을 추가하고 control 파일을
설치한다.
dh_md5sums(1)는 패키지 내의 모든 파일에 대하여 MD5 checksum을
만든다.
dh_* 스크립트가 무엇을 하는지, 어떤 옵션이 있는지에 대한 완전한 정보를 알고 싶으면 각각의 맨 페이지를 읽어 보면 된다. 위에 언급되지 않은 많은 dh_* 스크립트가 있고, 어떤 경우에는 그 스크립트가 필요할 수도 있다. 그 스크립트가 필요한 경우 debhelper 문서를 읽어보기 바란다.
binary-arch 부분은 필요하지 않은 기능을 주석처리하는 부분이다. gentoo의 경우 testversion, emacsen, pam, init, cron, manpages, info, undocumented, suidregister, makeshlib, 그리고 perl을 주석 처리했다. gentoo는 이 스크립트가 필요 없다. 또 60번째 줄에 `FIXES'를 추가할 것이다. `FIXES'는 상위 changelog 파일이다.
마지막 두 줄은 (설명되지 않은 줄도 마찬가지로), 패키징 매뉴얼에서 읽을 수 있는 바에 따르면 어느 정도 필요한 부분이다. 지금으로써는 특별히 알아야 할 만큼 중요하지 않다.
jrodin@jagor.srce.hrcwryu@debian.org/