[ 上一頁 ] [ 目錄 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 下一頁 ]


Debian 新維護人員手冊
第 3 章 - 修改原始碼


請注意這裏沒有足夠的篇幅來描述修改上游原始碼的 全部 細節,但是這裏介紹了基本的步驟和常見的問題。


3.1 設置 quilt

quilt 程式爲 Debian 工作提供了對源碼修改的基本記錄方法。由於我們的需求與默認設定相當的不同,我們把 ~/.quiltrc 設置成如下的樣子。[11]

     d=. ; while [ ! -d "$d/debian" -a `readlink -e $d` != / ]; do d="$d/.."; done
     if [ -d "$d/debian" ] && [ -z "$QUILT_PATCHES" ]; then
         # Debian packaging case and unset $QUILT_PATCHES
         QUILT_PATCHES=debian/patches
         QUILT_PATCH_OPTS="--unified-reject-files"
         QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto"
         QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
         QUILT_COLORS="diff_hdr=1;32:diff_add=1;34:diff_rem=1;31:diff_hunk=1;33:diff_ctx=35:diff_cctx=33"
         if ! [ -d $d/debian/patches ]; then mkdir $d/debian/patches; fi
     fi

參考 quilt(1)/usr/share/doc/quilt/quilt.html 來了解如何使用 quilt


3.2 修復上游 Bug

