本文展示如何将脚本打包成rpm格式的文件
RPM是Red Hat Package Manager的简称,rpm包可以在redhat系列的系统轻松安装,更新,卸载。包括Fedora, CentOS, RHEL, etc.
RPM包使用.rpm
扩展名,是一个压缩包,包含
rpm包的名字一般格式:
<name>-<version>-<release>.<arch>.rpm
例如:
bdsync-0.11.1-1.x86_64.rpm
一些包也包含rpm的适用平台:
bdsync-0.11.1-1.el8.x86_64.rpm
yum install -y rpmdevtools rpmlint
创建rpm包的开发目录,位置一般在$HOME/rpmbuild
:
$ rpmdev-setuptree
开发目录结构及作用如下:
rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
.tar.gz
或者.tgz
$ cat << EOF >> hello.sh
#!/bin/sh
echo "Hello world"
EOF
mkdir hello-0.0.1
mv hello.sh hello-0.0.1
tar --create --file hello-0.0.1.tar.gz hello-0.0.1
mv hello-0.0.1.tar.gz $HOME/rpmbuild/SOURCES
如下命令生成模板spec
rpmdev-newspec hello
现在的目录机构如下所示:
/root/rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
│ └── hello-0.0.1.tar.gz
├── SPECS
│ └── hello.spec
└── SRPMS
Name: hello
Version: 0.0.1
Release: 1%{?dist}
Summary: A simple hello world script
BuildArch: noarch # noarch代表任何芯片架构或者发行版都可以安装
License: GPL
Source0: %{name}-%{version}.tar.gz # 源码包名字,此处为hello-0.0.1.tar.gz
Requires: bash # 此软件安装的前提是需要bash,多个的话用","分隔,比如gcc,gcc-c++
%description
A demo RPM build
%prep
%setup -q # 这一步是解压SOURCES目录的源码包
%install
rm -rf $RPM_BUILD_ROOT # RPM_BUILD_ROOT是构建当前目录,宏常量
mkdir -p $RPM_BUILD_ROOT/%{_bindir}
cp %{name}.sh $RPM_BUILD_ROOT/%{_bindir} # 拷贝到rpm包的%{_bindir}的目录下,%{_bindir}为宏常量,通常为/usr/bin
%clean
rm -rf $RPM_BUILD_ROOT
%files
%{_bindir}/%{name}.sh # /usr/bin/hello.sh 相当于把rpm包里的hello.sh放到/usr/bin下
%changelog
* Sun Nov 18 2020 Valentin Bajrami <valentin.bajrami@slimmer.ai> - 0.0.1
- First version being packaged
宏常量的查看方式
$ rpm --eval '%{_bindir}'
/usr/bin
Other useful macros:
其他常用宏常量:
$ rpmlint ~/rpmbuild/SPECS/hello.spec
SPECS/hello.spec: W: no-%build-section
SPECS/hello.spec: W: invalid-url Source0: hello-0.0.1.tar.gz
0 packages and 1 specfiles checked; 0 errors, 2 warnings.
rpmbuild -ba hello.spec
-b
build-a
both source and binary packagescd ~/rpmbuild/RPMS
rpm -ivh hello-0.0.1.rpm
检测rpm是否成功:
rpm -qi hello
在一些场景下,.so
文件包含于rpm包中,但是运行rpm -ivh
时出现,如下报错:
$ rpm -ivh hello.rpm
error: Failed dependencies:
lib3ds-2.so()(64bit) is needed by cips-22.05.06-1.el7.x86_64
libAltova.so()(64bit) is needed by cips-22.05.06-1.el7.x86_64
libAltovaXML.so()(64bit) is needed by cips-22.05.06-1.el7.x86_64
libGLEW.so.2.1()(64bit) is needed by cips-22.05.06-1.el7.x86_64
这是因为rpmbuild过程中会自动检测软件所需的.so
依赖,但是仅检测通过rpm方式安装的。假如.so
文件在rpm里,安装可以使用--nodeps
选项来跳过检测, 这并不会影响软件正常运行。
rpm -ivh --nodeps *.rpm