[ 上一頁 ] [ 目錄 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 下一頁 ]
請注意這裏沒有足夠的篇幅來描述修改上游原始碼的 全部 細節,但是這裏介紹了基本的步驟和常見的問題。
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
。
讓我們假設你在上游的 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 ... 描述補丁
正常情況下,程式將其本身安裝在
/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_configure
和
dh_auto_install
透明地處理。但程式必須滿足以下條件:
Makefile
檔案遵循 GNU 的規定支持 $(DESTDIR)
變量(/usr/share/doc/gnu-standards/standards.html#Makefile-Conventions
)。
原始碼遵循檔案系統層級標準(FHS)。
使用 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
的內容硬編碼到編譯系統中並裝入套件檔案。
以下是 gentoo
的 Makefile
檔案中的相關部分[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
等。注意到 gentoo
的 Makefile
裏沒有提及手冊頁,而按照 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 ... 描述補丁
現在你有了一格系列的補丁。
修復上游 Bug:debian/patches/fix-gentoo-target.patch
Debian 特有的打包修改:debian/patches/install.patch
進行任何不是 Debian 特有的修改時,比如
debian/patches/fix-gentoo-target.patch
,一定要向上遊作者進行反饋,以便上游作者方便在下一版本中以使更多人受益。同時請記住在做不特別針對
Debian 或 Linux (甚至是
Unix!)的修改時要使其可以移植,這會使你的修改更容易被接受。
注意你不一定要把 debian/*
都提交到上游。
還有另外一個常見的問題:不同平臺之間的函式庫常常是不同的。例如一個
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 UTCjoy-mg@debian.org
happyaron.xu@gmail.com
lilingv@gmail.com
ycheng@slat.org
koster@debian.org
osamu@debian.org