도구없이 패키징 하기
이전
다음

도구없이 패키징 하기

중요

요구사항: build-essential, automake, gnupg, lintian, fakeroot 그리고 pbuilder.

이 예제에서 우리는 GNU hello 프로그램을 예로 사용할 것 입니다. 여러분은 소스 tarball을 ftp.gnu.org 에서 내려 받을 수 있습니다. 이 예제의 용도를 위해, 우리는 ~/hello/ 디렉토리를 사용할 것 입니다.

mkdir ~/hello
cd ~/hello
wget http://ftp.gnu.org/gnu/hello/hello-2.1.1.tar.gz

우리는 또한 이미 우분투 저장소에 패키지된 것과 우리의 패키지를 비교할 것 입니다. 지금은, 그것을 ubuntu 디렉토리에 위치 시키고 나중에 볼 수 있도록 합니다. 그 소스 패키지를 가지려면, /etc/apt/sources.list 파일 내에 Main 저장소를 위한 "deb-src" 줄을 가지고 있는지를 확인 합니다. 그런 후에, 간단히 다음을 수행 합니다:

mkdir ubuntu
cd ubuntu
apt-get source hello
cd ..

참고

대부분의 apt-get 명령과는 다르게, 소스 패키지는 현재 디렉토리로 내려 받아지기 때문에, 여러분은 소스 패키지를 가지기 위해 루트 권한을 가질 필요가 없습니다. 실제로, 여러분은 오직 일반 사용자로써 apt-get source 를 사용하는 것이 권장 됩니다, 왜냐면 루트의 권한이 필요한 것 없이 소스 패키지 내의 파일을 편집할 수 있어야 하기 때문 입니다.

apt-get source 명령이 하는 것은 다음 입니다:

  1. 소스 패키지를 내려 받습니다. 소스 패키지는 보통 그 패키지를 기술하고 소스 패키지의 md5sum을 주는 .dsc 파일과, 저작자의 소스 코드를 가지는 .orig.tar.gz 파일, 그리고 패키징 정보와 함께 소스 코드에 적용된 패치를 가지는 .diff.gz 파일을 포함하고 있습니다.

  2. 현재 디렉토리로 .orig.tar.gz 파일을 untar 합니다.

  3. gnuzipped .diff.gz 파일은 압축 풀려진 소스 디렉토리에 적용 합니다.

만약 여러분이 소스 패키지를 (.dsc, .orig.tar.gz, and .diff.gz files) 수동으로 내려 받았다면, 다음과 같이 dpkg-source 를 사용하여 apt-get source 가 하는 같은 방법으로 패키지를 압축 풀 수 있습니다:

dpkg-source -x *.dsc

여러분이 해야할 첫 번째 일은 다음의 형식으로 원래 (때로는 "업스트림"으로 불리는) tarball의 복사본을 만드는 것 입니다: <packagename>_<version>.orig.tar.gz 이 단계는 두 가지 일을 합니다. 첫 번째, 이것은 소스 코드 두 본을 만듭니다. 만약 작업하는 복사본을 실수로 변경하거나 삭제하였다면, 여러분은 내려받은 것을 사용할 수 있습니다. 두 번째, 이것은 절대적으로 필요하지 않는 한 원래의 소스 tarball을 변경하는 것은 좋지 않은 패키징 작업으로 여겨 집니다. 사유는 “일반적인 실수” 를 보십시오.

cp hello-2.1.1.tar.gz hello_2.1.1.orig.tar.gz
tar -xzvf hello_2.1.1.orig.tar.gz

주의

패키지 이름(hello)와 버전(2.1.1) 사이에 있는 언더스코어 "_" 는 하이픈 "-"과 대조되고, 매우 중요 합니다. 하이픈 일때는 여러분의 소스 패키지는 데비안 패키지에 맞지 않게 잘못 만들어지게 됩니다.

우리는 이제 소스 파일을 포함하는 hello-2.1.1 디렉토리를 가졌습니다. 이제 우리는 패키지 정보를 저장하고, 프로그램 소스 파일에서 분리하여 패키징 파일을 허용하는 우리가 정의한 debian 디렉토리를 만들 필요가 있습니다.

mkdir hello-2.1.1/debian
cd hello-2.1.1/debian/

