这个fpm我大概一年前用过几次,当时觉得这东西是个神器,这两天又重新学习了下,发现只能说是各取所长。。
fpm能打包需要make install的程序,并且不需要像dh-make那样去编写rules等脚本,打包难度降低了许多。
但同时也有一个致命的缺点是不能自动处理依赖关系,而dh-make可以做到这一点。要知道Linux那错综复杂的依赖关系很多时候是让人生不如死的。
fpm不仅仅能打包deb,像rpm/python等包都可以使用它,但就如我上面所说的,它不能自动处理依赖关系,因此只适合打一些简单的包,如果是用来制作简单的安装包并且不打算提交到官方存储库,用fpm确实要方便很多。
安装fpm很简单,首先安装需要用到的依赖/软件(devscripts可选,里面包含了大量dev依赖包):
apt -y install ruby ruby-dev rubygems build-essential devscripts
然后使用gem即可安装:
gem install fpm
本文还是以qBittorrent-Enhanced-Edition这个软件为例,首先安装编译需要用到的依赖:
apt -y install pkg-config libtool git libtorrent-rasterbar-dev \ libboost-dev libboost-system-dev libboost-chrono-dev \ libboost-random-dev libssl-dev libgeoip-dev zlib1g-dev \ qtbase5-dev qttools5-dev-tools libqt5svg5-dev
从上游拉取源码:
git clone https://github.com/c0re100/qBittorrent-Enhanced-Edition.git cd qBittorrent-Enhanced-Edition
如果你安装了devscripts,可以使用dpkg-depcheck辅助检测一下软件包可能需要用到的依赖:
dpkg-depcheck -d ./configure --prefix=/usr --disable-gui CXXFLAGS=-std=c++11
检测的结果很准,但往往会有很多多余的依赖包列出(得自己筛选):
或者还是按常规方法去配置:
./configure --prefix=/usr --disable-gui CXXFLAGS=-std=c++11
之后和往常一样编译:
make -j$(nproc)
创建临时安装目录:
mkdir -p /tmp/qbittorrent
将qbittorrent安装到临时目录,注意qbittorrent编译是使用的qmake,qmake不认DESTDIR,后来我上网查了下可以用INSTALL_ROOT:
make install INSTALL_ROOT=/tmp/qbittorrent
可以发现从开始到现在,我们都和往常一样去编译,只是最后将软件安装在临时目录而已,没有去编写rules等等文件。所以,这就是fpm相对于dh-make的优势。
现在就可以使用fpm打包了:
fpm -s dir -t deb \ -C /tmp/qbittorrent \ -m "imlala <1062951199@qq.com>" \ --url "https://www.lala.im" \ --description "bittorrent client based on libtorrent-rasterbar (without X support)" \ -n qbittorrent-nox \ -v 4.1.7.1 \ -p qbittorrent-nox_4.1.7.1_amd64.deb \ -d "libtorrent-rasterbar9 >= 1.1.11" \ -d "zlib1g-dev >= 1:1.2.0" \ -d "libboost-system-dev >= 1.67.0.1" \ -d "qtbase5-dev >= 5.11.3" \ usr/bin
这样就构建好了一个deb包,但相对于dh-make来说缺点也很明显,-d参数后面的依赖全部都得我们自己手动指定,而dh-make可是全自动的。。
所以从某种角度来说fpm方便的同时也带来了麻烦。。
如果dpkg-depcheck这种找依赖的方式不够用,下面还有几个笨办法:
1.用ldd去看这个二进制文件加载了哪些.so,然后借助Google搜索。
2.如果这个软件本身就在官方存储库里面存在,可以借助apt depends参考。
3.一般自己编译的软件,大部分依赖其实就是自己编译时安装的各种dev包。
这么麻烦,我选择docker