为什么要打 rpm 包,因为不打包就要自己去编译,特讨厌在 CentOS 上 blablabla… 的一篇又一篇自编译教程,一点都不环保,而且一点都不利于扩散嘛。
rpm 打包需要特定的目录结构,准备工作:
$ echo "%_topdir %(echo $HOME)/rpmbuild" >> ~/.rpmmacros
$ mkdir -p ~/rpmbuild/{BUILD,RPMS,S{OURCE,PEC,RPM}S}
你也需要特定的一些工具
# yum install rpm-build rpmdevtools
目录结构
$ tree ~/rpmbuild
/home/havanna/rpmbuild
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
打包 rpm 的核心就是 spec 文件,可以通过模板操作
$ rpmdev-newspec shadowsocks-libev
也可以通过其他工具来书写。给出 shadowsocks-libev.spec 文件
%global commit 2a6c28e185774addcf4d090662886b9433a7cefa
%global shortcommit %(c=%{commit}; echo ${c:0:7})
Name: shadowsocks-libev
Version: 1.6.1
Release: 1%{?dist}
License: GPL-3
Summary: a lightweight secured scoks5 proxy for embedded devices and low end boxes.
Url: https://github.com/madeye/%{name}
Group: Applications/Internet
Source0: %{url}/archive/%{commit}/%{name}-%{version}-%{shortcommit}.tar.gz
Source1: %{name}.json
Source2: ss-local.service
Source3: ss-server.service
Source4: %{name}
Packager: Havanna <registerdedicated(at)gmail.com>
BuildRequires: autoconf libtool gcc openssl-devel
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXX)
%description
shadowsocks-libev is a lightweight secured scoks5 proxy for embedded devices and low end boxes.
%prep
%setup -qn %{name}-%{commit}
%build
export CFLAGS="-O2"
%configure --prefix=%{_prefix}
make %{?_smp_mflags}
%install
rm -rf %{buildroot}
make DESTDIR=%{buildroot} install
install -d %{buildroot}%{_sysconfdir}
install -m 0644 %{SOURCE1} %{buildroot}%{_sysconfdir}
%if 0%{?rhel} >= 7
install -d %{buildroot}%{_unitdir}
install -m 0644 %{SOURCE2} %{buildroot}%{_unitdir}
install -m 0644 %{SOURCE3} %{buildroot}%{_unitdir}
%endif
%if 0%{?rhel} == 6
install -d %{buildroot}%{_initddir}
install -m 0755 %{SOURCE4} %{buildroot}%{_initddir}
%endif
%if 0%{?rhel} < 7
%post
/sbin/chkconfig --add %{name}
%preun
if [ $1 = 0 ]; then
/sbin/service %{name} stop
/sbin/chkconfig --del %{name}
fi
%endif
%files
%defattr(-,root,root)
%doc Changes README.md COPYING LICENSE
%config %{_sysconfdir}
%{_bindir}/*
%{_mandir}
%if 0%{?rhel} >= 7
%config %{_unitdir}
%endif
%if 0%{?rhel} == 6
%config %{_initddir}
%endif
%changelog
spec 文件中变量,可以通过 rpmbuild --showrc
来查看,譬如判断系统版本
$ rpmbuild --showrc | grep centos
-14: centos 7
-14: centos_ver 7
-14: dist .el7.centos
小技巧
installupgradeuninstall
%pre $1 == 1 $1 == 2 (N/A)
%post $1 == 1 $1 == 2 (N/A)
%preun (N/A) $1 == 1 $1 == 0
%postun (N/A) $1 == 1 $1 == 0
rpm 源码包适用于 CentOS 7,如果是 6.5 版本,请通过 spec 文件打包。
如果有 rpm 源码包,可以通过以下命令解压来查看
$ rpm2cpio shadowsocks-libev-1.6.1-1.el7.centos.src.rpm | cpio -div
shadowsocks-libev
shadowsocks-libev-1.6.1-2a6c28e.tar.gz
shadowsocks-libev.json
shadowsocks-libev.spec
ss-local.service
ss-server.service
4716 blocks
没有的话,就 clone 吧
$ git clone git://github.com/Ihavee/ihavee-rpm.git ./your/path
将下面三个文件放入文件夹 ~/rpmbuild/SOURCES
ss-local.service
ss-server.service
shadowsocks-libev
shadowsocks-libev.json
shadowsocks-libev-1.6.1-2a6c28e.tar.gz
安装一些必要的依赖
# yum install autoconf libtool gcc openssl-devel
注意:CentOS 6.5 之前的版本,自己编译个新版本的 GCC 吧。
随后执行打包操作
$ rpmbuild -bb shadowsocks-libev.spec
具体用法可以 rpmbuild --help
查看。
若版本号变更,修改 spec 文件的版本号以及 commit 后,通过 spectool 重下源码
$ spectool -R -g shadowsocks-libev.spec
直接通过 rpm 源码包来制作两进制包
$ rpmbuild --rebuild /path/shadowsocks-libev-1.6.1-1.el7.centos.src.rpm
然后直接安装两进制包
# rpm -ivh /path/shadowsocks-libev-1.6.1-1.el7.centos.x86_64.rpm
or
# yum install /path/shadowsocks-libev-1.6.1-1.el7.centos.x86_64.rpm
参考:
(完)