这里以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%]