우리는 이제 우분투 소스 패키지를 위한 필수적인 파일들을 만들 필요가 있습니다: changelog, control, copyright, 그리고 rules . 이 파일들은 원래의 (업스트림) 소스 코드에서 바이너리 패키지 (.deb 파일) 을 만들기 위해 필요 합니다. 각각 하나씩 들여다 봅시다.

changelog

changelog 파일은, 그것의 이름이 뜻하는 대로, 각 버전에서 만들어진 변경들의 목록 입니다. 이것은 패키지 이름, 버전, 배포, 변경과 주어진 시간에 누가 변경을 하였는지의 특정 형식을 가지고 있습니다. 만약 여러분이 GPG 키를 가지고 있다면, changelog 에 사용하는 이름과 이메일 주소는 여러분의 키에 있는 것과 같은 것을 사용하는 것을 확신 하십시오. 다음은 changelog 의 양식 입니다:

package (version) distribution; urgency=urgency

  * change details
    more change details
  * even more change details

-- maintainer name <email address>[two spaces] date

이 형식은 (특히 날짜 형식) 중요 합니다. 날짜는 반드시 RFC822 형식이어야 하고, 그것은 822-date 에서 얻을 수 있습니다.

여기에 hello 프로그램을 위한 예제 changelog 파일이 있습니다:

hello (2.1.1-1) dapper; urgency=low

   * New upstream release with lots of bug fixes.

-- Captain Packager <packager@coolness.com> Wed, 5 Apr 2006 22:38:49 -0700

버전에 -1 이 덧붙여졌음을, 그리고 이것은 데비안 개정 번호라 불리고, 같은 소스 릴리스 버전 내에서 (예를 들어 버그를 고치기 위해) 새 업로드로 패키지가 업데이트 될 때 사용을 하는 것을 주의 하십시오.

참고

우분투 와 데비안은 같은 소스 버전의 패키지 충돌을 피하기 위하여 약간 다른 패키지 버전을 매기는 체계를 가지고 있습니다. 만약 데비안 패키지가 우분투 에서 변경 되었다면, 그것은 데비안 버전의 끝에 ubuntuX 를 덧붙여 가집니다. (X우분투 개정 번호 입니다.) 그러므로 만약 데비안 hello 패키지가 우분투 에 의해 변경 되었다면, 버전 스트링은 2.1.1-1ubuntu1 입니다. 만약 프로그램을 위한 패키지가 데비안에 존재하지 않는다면, 우분투 버전은 0 입니다. (, 2.1.1-0ubuntu1)

이제 우리가 얼마전에 내려받은 우분투 소스 패키지의 changelog 파일을 들여다 봅시다:

less ../../ubuntu/hello-2.1.1/debian/changelog

이 경우에 배포unstable (하나의 데비안 브랜치) 임을 주의 하십시오, 그 데비안 패키지가 우분투 에 의해 변경이 되지 않았기 때문에 그러 합니다. 배포 를 여러분의 타겟 배포 릴리스로 지정하는 것을 기억 하십시오.

이제 changelog 파일을 여러분이 아직 있어야 할 debian 디렉토리에 만듭니다.

control

control 파일은 패키지 관리 프로그램이 (apt-get, synaptic, 그리고 aptitude 와 같은) 사용할 정보, 빌드-타임 의존, 패키지 관리자 정보 그리고 훨씬 많은 것들을 가지고 있습니다.

우분투 hello 패키지를 위한, control 파일은 다음과 비슷합니다:

Source: hello
Section: devel
Priority: optional
Maintainer: Captain Packager <packager@coolness.com> 
Standards-Version: 3.6.1

Package: hello
Architecture: any
Depends: ${shlibs:Depends}
Description: The classic greeting, and a good example
 The GNU hello program produces a familiar, friendly greeting. It
 allows non-programmers 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 Project).

위의 정보를 사용하여 control 파일을 만듭니다. (Maintainer 필드에 여러분의 정보를 제공하는 것은 확신 하십시오.)

