在 apt-build update-repository 時,apt-build 無法產生正確的 Package 檔案,
而是跑出一個大小為 21 byte 的 Package.gz,解壓縮後只有 1 byte 的空字元。
以下是編譯 zip 的 source code 時跑出來的錯誤訊息:
- 代碼: 選擇全部
workstation:/home/apt-build# apt-build -y --reinstall install zip
.
.
.
.
.
Hit http://marillat.free.fr unstable/main Release
Reading Package Lists... Error!
E: Encountered a section with no Package: header
E: Problem with MergeList /var/lib/apt/lists/_home_apt-build_repository_dists_apt-build_main_binary-i386_Packages
E: The package lists or status file could not be parsed or opened.
Reading Package Lists... Error!
E: Encountered a section with no Package: header
E: Problem with MergeList /var/lib/apt/lists/_home_apt-build_repository_dists_apt-build_main_binary-i386_Packages
E: The package lists or status file could not be parsed or opened.
workstation:/home/apt-build# apt-build update-repository
-----> Updating repository <-----
Using: -O3 -mcpu=pentium4 -march=pentium4
E: Unparsible control file
E: Errors apply to file './zip_2.30-5_i386.deb'
小弟在 Google 上找到「Unparsible control file」是 apt-ftparchive 的錯誤訊息,
便花了一點時間查了一下 /usr/bin/apt-build 的內容,
發現 apt-build 是使用 apt-ftparchive 來產生 Package,
再用 gzip 壓縮成 Package.gz。
- 代碼: 選擇全部
sub build_repository
{
print "-----> Updating repository <-----\n";
chdir($repository_dir) or die "Unable to chdir to $repository_dir\n";
if(! -e "main" ) { system("ln -s . main"); }
if(! -e "apt-build" ) { system("ln -s . apt-build"); }
if(! -e "dists" ) { system("ln -s . dists"); }
my $arch=qx[dpkg --print-architecture]; chomp($arch);
if(! -e "binary-$arch" ) { system("ln -s . binary-$arch"); }
if(! -e "Release" ) { &make_release_file(); }
system("apt-ftparchive packages . | gzip -9 > Packages.gz");
chdir($build_dir);
}
man 一下 apt-ftparchive,看到如下內容:
- 代碼: 選擇全部
apt-ftparchive is a superset of the dpkg-scanpackages(8) program,
incorporating it's entire functionality via the directory command. It
also contains a contents file generator, contents, and an elaborate
means to 'script' the generation process for a complete archive.
搞不好可以用 dpkg-scanpackages 來取代 apt-ftparchive ……好,直接改了!
我直接將下以這行:
- 代碼: 選擇全部
system("apt-ftparchive packages . | gzip -9 > Packages.gz");
改成這樣:
- 代碼: 選擇全部
system("dpkg-scanpackages . /dev/null | gzip -9 > Packages.gz");
存檔,然後重新 update-repository:
- 代碼: 選擇全部
workstation:/home/apt-build# apt-build update-repository
-----> Updating repository <-----
Using: -O3 -mcpu=pentium4 -march=pentium4
** Packages in archive but missing from override file: **
zip
Wrote 1 entries to output Packages file.
看來是將問題解決了
如果有人遇到跟我一樣的問題,不妨試試看這個方法。
感想:
花了一整天,就只為了解決這個問題:-?
現在要面對 xserver-xfree86 4.3.0 跟 Mozilla 1.3 的 source
說實在話,apt-build 的 bug 真的很多,但在整個編譯原始碼的過程中,
發覺 Debian source 的 dependency 很亂,
很多東西都是 source 需要而實際上找不到版本與之符合的套件,
只好動手把 Build-Dependency 中一些套件直接拿掉,
如 xfree86 4.3.0(Danial Stone 版)的 kernel-headers-2.4,
Mozilla 1.3-5(in unstable)的 libjpeg-dev 才能開始整個編譯流程。
現在我的老 pentium2-300 正在跟 Mozilla 的 source code 搏鬥中,希望能順利編完……