問題描述
Ubuntu 20.04在官方源中已經(jīng)提供了libfuse3的deb包杂瘸,然而在Ubuntu 18.04的官方源中僅有l(wèi)ibfuse2 (2.9.7)。為了讓部署起來更加方便伙菊,需要自己制作libfuse3的deb包败玉。
制作流程
deb包的制作本身需要經(jīng)歷幾個過程,可以參考教程 https://www.debian.org/doc/manuals/packaging-tutorial/packaging-tutorial.en.pdf镜硕。其中大致包括創(chuàng)建源碼包(dh_make)
->編譯與測試(debuild)
运翼。其中最復(fù)雜的過程是dh_make->debuild
之間對debian/
下打包描述文件的編寫過程,例如包括
- debian/control:deb包的元數(shù)據(jù)兴枯,例如依賴包血淌、版本等
- debian/rules:制作本deb包的一些特殊的規(guī)則,例如描述對
install, test
等默認(rèn)過程的附加命令
1. 源碼下載
雖然libfuse社區(qū)沒在開源項目中給出deb的打包規(guī)則财剖,幸運的是deb社區(qū)給出了其打包libfuse3-3時所寫的deb規(guī)則以及l(fā)ibfuse-3.9.0-2相應(yīng)origin源碼悠夯。debian社區(qū)libfuse3-3的軟件包頁面在: https://packages.debian.org/sid/libfuse3-3
debhelper提供了方便的一鍵下載腳本工具,只需要
dget http://deb.debian.org/debian/pool/main/f/fuse3/fuse3_3.9.0-2.dsc
就會將fuse3_3.9.0.origin.tar.xz
以及fuse3_3.9.0-2.debian.tar.xz
等下載到當(dāng)前路徑躺坟。因為只是自己用沦补,沒有簽名等需求,因此在本次自制deb包過程中有用的包有fuse3_3.9.0.origin.tar.xz
以及fuse3_3.9.0-2.debian.tar.xz
咪橙。其中前者是源碼包夕膀,后者描述打包過程栓袖。
解壓完成后,目錄結(jié)構(gòu)如下店诗,其中debian/
解壓自于fuse3_3.9.0-2.debian.tar.xz
- fuse-3.9.0/
`- debian/
`- doc/
`- example/
`- meson.build
`- ...
2. debuild一條龍
mk-build-deps
是安裝編譯依賴所用到的工具裹刮,他會自動生成一個二進(jìn)制包,該二進(jìn)制包的依賴關(guān)系與最終目標(biāo)deb包編譯時依賴的其他包庞瘸,因此通過安裝該二進(jìn)制包即可一次性解決編譯時的依賴問題捧弃。相關(guān)命令為
mk-build-deps --install --remove
debuild是dpkg-buildpackage, lintian, fakeroot, debsign
的一條龍命令工具,如果一切順利的話一句debuild
就可以完成打包過程擦囊。然而問題是比較多的违霞。
a. Compatibility levels
debhelper打包的過程中報錯:dh: Compatibility levels before 5 are no longer supported (level 1 requested)
,造成該錯誤的主要原因是編譯平臺尚未安裝用于向后移植的包瞬场,所以兼容性不符合要求买鸽。結(jié)果方式是在ubuntu 18.04上安裝apt install bionic-backports
。
他們的向后移植設(shè)計很巧妙贯被,后續(xù)有時間了我一定仔細(xì)學(xué)習(xí)一下他們是如何做到向后可移植的原理眼五。
b. pytest測試報錯,包括pytest的版本問題以及l(fā)ibfuse test用例外部參數(shù)錯誤導(dǎo)致無法通過等問題
解決方案有兩個彤灶,最簡單暴力的方案就是通過設(shè)置臨時環(huán)境變量跳過測試過程:
DEB_BUILD_OPTIONS=nocheck debuild -us -uc
更加正確的解決辦法為看幼,逐個定位問題解決問題。
首先是pytest版本問題幌陕,因為使用apt install python3-pytest
安裝的pytest版本較老導(dǎo)致的問題诵姜,可以通過使用pip重新安裝pytest來解決,pip3 install pytest
搏熄。
其次是libfuse測試用戶無法通過的問題棚唆,可以看到debian的官方libfuse3-3
給我們的debian/rule
中使用了命令python3 -m pytest test/
來執(zhí)行測試,而test/test_examples.py
中有使用了相對路徑test/../examples/hello
來調(diào)用可執(zhí)行文件心例,但是debuild
在ninja build
的過程中使用的builddir
為obj-x86_64-linux-gnu/
宵凌,這就導(dǎo)致了pytest測試用例中實際用到的可執(zhí)行文件并不在他期望的位置。因此在debian/rules
中的override_dh_auto_test
項進(jìn)行如下修改:
override_dh_auto_test:
ifeq (,$(findstring nocheck,$(DEB_BUILD_OPTIONS)))
# python3 -m pytest test/
python3 -m pytest obj-x86_64-linux-gnu/test/
endif
c. install usr/lib//.a契邀, File not found
在meson configure中摆寄,default_library
的默認(rèn)項為shared
,因此libfuse并沒有編譯出libfuse3.a
等靜態(tài)鏈接庫坯门,這導(dǎo)致debhelper在根據(jù)debian/libfuse3-dev.install
的過程中出錯微饥。這應(yīng)該是ubuntu特有的問題,需要手動注釋debian/libfuse3-dev.install
中的usr/lib/*/*.a
古戴。其實正常來說如果*.a
不存在欠橘,應(yīng)該忽略這個錯誤而不應(yīng)該停止。
d. fusermount3.1, File Not Found
這個問題與上一個大同小異现恼,查看debian/tmp/usr/share/man/man1
可以發(fā)現(xiàn)實際存在的是fusermount3.1.gz
肃续,因此手動將debian/fuse3.manpages
中的manpage路徑添加拓展名.gz
即可黍檩。
3. 最終收尾
解決完上述問題以后,再次運行debuild -us -uc
始锚,最終能在fuse-3.9.0
的平級目錄得到一條龍制作完成的deb包刽酱,包括fuse3_3.9.0-2_amd64.deb
,libfuse3-3_3.9.0-2_amd64.deb
等瞧捌。