첫번째 문단은 소스 패키지에 대한 정보를 줍니다. 각각의 줄을 읽어보도록 하죠:

  • Source: 이것은 소스 패키지의 이름이고, 이 경우에는, hello 입니다.

  • Section: apt 저장소는 열람하기 쉽고 소프트웨어의 분류를 위하여 영역으로 나누어 집니다. 이 경우에는, hellodevel 영역에 속합니다.

  • Priority: 이것은 사용자에게 패키지의 중요도를 지정 합니다. 이것은 반드시 다음 중의 하나이어야만 합니다:

    • Required - 패키지가 시스템이 적절히 동작하기 위해 필수적일 때 입니다. 만약 이 패키지가 삭제되면, 여러분의 시스템은 회복할 수 없게 고장이 나는 것이기가 아주 쉽습니다.

    • Important - 시스템 사용을 위한 최소한의 패키지의 집합에 속할 때 입니다. 이 패키지를 삭제하는 것은 여러분의 시스템이 회복 불능한 고장을 만들지는 않지만, 일반적으로 어떤 리눅스 설치도 이것이 없으면 불완전하다고 여겨지는 중요한 도구 입니다. 주의: 이것은 Emacs 또는 심지어 X 윈도우 시스템 같은 것을 포함하지 않습니다.

    • Standard - 약간은 스스로 설명하고 있죠.

    • Optional - 실제로 이 분류는 요구되지 않는 패키지를 위하거나 대부분의 패키지들을 위해서 입니다. 그러나, 이 패키지들은 각기 다른 패키지들과 충돌이 없어야만 합니다.

    • Extra - 이 곳의 패키지는 위의 분류 중 하나에 있는 패키지와 충돌이 있을 수도 있습니다. 또한 이미 패키지의 목적을 알고 있는 사람들에게만 유용한 특정한 패키지를 위하여 사용 됩니다.

  • Extra 이메일 주소와 함께 패키지 관리자 이름을 적습니다.

  • Standards-Version: 패키지에 부착하는 Debian Policy 의 버전 입니다. (이 경우는, 3.6.1 버전 입니다.) 현재 버전을 찾는 쉬운 방법은 apt-cache show debian-policy | grep Version 입니다.

  • Build-Depends: 가장 중요한 필드의 하나이고 종종 버그의 원천이 됩니다. 이 줄은 소스 패키지로 부터 바이너리 패키지를 만들기 위해 설치가 필요한 바이너리 패키지의 (필요하다면 버전과 함께) 목록 입니다. build-essential 에 의해 요구되는 필수적인 패키지는 Build-Depends 줄에 포함될 필요가 없습니다. hello 프로그램의 경우는, 모든 필요한 패키지가 build-essential 의 부분 이므로 Build-Depends 줄은 필요가 없습니다. build-essential 패키지의 목록은 /usr/share/doc/build-essential/list 에서 찾을 수 있습니다.

두번째 문단은 소스로 부터 만들어질 바이너리 패키지를 위해서 입니다. 만약 소스 패키지로 부터 다수의 바이너리 패키지가 만들어지면, 각각의 것을 위한 영역이 반드시 있어야 합니다. 다시, 각각의 줄을 읽어 보겠습니다:

  • Package: 바이너리 패키지의 이름 입니다. 많은 경우의 단순한 프로그램은 (hello 과 같은), 소스와 바이너리 패키지의 이름이 동일 합니다.

  • Architecture: 바이너리 패키지가 만들어질 아키덱쳐 입니다. 예들 들어:

    • all - 소스가 아키텍쳐-의존이 아닌 경우 입니다. 파이썬과 다른 인터프리터 언어를 사용하는 프로그램들이 이 아키텍쳐 값을 사용 합니다. 결과의 바이너리 패키지는 _all.deb 로 끝나게 됩니다.

    • any - 소스가 아키텍쳐-의존 이고, 모든 지원되는 아키텍쳐에서 컴파일이 되어야 합니다. 각각의 아키텍쳐를 위한 .deb 파일이 있게 됩니다. (예를 들어 _i386.deb)

    • 아키텍쳐의 부분은 (i386, amd64, ppc, 기타) 소스가 아키텍쳐-의존 이고 우분투 에 의해 지원되는 모든 아키텍쳐를 위하여 동작하지 않음을 알려주기 위해 나열 됩니다.

  • Depends: 기능성을 위하여 바이너리 패키지가 의존하는 패키지의 목록 입니다. hello 을 위해, 우리는 ${shlibs:Depends} 를 보게 되고, 이것은 필요한 공유 라이브러리로 대체하게 되는 변수 입니다. 더 많은 정보는 dpkg-source man 페이지를 보십시오.

  • Recommends: 강력히 권장하는 패키지에 사용되고 보통은 그 패키지와 함께 설치가 됩니다. 몇 몇의 패키지 관리자 프로그램은, 잘 알려진 것으로 aptitude 는, 권장 패키지를 자동으로 설치 합니다.

  • Suggests: 이 패키지가 설치될 때 비슷한 또는 유용한 패키지를 위하여 사용 됩니다.

  • Conflicts: 이 패키지와 충돌이 일어나는 패키지를 위하여 사용 됩니다. 동시에 양쪽 모두를 설치할 수 없습니다. 하나가 설치되면, 다른 하나는 삭제 됩니다.

  • Description: 패키지 관리자에 의해 짧은 그리고 긴 설명 모두를 적는 항목으로 사용 됩니다. 형식은 다음과 같습니다:

    Description: <한 줄의 개요>
     <몇 줄에 걸친 확장된 설명>

    긴 설명 란의 각각의 줄의 시작에 하나의 공백이 있음을 주의 하십시오. 어떻게 좋은 설명을 만드는지에 대한 더 많은 설명은 http://people.debian.org/~walters/descriptions.html 에서 찾을 수 있습니다.

