环境准备
建议使用普通用户,会在用户目录下生成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制作过程
- 读取并解析 filename.spec 文件
- 运行 %prep 部分来将源代码解包到一个临时目录,并应用所有的补丁程序.
- 运行 %build 部分来编译代码.
- 运行 %install 部分将代码安装到构建机器的目录中.
- 读取 %files 部分的文件列表,收集文件并创建二进制和源 RPM 文件.
- 运行 %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
|