讓我們假設你在上游的 Makefile 檔案中找到了一個錯誤,其中的 install: gentoo 應該是 install: gentoo-target 才正確。

     install: gentoo
             install ./gentoo $(BIN)
             install icons/* $(ICONS)
             install gentoorc-example $(HOME)/.gentoorc

讓我們使用 quilt 修復它,並把它命名爲 fix-gentoo-target.patch。[12]

     $ mkdir debian/patches
     $ quilt new fix-gentoo-target.patch
     $ quilt add Makefile

現在將 Makefile 修改爲如下的樣子。

     install: gentoo-target
             install ./gentoo $(BIN)
             install icons/* $(ICONS)
             install gentoorc-example $(HOME)/.gentoorc

使用 quilt 更新補丁以創建 debian/patches/fix-gentoo-targe.patch 並添加描述。

     $ quilt refresh
     $ quilt header -e
     ... 描述補丁

3.3 把檔案安裝到目的位置

正常情況下,程式將其本身安裝在 /usr/local。因爲它是保留給系統管理員(或用戶)的私有位置,Debian 套件不可以使用該目錄,而是按照檔案系統層級標準(FHS/usr/share/doc/debian-policy/fhs/fhs-2.3.html)使用如 /usr/bin 等目錄。

通常在自動編譯程式時使用 make(1) 程式,執行 make install 就把程式直接按照 Makefile 檔案中的 install target 安裝到指定的位置。爲了使 Debian 能夠提供二進位套件,編譯系統將檔案安裝到一個臨時目錄中創建的檔案系統樹的鏡像中,而非直接安裝到實際的目標位置。

普通程式安裝過程和 Debian 打包安裝過程的區別可以由 debhelper 套件中的 dh_auto_configuredh_auto_install 透明地處理。但程式必須滿足以下條件:

使用 GNU autoconf 的程式 自動 遵守了 GNU 的規定,這些程式的打包也就 幾乎是自動的。通過這項特點和其他啓發式處理,debhelper 套件可以直接打包約 90% 的套件而不需對編譯系統做出大的改變。所以打包也不是它看起來那樣複雜。

如果你需要修改 Makefile 檔案,要確保其支持 $(DESTDIR) 變量。默認情況下 $(DESTDIR) 變量沒有設置並且默認使用程式選擇的安裝位置。打包腳本會將 $(DESTDIR) 設置爲臨時目錄。

對於單個二進位套件 dh_auto_install 將臨時目錄設置爲 debian/package。[13] 臨時目錄中的全部檔案都將在用戶安裝套件時被安裝到用戶系統,唯一的區別是 dpkg 會把檔案安裝到真實的根目錄樹中。

請記住,即使你的程式正確安裝到了debian/package,仍然要考慮它可以在在實際的根目錄中安裝的情形,即從.deb 套件檔案安裝的情形。所以絕對不允許將諸如 /home/me/deb/package-version/usr/share/package 的內容硬編碼到編譯系統中並裝入套件檔案。

以下是 gentooMakefile 檔案中的相關部分[14]:

     # make install 時放置二進位檔案的位置
     BIN     = /usr/local/bin
     
     # make install 時放置圖示檔案的位置
     ICONS   = /usr/local/share/gentoo

可以看到檔案被放到了 /usr/local 下。把他們改變爲:

     # make install 時放置二進位檔案的位置
     BIN     = $(DESTDIR)/usr/bin
     
     # make install 時放置圖示檔案的位置
     ICONS   = $(DESTDIR)/usr/share/gentoo

爲什麼要放在那個目錄,而非其他的呢?因爲 Debian 套件從不在 /usr/local 下安裝檔案——那是保留給系統管理員使用的。在 Debian 中這些檔案被直接放入 /usr

二進位檔案、圖示和文件等的更詳細位置均在檔案層級標準(FHS,參考 /usr/share/doc/debian-policy/fhs/)中作出了詳盡描述。我建議閱讀相關章節以瞭解可能影響你套件的內容。

因此,我們應當把二進位檔案安裝到 /usr/bin 而非 /usr/local/bin,man 手冊頁則應放在 /usr/share/man/man1 而非 /usr/local/man/man1 等。注意到 gentooMakefile 裏沒有提及手冊頁,而按照 Debian Policy 的要求,每個程式都應當有一個手冊頁,我們將在稍後製作一個並安裝到 /usr/share/man/man1

有些程式不使用 Makefile 變量定義路徑,這意味着你可能需要去編輯 C 程式原始碼來使他們使用正確的路徑。但是到哪裏去搜索,哪些才是呢?你可以通過以下的方法找到它們:

     $ grep -nr -e 'usr/local/lib' --include='*.[c|h]' .

grep 會遞歸搜索整個原始碼樹並告訴你所有匹配項的檔案名和行號。

編輯那些檔案,用 usr/lib 替換 usr/local/lib

     $ vim '+argdo %s/usr\/local\/lib/usr\/lib/gce|update' +q \
           $(find . -type f -name '*.[c|h]')

小心不要弄亂其他部分的程式碼! :-)

此後你應該找到 install target (通常搜索以 install: 開頭的行即可),並把所有的相關目錄以及在 Makefile 頂部定義變量均做修改。

在你修復了上游的 Bug 後,gentoo 的 install target 應是這樣:

     install: gentoo-target
             install ./gentoo $(BIN)
             install icons/* $(ICONS)
             install gentoorc-example $(HOME)/.gentoorc

讓我們把這些修改使用 quilt 記錄到debian/patches/install.patch

     $ quilt new install.patch
     $ quilt add Makefile

我們使用編輯器按照以下內容爲 Debian 套件做修改:

     install: gentoo-target
             install -d $(BIN) $(ICONS) $(DESTDIR)/etc
             install ./gentoo $(BIN)
             install -m644 icons/* $(ICONS)
             install -m644 gentoorc-example $(DESTDIR)/etc/gentoorc

你一定會注意到在其他命令前有了一個 install -d 命令。原始的 Makefile 檔案中沒有它,因爲通常情況下 /usr/local/bin 和用到的其他目錄早已存在於系統,使用 make install 時不用對此處理。然而因爲我們要向空目錄或尚不存在的目錄中安裝,我們必須創建每一個目錄。

我們還可以在末尾添加上其他的內容,比如上游作者有時會省略的附加文件:

             install -d $(DESTDIR)/usr/share/doc/gentoo/html
             cp -a docs/* $(DESTDIR)/usr/share/doc/gentoo/html

仔細檢査後如果沒有問題,使用 quilt 更新補丁以創建 debian/patches/install.patch 檔案並添加對它的描述。

     $ quilt refresh
     $ quilt header -e
     ... 描述補丁

現在你有了一格系列的補丁。

  1. 修復上游 Bug:debian/patches/fix-gentoo-target.patch

  1. Debian 特有的打包修改:debian/patches/install.patch

進行任何不是 Debian 特有的修改時,比如 debian/patches/fix-gentoo-target.patch,一定要向上遊作者進行反饋,以便上游作者方便在下一版本中以使更多人受益。同時請記住在做不特別針對 Debian 或 Linux (甚至是 Unix!)的修改時要使其可以移植,這會使你的修改更容易被接受。

注意你不一定要把 debian/* 都提交到上游。


3.4 不一樣的函式庫名稱

還有另外一個常見的問題:不同平臺之間的函式庫常常是不同的。例如一個 Makefile 中可能引了用一個不在 Debian 上存在的函式庫。這種情況下我們需要將其修改爲 Debian 中存在的、提供完全相同功能的函式庫。

如果你手中程式的 Makefile(或 Makefile.in)中有如下的行(且程式無法通過編譯)[15]:

     LIBS = -lcurses -lsomething -lsomethingelse

我們將這個補丁命名爲 debian/patches/ncurse.patch,內容是把 curses 改爲 ncurses

     $ quilt new ncurse.patch
     $ quilt add Makefile
     $ sed -i -e "s/-lcurses/-lncurses/g" Makefile
     $ quilt refresh
     $ quilt header -e
     ... 描述補丁

[ 上一頁 ] [ 目錄 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 下一頁 ]


Debian 新維護人員手冊

版本 1.2.25, 2010-12-21 14:06:56 UTC

Josip Rodin joy-mg@debian.org

翻譯:Aron Xu happyaron.xu@gmail.com
翻譯:李凌 lilingv@gmail.com
翻譯:郑原真 ycheng@slat.org
繁簡轉換:陳侃如 koster@debian.org
繁簡轉換:青木修 osamu@debian.org