章 1. 從一條正確的路開始

# 章 1. 從一條正確的路開始

本教程文件已被重寫為另外的 Debian 維護者指導 文件，其中包含了更新的內容與更多實際例子。請使用新的教程作為主要的教程文件。

這篇文檔試圖爲普通 Debian 用戶，和希望對 Debian 軟件包有所瞭解的開發人員講述如何製作 Debian 軟件包。在這裏，我們儘可能使用通俗的語言，並輔以大量實例來直觀地展示每一個細節。正如一句古羅馬諺語說得好：一例勝千言！

該文件在 Debian `Buster` 釋出時仍然可用，因為它已提供了許多語言的翻譯版本。該文件會在之後的 Debian 版本中被移除，因為其內容正在逐漸過時。[1]

Debian 的軟件包系統是使它躋身頂級發行版行列的重要原因之一。儘管已經有相當數量的軟件被打包成 Debian 的格式，但有時還是需要安裝一些不是這一格式的軟件。可能你正爲如何製作自己的軟件包而感到迷惑，也可能正認爲這麼做很難。如果你是一個剛剛接觸 Debian 的初學者，那麼是的，它的確很難；不過假如你真的只是一個初入此門的新手，現在大概也不會來讀這篇文檔了。:-) 你的確需要對 Unix 編程有所瞭解，但顯然沒必要是這方面的天才。[2]

對於 Debian 軟件包維護人員來說，有一件事是非常明確的：創建並維護一個 Debian 軟件包需要花費很多精力，所需的時間很可能遠不只是幾個小時。維護人員需要有良好的技術基礎，同時也需要十分勤奮，這樣才能保證我們的系統正常運行而不出現問題。

如果你在軟體包製作方面需要他人幫助，請閱讀 節 1.4, “到何處尋求幫助”。

本文的最新版隨時都可以在 http://www.debian.org/doc/maint-guide/ 上和 `maint-guide` 軟件包裏找到。文檔的簡體中文翻譯可以在 `maint-guide-zh-cn` 軟件包裏找到。還有一點需要注意的是，這篇文檔的內容相對於當前的開發情況可能會有略微的延遲。

由於這篇文檔是一份手把手的教程，所以在一些重要的話題上會對每個步驟都做詳細的解釋。因而你可能覺得它們之中有一些與你的想法毫不相干。請準備好足夠的耐心來學習。同時我也有意地省略了某些不必要的細節，以使這篇文檔儘可能保持簡潔。

## 1.1. Debian 的社會驅動力

以下是一些有關 Debian 的社會動力學報告，希望它們有助於你掌握與 Debian 項目進行互動的方法。

- 我們都是志願者。

  - 任何人都不能把事情強加給他人。

  - 你應該主動地做自己的事情。

- 友好合作是我們前行的動力。

  - 你的貢獻不應致使他人過勞。

  - 只有當別人欣賞你的貢獻時，它才真正有價值。

- Debian 不是一所學校，沒有老師會自動地注意你。

  - 你需要有自學大量知識的能力。

  - 其他志願者的注意是非常稀缺的資源。

- Debian 在不斷進步。

  - Debian 期望你製作出高質量的軟件包。

  - 你應該適時改變自己來適應變化。

在 Debian 社區中有這幾類常見的角色：

- Upstream author (上游作者)：程序的原始作者。

- Upstream maintainer (上游維護者)：目前在上游維護程序代碼的人。

- Maintainer (軟件包維護者)：製作並維護該程序的 Debian 軟件包的人。

- Sponsor (保證人)：檢查內容後幫助維護者上傳軟件包到 Debian 官方倉庫的人。

- Mentor (指導者)：幫助維護者熟悉和深入打包的人。

- Debian Developer (DD)：Debian 社區的官方成員。DD 擁有向 Debian 官方倉庫上傳的全部權限。

- Debian Maintainer (DM)：擁有對 Debian 官方倉庫部分上傳權限的人。

