用rabbitmq-server源码包制作rpm包

这里以rabbitmq-server-3.8.9版本的源码包为例,下载 rabbitmq-server-3.8.9-1.el8.src.rpm,

rpm包后缀含src字符的是包含源码的,我们可以从中获取源码包和spec文件。

[root@openEuler22 ~]# yum -y install rpm-build
[root@openEuler22 ~]# yum -y install rpmdevtools
[root@openEuler22 ~]# rpmdev-setuptree (生成rpmbuild的目录结构,默认在/root/路径下)
[root@openEuler22 ~]# tree /root/rpmbuild/
/root/rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
5 directories, 0 files

如果没有生成rpmbuild目录结构的,可以手动创建。也可以执行如下命令生成:

# rpmdev-setuptree
# rpmbuild -ba aa  (随便指定一个文件aa,可生成rpmbuild的目录结构,默认在/root/路径下)

我们继续

[root@openEuler22 ~]# cd /home/
[root@openEuler22 home]# mkdir wanghui
[root@openEuler22 wanghui]# cd /home/wanghui     #把下载的软件包放进来
[root@openEuler22 wanghui]# ls
rabbitmq-server-3.8.9-1.el8.src.rpm
[root@openEuler22 wanghui]# rpm2cpio rabbitmq-server-3.8.9-1.el8.src.rpm |cpio -idv  #这条命令可以提取源码和spec文件
[root@openEuler22 wanghui]# ls
rabbitmq-server-3.8.9-1.el8.src.rpm  rabbitmq-server.logrotate  rabbitmq-server.tmpfiles
rabbitmq-server-3.8.9.tar.xz         rabbitmq-server.service
rabbitmq-server.init                 rabbitmq-server.spec

然后把rabbitmq-server-3.8.9-1.el8.src.rpm移出去备份(后面的步骤用不上它了),把 rabbitmq-server.spec移到/root/rpmbuild/SPECS/下,剩下的全部移到/root/rpmbuild/SOURCES/下。

[root@openEuler22 wanghui]# mv rabbitmq-server.spec /root/rpmbuild/SPECS/
[root@openEuler22 wanghui]# mv ./* /root/rpmbuild/SOURCES/
[root@openEuler22 wanghui]# cd /root/rpmbuild/SPECS/
[root@openEuler22 SPECS]# vim rabbitmq-server.spec

我们查看spec文件,发现依赖elixir,erlang,rsync,socat,接下来我们yum安装即可。

[root@openEuler22 SPECS]# yum -y install erlang rsync socat
[root@openEuler22 home]# rpm -ivh elixir-1.9.0-1.oe1.x86_64.rpm (下面提供低版本下载地址了)
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:elixir-1.9.0-1.oe1               ################################# [100%]

注意:elixir包比较特别,需要低版本,所以不要yum安装它,从oepkgs去下载openEuler 20.03的低版本安装。

接下来我们开始编译rpm包:(会报错,不要怕,根据报错提示,一个个解决即可)

[root@openEuler22 home]# cd /root/rpmbuild/SPECS/
[root@openEuler22 SPECS]# rpmbuild -ba rabbitmq-server.spec

FAQ清单:

报错一:

error: Bad source: /root/rpmbuild/SOURCES/rabbitmq-server-%{upstream_version}.tar.xz: No such file or directory

解决方法:把spec文件里rabbitmq-server的版本号都改成实际版本号:

报错二:

make[2]: Leaving directory '/root/rpmbuild/BUILD/rabbitmq-server-3.8.9/deps/credentials_obfuscation'
 GEN    include/rabbit_framing.hrl
env: 'python': No such file or directory
make[2]: *** [development.post.mk:16: include/rabbit_framing.hrl] Error 127
make[1]: *** [erlang.mk:5183: app] Error 2
make[1]: Leaving directory '/root/rpmbuild/BUILD/rabbitmq-server-3.8.9/deps/rabbit_common'
make: *** [erlang.mk:4512: deps] Error 2
error: Bad exit status from /var/tmp/rpm-tmp.zdh8X1 (%build)

RPM build errors:
    Bad exit status from /var/tmp/rpm-tmp.zdh8X1 (%build)

解决方法:

[root@openEuler22 SPECS]# ln -s /usr/bin/python3 /usr/bin/python

报错三:

==> rabbitmqctl
** (Mix) You're trying to run :rabbitmqctl on Elixir v1.12.0 but it has declared in its mix.exs file it supports only Elixir >= 1.8.0 and < 1.11.0
make[2]: *** [Makefile:100: escript/rabbitmqctl] Error 1
make[2]: Leaving directory '/root/rpmbuild/BUILD/rabbitmq-server-3.8.9/deps/rabbitmq_cli'
make[1]: *** [erlang.mk:4512: deps] Error 2
make[1]: Leaving directory '/root/rpmbuild/BUILD/rabbitmq-server-3.8.9/deps/rabbit'
make: *** [erlang.mk:4512: deps] Error 2
error: Bad exit status from /var/tmp/rpm-tmp.AT4DSD (%build)

解决方法:

[root@openEuler22 SPECS]# rpm -e elixir-1.12.0-1.oe2203.x86_64
[root@openEuler22 home]# rpm -ivh elixir-1.9.0-1.oe1.x86_64.rpm 
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:elixir-1.9.0-1.oe1               ################################# [100%]
2 个赞

赞!
可以扩展说说,怎么给欧拉迁移包 :slightly_smiling_face:

赞一个!