环境准备

建议使用普通用户,会在用户目录下生成rpmbuild工作目录

1
2
3
4
5
#1. 安装rpmbuild
yum -y install rpm-build rpmdevtools
   
#2. 在用户目录下生成rpmbuild工作目录
rpmdev-setuptree

目录说明

在用户的目录下,例如 /root/rpmbuild

目录 说明 macros宏名
BUILD 编译之前,如解压包后存放的目录 %{_builddir}
RPMS 最终制作好的二进制包 %{_rpmdir}
SOURCES 所有源代码和补丁文件 %{_sourcedir}
SPECS 存放SPEC文件(重要) %{_specdir}
SPRMS 生成的二进制源码包 %{_srcrpmdir}

所有宏都可以在 /usr/lib/rpm/macros 找到,附录一些常见的宏:

 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
%{_sysconfdir}        /etc
%{_prefix}            /usr
%{_exec_prefix}       %{_prefix}
%{_bindir}            %{_exec_prefix}/bin
%{_lib}               lib (lib64 on 64bit systems)
%{_libdir}            %{_exec_prefix}/%{_lib}
%{_libexecdir}        %{_exec_prefix}/libexec
%{_sbindir}           %{_exec_prefix}/sbin
%{_sharedstatedir}    /var/lib
%{_datadir}           %{_prefix}/share
%{_includedir}        %{_prefix}/include
%{_oldincludedir}     /usr/include
%{_infodir}           /usr/share/info
%{_mandir}            /usr/share/man
%{_localstatedir}     /var
%{_initddir}          %{_sysconfdir}/rc.d/init.d 
%{_topdir}            %{getenv:HOME}/rpmbuild
%{_builddir}          %{_topdir}/BUILD
%{_rpmdir}            %{_topdir}/RPMS
%{_sourcedir}         %{_topdir}/SOURCES
%{_specdir}           %{_topdir}/SPECS
%{_srcrpmdir}         %{_topdir}/SRPMS
%{_buildrootdir}      %{_topdir}/BUILDROOT
%{_var}               /var
%{_tmppath}           %{_var}/tmp
%{_usr}               /usr
%{_usrsrc}            %{_usr}/src
%{_docdir}            %{_datadir}/doc
%{buildroot}          %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
$RPM_BUILD_ROOT       %{buildroot}

rpm制作过程

  1. 读取并解析 filename.spec 文件
  2. 运行 %prep 部分来将源代码解包到一个临时目录,并应用所有的补丁程序.
  3. 运行 %build 部分来编译代码.
  4. 运行 %install 部分将代码安装到构建机器的目录中.
  5. 读取 %files 部分的文件列表,收集文件并创建二进制和源 RPM 文件.
  6. 运行 %clean 部分来除去临时构建目录.

编写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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#软件包简要介绍
Summary: ffmpeg arm 64

#软件包的名字
Name: ffmpeg

#软件包的主版本号
Version: 4.3

#软件包的次版本号
Release: 1.el7

#软件网址
URL: https://ffmpeg.org

#打包人
Packager: springrain

#软件包所属类别
Group: Applications/System

#install使用的虚拟目录,安装后就在该目录下打包
BuildRoot: %_topdir/BUILDROOT


## 通过 --target aarch64 指定,不使用此参数.
## CPU架构平台.noarch表示该软件与体系结构无关
#BuildArch: noarch

#授权协议
License: LGPL/GPL

#软件包的内容介绍
%description
ffmpeg

#表示预操作字段,后面的命令将在源码代码BUILD前执行
#%prep
#echo "prep"

#BUILD字段,将通过直接调用源码目录中自动构建工具完成源码编译操作  
#%build
#echo "build"


#安装
%install
echo "install"

#创建/usr/local/ffmpeg/bin/目录
mkdir -p %{buildroot}/usr/local/ffmpeg/bin/

#把SOURCES下的ffmpeg文件复制到/usr/local/ffmpeg/bin/目录下
cp -rf %{_sourcedir}/ffmpeg %{buildroot}/usr/local/ffmpeg/bin/


#文件说明字段,声明多余或者缺少都将可能出错
%files
#声明/usr/local/ffmpeg将出现在软件包中
/usr/local/ffmpeg/bin/ffmpeg

查看支持的平台

1
2
3
#查看支持编译的平台  这里查看是否有 aarch
#cat /usr/lib/rpm/rpmrc |grep aarch
cat /usr/lib/rpm/rpmrc

编译rpm包

这里偷懒,直接使用了ARM平台编译后的文件,不用再编译了.
https://github.com/a-schild/jave2 这个项目里有已经编译的ffmpeg版本,根据需要下载.这里是下载了arm 64位版本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#把文件拷贝到rpmbuild源码目录,或者在spec文件中wget下载源码.
cp -rf /root/ffmpeg /root/rpmbuild/SOURCES/

#把ffmpeg.spec文件拷贝到SPEC目录
cp -rf /root/ffmpeg.spec /root/rpmbuild/SEPCS/

#进入rpmbuild目录
cd /root/rpmbuild


#编译rpm包,会生成到 RPMS目录下
# -bb 只编译二进制包,-bs 只编译源码包,-ba 二进制包和源码包都编译
#默认当前的编译环境 x86_64,cat /usr/lib/rpm/rpmrc查看支持的平台
rpmbuild -bb  ./SPECS/ffmpeg.spec
# --target 指定运行的平台,这里指定ARM的aarch64
rpmbuild -bb --target aarch64 ./SPECS/ffmpeg.spec