注意，你不可能在一夜之間成爲 Debian Developer，因爲成爲 DD 所需要的遠不只是技術技巧。別因此氣餒，如果你的軟件包對其他人有用，你可以作爲軟件包的 Maintainer，通過一位 Sponsor 來上傳它，或者申請成爲 Debian Maintainer。

還有，要成爲 Debian Developer 不一定要創建新軟件包。對已有軟件做出貢獻也是成爲 Debian Developer 的理想途徑。眼下正有很多軟件包等着好的維護者來接手(參看 節 2.2, “選擇你的程式”)。

在這篇文檔裏，我們的重點在於打包的技術細節，所以請參考以下的文檔來瞭解 Debian 是如何運轉的，以及如何才能參與到其中：

- Debian: 17 years of Free Software, "do-ocracy", and democracy (介紹性幻燈片)

- How can you help Debian? (官方文檔)

- The Debian GNU/Linux FAQ, Chapter 13 - "Contributing to the Debian Project" (半官方文檔)

- Debian Wiki, HelpDebian (補充材料)

- Debian New Member site (官方站點)

- Debian Mentors FAQ (補充文檔)

## 1.2. 開發時需要的軟件

在開始之前，你需要確認你是否已經正確安裝了開發所需要的附加套件。注意這些套件不包含任何已經被標記爲 `essential` 或 `required` —— 我們假設你已經安裝了它們。

以下這些軟體包已經隨標準的 Debian 安裝過程進入了系統，所以你可能不需要再動手安裝它們（以及任何附加的依賴軟體包）。然而，你還是應該用 `aptitude show `package`` 或者 `dpkg -s `package`` 來檢查一下。（譯註：apt show PACKAGE 亦可）

在你的開發環境中，需要安裝的最重要的軟件包是 `build-essential`。一旦你 嘗試安裝該包，它將 拉來 其他基本構建環境所需的基本軟件。

對於某些類型的軟件，以上的就是所需要的全部。然而還有一組軟件包雖不是對於所有軟件包都必須，卻可能對你有用或被你的軟件包所需要：

- `autoconf`、`automake` 和 `autotools-dev` - 很多新程序使用 configure 腳本和 `Makefile` 文件來幫助預處理程序。(參看 `info autoconf`、`info automake`)。 `autotools-dev` 則用於保持指定的自動配置文件爲最新，並帶有關於使用那些文件的最佳方法的文檔。

- `dh-make` 和 `debhelper` - `dh-make` 是用於創建我們示例軟件包骨架所必須的，它會使用 `debhelper` 中的一些工具來創建軟件包。他們不是創建軟件包所必須的，但對新維護人員而言，我們 強烈推薦 使用。它使得整個過程極爲簡化，並易於在將來維護。(參看 dh_make(8)、debhelper(1)、`/usr/share/doc/debhelper/README`) [3]

  新的 `debmake` 可以作為標準 `dh-make` 的代替品。debmake 能做的事情更多，並且擁有包含非常多打包例項的 HTML 文件。文件可以透過 `debmake-doc` 軟體包獲取。

- `devscripts` - 此軟件包提供了一些非常好非常有用的腳本幫助維護者，但他們並非構建軟件包所必須。此軟件包所推薦或建議的軟件包都值得一看。(參看 `/usr/share/doc/devscripts/README.gz`)

- `fakeroot` - 這個工具使你可以在編譯過程中必要的時候以普通使用者來模擬 root 使用者環境。 (參看 fakeroot(1))

- `file` - 這個小程序可以檢測文件的類型。(參看 file(1))

- `gfortran` - GNU Fortran 95 編譯器，如果你的程序是用 Fortran 編寫的則必須此軟件包完成編譯。(參看 gfortran(1))

- `git` - 此軟件包提供了用於快捷處理大型項目的著名版本控制系統 - git。它被廣泛用於各種開源項目，最著名的是 Linux 內核項目。(參見 git(1), git Manual (`/usr/share/doc/git-doc/index.html`).)

