Skip to content

制作rpm安装包文件

这里假设有一些二进制文件和相关Shell脚本,想打包为rpm格式实现一键自动安装。

  • 安装工具包
$ sudo yum install rpm-build rpmdevtools
  • 创建工作目录
$ rpmdev-setuptree  # 默认创建~/rpmbuild/

$ tree ~/rpmbuild/

~/rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS

如果更改一些默认设置,直接修改文件 ~/.rpmmacros:

%_topdir %(echo $HOME)/rpmbuild

%_smp_mflags %( \
    [ -z "$RPM_BUILD_NCPUS" ] \\\
        && RPM_BUILD_NCPUS="`/usr/bin/nproc 2>/dev/null || \\\
                             /usr/bin/getconf _NPROCESSORS_ONLN`"; \\\
    if [ "$RPM_BUILD_NCPUS" -gt 16 ]; then \\\
        echo "-j16"; \\\
    elif [ "$RPM_BUILD_NCPUS" -gt 3 ]; then \\\
        echo "-j$RPM_BUILD_NCPUS"; \\\
    else \\\
        echo "-j3"; \\\
    fi )

%__arch_install_post \
    [ "%{buildarch}" = "noarch" ] || QA_CHECK_RPATHS=1 ; \
    case "${QA_CHECK_RPATHS:-}" in [1yY]*) /usr/lib/rpm/check-rpaths ;; esac \
    /usr/lib/rpm/check-buildroot

准备软件源文件

$ tree ~/rpmbuild/SOURCES/

~/rpmbuild/SOURCES/
├── test-1.0.0
│   ├── Makefile
│   └── test.exe
└── test-1.0.0.tar.gz

主要文件是 ~/rpmbuild/SOURCES/test-1.0.0/Makefile 规定了如何执行安装步骤:

ifdef DESTDIR
    destDir=$(DESTDIR)/usr/local/Test/bin
else
    destDir=~/Test/bin
endif

install: test.exe
    test -d $(destDir) || mkdir -p $(destDir)
    cp test.exe $(destDir)/test.exe

.PHONY: clean

clean:
    rm -f $(destDir)/test.exe

之后将软件源文件目录打包为 *.tar.gz 格式文件。

创建SPEC文件

使用 vim 打开 *.spec 后缀文件时会自动加载模板,源自于读取了模板文件 /usr/share/vim/vimfiles/template.spec.

如果自己要添加新模板则:

$ vim /etc/vimrc

autocmd BufNewFile *.spec 0r /usr/share/vim/vimfiles/template.spec  # 自带的模板规则
autocmd BufNewFile *.test 0r /usr/share/vim/vimfiles/template.test  # 自定义的新增模板规则

~/rpmbuild/SPECS/test.spec 内容:

#
# 以#符号开头的行是注释行
# 2022-10-21
# Author: LeslieZhu

# 会创建目录: rpmbuild/BUILDROOT/%%(name)-%%(version)-%%(release).%%(arch)
Name:    test

# 版本号
Version: 1.0.0

# 发布次数
Release: 2

Summary: A Test Program

Group: TestTeam

License: GPLv3

# N/A: 表示没有
URL: N/A

# 构建目标架构
BuildArch: x86_64

# 用来构建RPM文件的源文件,如果不提供则使用下方的%files
Source0: %{name}-%{version}.tar.gz

# 构建的时候依赖的软件包
BuildRequires: gcc,vim

# 软件运行时需要的软件包
Requires: gcc,vim

%description

This is a test program.

# 测试安装目录
BuildRoot: %_topdir/BUILDROOT

# 构建软件包之前要做的事情
%prep

# 解压并cd,将%_sourcedir内容解压到%_builddir
%setup -q


%build
# 如果有源码编译则一般是 ./configure %{?_smp_mflags}
# make %{?_smp_mflags}

%install

make DESTDIR=%{buildroot} install


%pre
# rpm文件安装前
echo install start....

%post
# rpm文件安装后
echo install done

%preun
# 卸载前
echo uninstall start...

%postun
# 卸载后
echo uninstall done

%clean
# 清理
echo clean start...
make DESTDIR=%{buildroot} clean
echo clean done...


%files

# /path/to/ 如果是某个目录则直接把目录写到这里即可
/usr/local/Test/bin/test.exe

%doc

# /path/to/docfile 文档路径

此时目录结构:

├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
│   ├── test-1.0.0
│   │   ├── Makefile
│   │   └── test.exe
│   └── test-1.0.0.tar.gz
├── SPECS
│   └── test.spec
└── SRPMS

构建RPM文件

$ rpmbuild -ba SPECS/test.spec  # 二进制和src rpm文件
$ rpmbuild -bb SPECS/test.spec  # 只生成二进制rpm文件
$ rpmbuild -bs SPECS/test.spec  # 只生成src rpm文件

目录文件:

├── BUILD
│   └── test-1.0.0
│       ├── debugfiles.list
│       ├── debuglinks.list
│       ├── debugsources.list
│       ├── elfbins.list
│       ├── Makefile
│       └── test.exe
├── BUILDROOT
│   └── test-1.0.0-2.x86_64
│       └── usr
│           └── local
│               └── Test
│                   └── bin
├── RPMS
│   └── x86_64
│       ├── test-1.0.0-2.x86_64.rpm
│       └── test-debuginfo-1.0.0-2.x86_64.rpm
├── SOURCES
│   ├── test-1.0.0
│   │   ├── Makefile
│   │   └── test.exe
│   └── test-1.0.0.tar.gz
├── SPECS
│   └── test.spec
└── SRPMS

安装软件包

$ sudo rpm -ivh RPMS/x86_64/test-1.0.0-2.x86_64.rpm

Preparing...                          ################################# [100%]
install start....
Updating / installing...
   1:test-1.0.0-2                     ################################# [100%]
install done

$ ls /usr/local/Test/bin/test.exe

/usr/local/Test/bin/test.exe

卸载软件包

$ sudo rpm -e test-1.0.0-2
uninstall start...
uninstall done

$ ll /usr/local/Test/bin/
total 0

资源