copyright

이 파일은 저작권 정보를 줍니다. 일반적으로, 저작권 정보는 프로그램의 소스 디렉토리에 있는 COPYING 파일에서 찾아 봅니다. 이 파일은 저작자와 패키지 관리자의 이름과 같은 정보, 어디서 소스가 왔는지를 알리는 URL, 연도와 저작권 소유자를 알리는 저작권 줄, 그리고 저작권 자체의 텍스트를 포함하여야만 합니다. 예제 양식은 다음과 같습니다:

This package was debianized by {Your Name} <your email address>
{Date}

It was downloaded from: {URL of webpage} 

Upstream Author(s): {Name(s) and email address(es) of author(s)}

Copyright:
	Copyright (C) {Year(s)} by {Author(s)} {Email address(es)}

License:

여러분이 상상할 수 있는 것처럼, hello 프로그램은 GPL 라이센스 하에 발표 되었습니다. 이 경우에는 우분투 패키지에서 copyright 파일을 단지 복사하는 것이 가장 쉽습니다:

cp ../../ubuntu/hello-2.1.1/debian/copyright .

여러분은 저작권이 GPL, LGPL, BSD, 또는 Artistic License 아니면 완전한 저작권을 반드시 포함시켜야 합니다. 앞에 언급된 저작권의 경우는 /usr/share/common-licenses/ 디렉토리에 있는 대응하는 파일을 참조할 수 있습니다.

우분투 패키지의 copyright 파일은 매뉴얼을 위한 라이센스 진술문도 포함하고 있음을 주의 하십시오. 이것은 하나의 진술문에 의해 소스 내의 모든 파일들을 보호하기 위하여 중요 합니다.

rules

rules 파일은 실행 가능한 Makefile 파일이고 소스 패키지에서 바이너리 패키지를 만들기 위한 규칙들을 가지고 있습니다. hello 를 위하여, 우분투 패키지에 있는 rules 파일을 사용하는 것이 좀 더 쉽습니다:

#!/usr/bin/make -f
# Sample debian/rules file - for GNU Hello.
# Copyright 1994,1995 by Ian Jackson.
# I hereby give you perpetual unlimited permission to copy,
# modify and relicense this file, provided that you do not remove
# my name from the file itself. (I assert my moral right of
# paternity under the Copyright, Designs and Patents Act 1988.)
# This file may have to be extensively modified

package = hello
docdir = debian/tmp/usr/share/doc/$(package)

CC = gcc
CFLAGS = -g -Wall
INSTALL_PROGRAM = install

ifeq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
  CFLAGS += -O2
endif
ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
  INSTALL_PROGRAM += -s
endif

build:
        $(checkdir)
        ./configure --prefix=/usr
        $(MAKE) CC="$(CC)" CFLAGS="$(CFLAGS)"
        touch build