- `gnupg` - 讓你可以使用 數字簽名 簽署你的軟體包。當你想把它分發給其他人時這一點特別重要。如果你要把你的成果加入到 Debian 發行版中，那這是必須的步驟。(參看 gpg(1).)

- `gpc` - GNU Pascal 編譯器。如果你的程序是用 Pascal 寫的則需要此軟件包。值得一提的是 `fp-compiler`，Free Pascal 編譯器(FPC)，也能夠很好地勝任。(參見 gpc(1), ppc386(1).)

- `lintian` - Debian 軟體包檢查工具，使你可以在編譯軟體包後知道它是否犯了常見的錯誤，並對其找到的錯誤進行解釋。 (參見 lintian(1), Lintian User's Manual.)

- `patch` - 這是一個非常有用的工具，它可以把 diff 程序生成的差異清單文件應用到原先的文件上，從而生成一個補丁版本。(參看 patch(1))

- `patchutils` - 此套件提供了一些可以幫助處理補丁的工具，如 lsdiff、interdiff 和 filterdiff 命令。

- `pbuilder` - 此軟體包提供了建立和維護 chroot 環境的工具。在它的 chroot 環境中編譯 Debian 軟體包可以檢查編譯依賴是否合適，並避免 FTBFS (Fails To Build From Source，原始碼編譯失敗)的 Bug。(參看 pbuilder(8) 和 pdebuild(1))

- `perl` - Perl 是現今類Unix系統中使用最普遍的解釋型腳本語言，它常被稱作Unix的瑞士軍刀。(參看 perl(1))

- `python` - Python 是 Debian 系統中另一個最常用的解釋型腳本語言，它擁有着可圈可點的強大功能和十分清晰的語法。(參看 python(1))

- `quilt` - 此軟件包幫助你管理一系列的補丁。它們被以邏輯棧的方式組織在一起。你可以 apply (=push)、un-apply (=pop) 或簡單地刷新它們然後再放入棧內。(參看 quilt(1), and `/usr/share/doc/quilt/quilt.pdf.gz`.)

- `xutils-dev` - 一些通常用於 X11 的程序，用於使用其宏功能生成 `Makefile` 文件。(參看 imake(1)、xmkmf(1))

以上給出的簡短描述僅僅是爲了使你對這些軟件包有一個基本的印象。在繼續前請詳細閱讀每個程序（包括通過依賴關係安裝的程序，比如make）的文檔，至少瞭解其一般的用途和用法。現在看來這是一項耗時巨大的任務，但在接下來的工作中你將爲你閱讀了它們而感覺到 非常 愉快。如果一會你遇到一些特定的問題，我會建議你重新閱讀上面提到的文檔。

## 1.3. 開發時需要的文檔

以下是 非常重要 的文件，你應該在讀本文件時同時參考它們：

- `debian-policy` - the Debian Policy Manual 包含了對 Debian 軟件倉庫、操作系統設計事宜、文件系統層級標準(FHS，Filesystem Hierarchy Standard，講述每個文件和目錄應該放在哪裏)等的描述。對於你而言，最重要的是它描述了軟件包要進入官方倉庫前必須滿足的條件。(請參見 `/usr/share/doc/debian-policy/policy.pdf.gz` 和 `/usr/share/doc/debian-policy/fhs/fhs-3.0.pdf.gz` 的本地副本)

- `developers-reference` - Debian 開發者參考 描述了打包所需的包含技術細節在內的全部詳細資訊，如倉庫結構、如何重新命名/丟棄/接手軟體包、如何進行 NMU(非維護者上傳)、如何管理 Bug 以及打包最佳實踐、何時向何處上傳等。(參見 `/usr/share/doc/developers-reference/developers-reference.pdf` 的本地副本)

以下是 重要 的文檔，你應該在讀本文檔時同時參看它們：

- Autotools Tutorial 為 the GNU Build System known as the GNU Autotools 中最重要的工具 —— Autoconf、Automake、Libtool 和 gettext 提供了很好的文件。

- `gnu-standards` - 此軟件包包含了 GNU 項目中的兩篇文檔： GNU Coding Standards 和 Information for Maintainers of GNU Software。儘管 Debian 不要求遵守這些規範，它們作爲綱領和共識仍然很有幫助。(參見 `/usr/share/doc/gnu-standards/standards.pdf.gz` 和 `/usr/share/doc/gnu-standards/maintain.pdf.gz` 的本地副本)

若本文檔所敘述的內容與 Debian Policy Manual 或 Debian Developer's Reference 有不符，則按照後兩者的要求進行，並向 `maint-guide` 軟件包提交 Bug 報告。

以下是替代性的教程文件，你可以在讀本文件時同時參看它們：

- Debian Packaging Tutorial

## 1.4. 到何處尋求幫助

在你決定到公共場合提問之前，請先閱讀這些（個）不錯的文件：

- 所有相關軟件包的 `/usr/share/doc/`package`` 目錄之中的文件

- 所有相關命令的 `man `command`` 手冊頁

- 所有相關命令的 `info `command`` info頁

- 郵件列表歸檔 debian-mentors@lists.debian.org

- 郵件列表歸檔 debian-devel@lists.debian.org

你可以在搜索引擎中搜索時使用類似這樣的字符串 :`site:lists.debian.org` 來限制域名以提高效率。

製作小的測試軟件包是學習打包的好方法，仔細查看維護較好的軟件包則是瞭解他人如何製作軟件包的最佳辦法。

如果你仍然對打包存有疑問，並且在文檔和WEB資源中都不能找到答案，你可以交互式地向他們提問：

- http://lists.debian.org/debian-mentors/郵件 debian-mentors@lists.debian.org . (該郵件列表是新手專區。)

- debian-devel@lists.debian.org . (該郵件列表彙集各路神通。)

- IRC 比如 `#debian-mentors`。

- 專注於某個軟件包集合的團隊。 (完整列表參見 https://wiki.debian.org/Teams)

- 特定語言的郵件列表，比如 debian-devel-{french,italian,portuguese,spanish}@lists.debian.org 或 debian-devel@debian.or.jp. (完整列表參見 https://lists.debian.org/devel.html 和 https://lists.debian.org/users.html)

如果你付出了一定的努力並且提問得當，那麼有經驗的 Debian 開發者會很樂意幫助你。

當你收到一個 Bug 報告後(沒錯，真正的 Bug 報告！)，你需要研究 Debian Bug Tracking System (Debian Bug 跟蹤系統，BTS)並閱讀相關的文檔以便高效處理這些報告。我推薦閱讀 Developer's Reference, 5.8. "Handling bugs"

即使上邊的那些問題都解決了，也不能高興得太早。為什麼？因為幾個小時或幾天內就會有人開始使用你的軟體包，如果你犯了某些嚴重的錯誤，將會被無數生氣的 Debian 使用者進行郵件轟炸…… 哦，當然這只是開個玩笑。:-)

放鬆一點並準備好處理 Bug 報告，在你的套件完全符合 Debian 的各項規範前還需要付出很多努力，處理 Bug 也是對你很好的鍛煉(再一次提醒，閱讀那些 必須的文件 來瞭解詳情)。祝你好運！

[1] 在寫這份文檔時，我們默認你使用 `squeeze` 操作系統。如果你需要在 `lenny` 系統上使用本文所記述的方法，則必須安裝 backports 倉庫中的 `dpkg` 和 `debhelper` 軟件包。

[2] 在 Debian Reference 中，你可以瞭解到使用 Debian 系統的一些基本信息和關於 Unix 編程的一些指引。

[3] 還有幾個類似但更針對某一類軟件的軟件包，如 `dh-make-perl`、`dh-make-php` 等。

Debian 新維護人員手冊 |  | 章 2. 第一步