title: 61.制作跨平台的RPM安装包 CreateTime: 2020-09-23 00:00:00 UpdateTime: 2020-09-23 00:00:00 CategoryName: web --- --- title: "61.制作跨平台的RPM安装包" date: 2020-09-23T00:00:00+08:00 draft: false tags: ["linux"] categories: ["web"] author: "springrain" --- ## 环境准备 建议使用普通用户,会在用户目录下生成rpmbuild工作目录 ```shell #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 找到,附录一些常见的宏: ``` %{_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文件 ``` #软件包简要介绍 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 ``` ## 查看支持的平台 ```shell #查看支持编译的平台 这里查看是否有 aarch #cat /usr/lib/rpm/rpmrc |grep aarch cat /usr/lib/rpm/rpmrc ``` ## 编译rpm包 这里偷懒,直接使用了ARM平台编译后的文件,不用再编译了. https://github.com/a-schild/jave2 这个项目里有已经编译的ffmpeg版本,根据需要下载.这里是下载了[arm 64位版本](https://github.com/a-schild/jave2/tree/master/jave-nativebin-arm64/src/main/resources/ws/schild/jave/nativebin) ```shell #把文件拷贝到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 ```