clean:
        $(checkdir)
        rm -f build
        -$(MAKE) -i distclean
        rm -rf *~ debian/tmp debian/*~ debian/files* debian/substvars

binary-indep: checkroot build
        $(checkdir)
# There are no architecture-independent files to be uploaded
# 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 $(docdir)
        install -m 755 debian/postinst debian/prerm debian/tmp/DEBIAN
        $(MAKE) INSTALL_PROGRAM="$(INSTALL_PROGRAM)" \
        prefix=$$(pwd)/debian/tmp/usr install
        cd debian/tmp && mv usr/info usr/man usr/share
        cp -a NEWS debian/copyright $(docdir)
        cp -a debian/changelog $(docdir)/changelog.Debian
        cp -a ChangeLog $(docdir)/changelog
        cd $(docdir) && gzip -9 changelog changelog.Debian
        gzip -r9 debian/tmp/usr/share/man
        gzip -9 debian/tmp/usr/share/info/*
        dpkg-shlibdeps debian/tmp/usr/bin/hello
        dpkg-gencontrol -isp
        chown -R root:root debian/tmp
        chmod -R u+w,go=rX debian/tmp
        dpkg --build debian/tmp ..

define checkdir
        test -f src/$(package).c -a -f debian/rules
endef

binary: binary-indep binary-arch

checkroot:
        $(checkdir)
        test $$(id -u) = 0

.PHONY: binary binary-arch binary-indep clean checkroot

이 파일을 더 자세하게 읽어 보도록 합시다. 첫 번째 부분에 여러분이 보는 것은 몇 가지 변수에 대한 정의 입니다:

package = hello
docdir = debian/tmp/usr/share/doc/$(package)

CC = gcc
CFLAGS = -g -Wall
INSTALL_PROGRAM = install

ifeq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
  CFLAGS += -O2
endif
ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
  INSTALL_PROGRAM += -s
endif

이 영역은 컴파일러를 위한 CFLAGS 를 지정하고 또한 디버깅을 위한 nooptnostrip DEB_BUILD_OPTIONS 을 관리 합니다.

다음은 build 규칙 입니다:

build:
	$(checkdir)
	./configure --prefix=/usr
	$(MAKE) CC="$(CC)" CFLAGS="$(CFLAGS)"
	touch build

이 규칙은 적절한 접두 명칭과 함께 ./configure 을 실행하고, make 를 실행하며, 그리고 오류가 있을 수 있는 여러 번의 컴파일을 막기 위해 빌드의 시각을 가지는 build 파일을 만듭니다.

다음 규칙은 clean 입니다, 이것은 make -i distclean 을 실행하고 패키지가 빌드되는 동안에 만들어진 파일들을 삭제 합니다.

clean:
	$(checkdir)
	rm -f build
	-$(MAKE) -i distclean
	rm -rf *~ debian/tmp debian/*~ debian/files* debian/substvars

다음으로 우리는 빈 binary-indep 규칙을 봅니다, 왜냐면 이 패키지에는 생성된 아키텍쳐-독립 파일이 없기 때문 입니다.

그러나, 많은 아키텍쳐-의존 파일이 있고, 그래서 binary-arch 이 사용 됩니다:

binary-arch: checkroot build
		$(checkdir)
		rm -rf debian/tmp
		install -d debian/tmp/DEBIAN $(docdir)
		install -m 755 debian/postinst debian/prerm debian/tmp/DEBIAN
		$(MAKE) INSTALL_PROGRAM="$(INSTALL_PROGRAM)" \
		prefix=$$(pwd)/debian/tmp/usr install
		cd debian/tmp  mv usr/info usr/man usr/share
		cp -a NEWS debian/copyright $(docdir)
		cp -a debian/changelog $(docdir)/changelog.Debian
		cp -a ChangeLog $(docdir)/changelog
		cd $(docdir)  gzip -9 changelog changelog.Debian
		gzip -r9 debian/tmp/usr/share/man
		gzip -9 debian/tmp/usr/share/info/*
		dpkg-shlibdeps debian/tmp/usr/bin/hello
		dpkg-gencontrol -isp
		chown -R root:root debian/tmp
		chmod -R u+w,go=rX debian/tmp
		dpkg --build debian/tmp ..

첫 번째, 이 규칙은 패키지가 root로써 만들어졌는지 확신하기 위하여 checkroot 를 호출하고 소스를 컴파일 하기 위하여 build 규칙을 호출 하는 것을 주목 하십시오. 그 다음에, debian/tmp/DEBIANdebian/tmp/usr/share/doc/hello 파일이 만들어지고, postinstprerm> 스크립트가 debian/tmp/DEBIAN 에 설치 됩니다. 그런 후 make install 이 prefix와 함께 실행되어 debian/tmp/usr 로 설치 됩니다. 이어서 문서 파일들이 (NEWS, ChangeLog, 와 그 debian changelog) 압축되고 설치 됩니다. dpkg-shlibdepshello 실행 파일의 공유 라이브러리 의존성을 찾기 위하여 수행되고, 그것은 control 내의 ${shlibs:Depends} 변수를 위한 debian/substvars 파일 내의 목록을 저장 합니다. 그 다음에, dpkg-gencontrol 이 바이너리 패키지를 위한 control 파일을 만들기 위하여 실행이 되고, dpkg-shlibdeps 에 의해 생성된 대체를 만듭니다. 마지막으로, debian/tmp 의 접근 권한이 지정된 후, dpkg --build 가 바이너리 .deb 패키지를 만들고 상위 디렉토리에 그것을 옮겨놓기 위하여 실행이 됩니다.

postinst and prerm

postinstprerm 파일은 패키지 관리자의 스크립트의 예제 입니다. 그것들은 쉘 스크립트이고 패키지의 설치 후에 그리고 삭제 전에 실행 됩니다. 우분투 hello 패키지의 경우에는, info 파일을 설치 (그리고 삭제) 하기 위하여 사용 됩니다. 그것들을 현재의 debian 디렉토리에 복사 하십시오.

cp ../../ubuntu/hello-2.1.1/debian/postinst .
cp ../../ubuntu/hello-2.1.1/debian/prerm .

소스 패키지 만들기

이제 우리는 자세하게 hello 를 위한 debian 디렉토리 내의 파일들을 읽어 보았고, 소스(그리고 바이너리) 패키지를 만들 수 있습니다. 우선 압축이 풀려진 소스의 루트로 이동해 보도록 하겠습니다:

cd ..

이제 우리는 dpkg-buildpackage 를 사용하여 소스 패키지를 만듭니다:

dpkg-buildpackage -S -rfakeroot

그 -S 플랙은 dpkg-buildpackage 에게 소스 패키지를 만들라는 것을 이야기 하고, -r 플랙은 패키지를 만들 때 우리가 가짜 root 권한을 가지는 것을 허용하기 위하여 fakeroot 를 사용한다는 것을 알립니다. dpkg-buildpackage.orig.tar.gz 파일을 가지고 .diff.gz (저작자에게서 온 원래의 tarball 과 우리가 만든 debian/ 디렉토리와 그 안의 내용물 간의 차이) 와 소스 패키지를 위한 설명과 md5sums를 가지는 .dsc 파일을 생성 합니다. .dsc*_source.changes (소스 패키지의 업로드를 위해 사용되는) 파일은 여러분의 GPG key를 사용하여 서명 됩니다. 만약 여러분이 GPG key를 가지고 있지 않다면, dpkg-buildpackage 의 수행을 위하여 -us -uc 플랙을 더 하십시오. 여러분의 패키지는 만들어지지만 서명을 하기 전까지는 업로드 될 수 없습니다.

소스 패키지에 더하여, 우리는 또한 pbuilder 를 가지고 바이너리 패키지를 만들 수 있습니다:

sudo pbuilder build ../*.dsc

바이너리 패키지를 만들기 위해 pbuilder 를 사용하는 것은 매우 중요 합니다. 이것은 pbuilder 는 오직 최소한의 환경을 제공하므로, 모든 빌드-타임 의존성은 control 파일에 의해서 결정되기 때문에 빌드 의존성을 정확히 하는 것을 확신하게 합니다.

우리는 lintian 을 가지고 소스 패키지의 일반적인 실수를 점검할 수 있습니다:

cd ..
lintian -i *.dsc
이전
다음
처음으로