RPM build

1、rpmbuild 安装

1
2
3
4
5
6
7
yum install make
yum install gcc
yum install rpm-build
yum install rpmdevtools
rpmdev-setuptree
# 查看安装情况
rpmbuild --showrc | grep topdir

2、创建用户用于打包

1
2
3
4
5
6
7
8
9
10
11
12
13
#创建用户
useradd rpmuser
su - rpmuser

#定义工作目录(或车间)吧
vi ~/.rpmmacros
%_topdir /home/rpmuser/rpmbuild ##目录可以自定义

mkdir ~/rpmbuild

#在topdir下建立需要的目录
cd ~/rpmbuild
mkdir -pv {BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

3、整理源码

rpmbuild安装完成以后我门就需要将我们的源码放到 SOURCE 文件夹下。我门的源码可能是一个tar.gz 的包、也可能是几个文件。tar.gz源码包的名字格式应该为 helloword-1.0.0.tar.gz (其实就是名字-版本号.tar.gz)

4、编写Spec

在SPECS文件夹下新建 xxx.spec 打包脚本,将源码编译打包成rpm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
vi  xxx.spec 

Name: hellorpm #名字为源码tar.gz 包的名字
Version: 1.0.0 #版本号,一定要与tar.gz包的一致哦
Release: 1%{?dist} #释出号,也就是第几次制作rpm
Summary: helloword #软件包简介,最好不要超过50字符

License: GPL #许可,GPL还是BSD等
URL: #可以写一个网址
Packager: abel
Source0: %{name}-%{version}.tar.gz
#定义用到的source,也就是你的源码

BuildRoot: %_topdir/BUILDROOT
#这个是软件make install 的测试安装目录.

BuildRequires: gcc,make #制作过程中用到的软件包
Requires: python-apscheduler >= 2.1.2-1.el7,python-daemon >= 1.6-1.el7 #软件运行依赖的软件包,也可以指定最低版本如 bash >= 1.1.1
%description #描述,随便写
%prep #打包开始
%setup -q #这个作用静默模式解压并cd

%build #编译制作阶段,主要目的就是编译,如果不用编译就为空
./configure \\
%{?_smp_mflags} #make后面的意思是:如果就多处理器的话make时并行编译

%install #安装阶段
rm -rf %{buildroot} #先删除原来的安装的,如果你不是第一次安装的话
cp -rp %_topdir/BUILD/%{name}-%{version}/* $RPM_BUILD_ROOT
#将需要需要打包的文件从BUILD 文件夹中拷贝到BUILDROOT文件夹下。

#下面的几步pre、post、preun、postun 没必要可以不写
%pre #rpm安装前制行的脚本

%post #安装后执行的脚本

%preun #卸载前执行的脚本

%postun #卸载后执行的脚本

%clean #清理段,删除buildroot
rm -rf %{buildroot}

%files #rpm要包含的文件
%defattr (-,root,root,-) #设定默认权限,如果下面没有指定权限,则继承默认
/etc/hello/word/helloword.c #将你需要打包的文件或目录写下来

### 7.chagelog section 改变日志段
%changelog

5、打包

1
2
3
4
5
6
7
8
rpmbuild  
-ba 既生成src.rpm又生成二进制rpm
-bs 只生成src的rpm
-bb 只生二进制的rpm
-bp 执行到pre
-bc 执行到 build段
-bi 执行install段
-bl 检测有文件没包含

6、bugfix

  • rpmbuild: Empty %files file debugsourcefiles.list

解决方法:在gcc的时候添加-g选项生成debuginfo信息

https://bugzilla.redhat.com/show_bug.cgi?id=1583329

7、demo测试

创建项目

  • main.c
1
2
3
4
5
6
7
#include <stdio.h>

int main ()
{
printf("Test Main\\n");
return 0;
}
  • Makefile
1
2
3
4
5
6
# Makefile
OBJS = main.c
main: ${OBJS}
gcc -g -o main ${OBJS}
install:
install -m 755 main $(RPM_INSTALL_ROOT)/usr/local/bin/main

创建文件夹

1
2
3
mkdir ~/rpmbuild
cd ~/rpmbuild
mkdir -p BUILD SPECS RPMS SOURCES SRPMS

创建main-0.1.spec

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Summary: test rpm
Name: main
Version: 0.1
Release: 1
License: GPL
Group: NONE
Source: main-0.1.tar.gz
Url: <http://www.bencorn.com>
Packager: Lin
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root

%description
exercise: how to use rpm and rpmbuild

%prep
%setup -q

%build
make

%install
rm -rf %{buildroot}
mkdir -p %{buildroot}/usr/local/bin
make install RPM_INSTALL_ROOT=%{buildroot}

%files
/usr/local/bin/main

%changelog
* Sun Aug 1 23:13:44 EDT 2021 bencorn <1143005768@qq.com> 0.1
- build the program

执行命令

1
rpmbuild -ba main-0.1.spec

结果

结果


RPM build
https://www.bencorn.com/2022/01/22/rpm-build/
作者
Bencorn
发布于
2022年1月22日
许可协议