侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Linux系统下将源码包制作为rpm包的教程

linux  /  管理员 发布于 7年前   115

1.要使用rpmbuild 这个命令,那么要安装rpm-build, centos下可以使用yum -y intall rpm-build 来完成安装.

2.rpmbuild 包和 /usr/src/redhat目录 ,这些 rpm build 的程序是要靠 spec 文件的控制.它是配置指定安装到另外的机器上的,

用来指示转换的源码补丁编译成二进制文件的包.默认编译操作是在下面的目录中,它是编译源码的相关动作操作的位置.
如果不指定其它的地方,那么 rpm building 的地方是主要在 /usr/src/redhat 的目录,目录的架构如下,这就是为 rpm-build 提供的目录结构.

复制代码代码如下: /usr/src/redhat/
|-- BUILD
|-- RPMS
| |-- i386
| `-- ...
|-- SOURCES
| |-- foo-1.2.tar.gz
| |-- foo-1.2-add_feature.patch
| `-- foo-1.2-change_default.patch
|-- SPECS
| `-- foo.spec
`-- SRPMS
%define name foo # 名字
%define version 16 #version
Name: %{name} #name 就是使用的上面的宏指令
Version: %{version} #version 也是使用的上面的宏指令
Release: 1
License: GPL
Group: Applications/Productivity # 软件是哪个组的,更多信息查看 /usr/share/doc/rpm-version/GROUPS
URL: http://www.mysqlops.com
Source: ftp://www.mysqlops.com/pub/xxx.tar.gz
Patch0: foo-1.2-change_default.patch
Patch1: foo-1.2-add_feature.patch
PreReq: unzip # 安装前需要什么
Requires: pam # 安装后需要什么
BuildPreReq: gcc >= 2.96 #打包前需要什么
BuildRoot: %{_tmppath}/%{name}-root # 准备源码文件的 chroot 的目录
Summary: A fictional open source package for the offering. #摘要
%description #描述
注意,spec 文件很多信息都是取自宏指令,如果没有明确指定,就会继承 /usr/lib/rpm/macros 和其它相关宏指令的文件.

Spec 文件之 %prep

%prep 这部分其它是由一些参数来组成一个 shell 脚本来从 SOURCES 中解压源码和应用补丁到 BUILD 目录中来准备下面的编译.
和 %prep 相关的宏指令

复制代码代码如下: %setup
%patch

例:


复制代码代码如下: %prep
%setup -q #提取源码到 BUILD 目录; -q 指不显示输出(quietly)
%patch0 -p1 # 应用 patch0
%patch1 -p1 -b .orig # 应用 Patch1 但是存下源文件成 .oring 的后缀
unzip foo_data.zip # 接下来解压 zip 文件

Spec 文件之 %build
%build 是编译和准备软件,运行象一个 shell 脚本,它运行在上下文目录指定的源码目录.在编译过程中,调用脚本 .config 在本地的目录(%configure 中配置的).
和 %build 相关的宏
%configure # 可以通过运行 rpm -eval %configure 来看它的设置

例:


复制代码代码如下:%build
%configure –enable-shared
CFLAGS=-O2 make 

Spec 文件之 %install
%install 是用来做 rpm 安装所有需要的文件.这些打包的文件会复制到前面的讲的 BuildRoot 中的目录树中.通常这个目录是使用的 /var/tmp 中.
$RPM_BUILD_ROOT 参数来设置 BuildRoot.主要不能使用真实目录来设置的主要原因是,在编译的过程中有可能会有文件替换到你系统中的文件引起系统
和软件问题.对其它的文件路径象在 %{_mandir}, %{_bindir} , %{_sysconfdir} 等等,都是使用预先定义的宏来指定的.
默认都是跑在这个 RPM_BUILD_ROOT 目录下的.
例:

复制代码代码如下: %install
rm -rf $RPM_BUILD_ROOT # 默认的$RPM_BUILD_ROOT 是 /var/tmp/%{name}-root
make DESTDIR=$RPM_BUILD_ROOT install # 指定安装文件的路径
install -m644 foo.8 ${RPM_BUILD_ROOT}/%{_mandir}/man8/foo.8 


Spec 文件之 %clean
%clean 是用来清理 build 后的临时文件,主要是怕这些旧的文件影响以后编译.主要是要删除 $RPM_BUILD_ROOT 和运行 make clean .
例:

复制代码代码如下:%clean
rm -rf $RPM_BUILD_ROOT
make clean
Spec 文件之 Scriptlets

这些选项可以让你动态的使用 shell 脚本来控制安装和删除,
%pre,%post 是用脚本运行在包安装后,注意没法交互
%preun,%postun 用脚本运行在包删除时

复制代码代码如下:rpm -q –scripts packagename # 可以看到脚本的信息

例如:

复制代码代码如下:%pre
groupadd -g 201 foo
useradd -g foo -s /bin/false -d /var/foo -M foo
%post
/sbin/ldconfig
chkconfig --add food
%preun
if [ = 0 ]
then
service food stop > /dev/null 2>&1
chkconfig --del food
fi
%postun
if [ = 0 ]
then
userdel foo
groupdel foo
else
/sbin/ldconfig
service food condrestart > /dev/null 2>&1
fi
注意,在这个当中的数字,如果是 1 是指是第一次安装,如果是 2 是指也许是升级.如果是 0 在 %postun , 是指被完全的删除.
Spec 文件之 %files

%files 任何打包的文件,都需要在这个包的详细的文件列表中,如果是目录,包的所有者的全部目录都在中间,%dir 来指定空目录,可以用
%files -f /tmp/dyanmic_filelist 来指定一个文件列表.默认 %config 会替换掉配置,给原来的配置修改名字为 .rpmorig,
如果不想修改的话,就用%config(noreplace) 就会给新的配置文件名字命名为 .rpmnew.
%defattr(mode,user,group)
%attr(mode,user,group) filename
%config 配置文件
%doc 文档
例:

复制代码代码如下: %files
%defattr(-,root,root)
%config /etc/foo.conf # 指定了才能在更新和删除时有用
/usr/sbin/food
/usr/bin/foo
%doc README # 目录是在 /usr/share/doc/%{name}-%{version}
%doc /usr/share/man/man8/food.8
/usr/share/foo/
%dir /var/lock/foo/ # 空的目录

Spec 文件之 %changelog ;
%changelog 是记录包的修改,比如加入一个新的补丁,修改配置,日志使用 data +”%a %b %d %Y”,
需要显示包的日志改变的信息可以使用 rpm-q –changelog.例:


复制代码代码如下:%changelog
? Mon Aug 5 2002 Elvis Presley

[总结]

知道了怎么把rpm包相信大家就会知道,然后做yum 源了,做好了yum源,只需要客户端配置好使用安装源,这样是不是很方便,

如果自定义yum 源不会的,sky 改天写下吧,大概做法:centos下比较简单,安装下createrepo软件,然后再做个http服务,


  • 上一条:
    Linux lnmp下无法使用mail发邮件的两种解决方法
    下一条:
    Linux命令行中采集指定页面的图片地址及图片下载
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在Linux系统中使用Iptables实现流量转发功能流程步骤(0个评论)
    • vim学习笔记-入门级需要了解的一些快捷键(0个评论)
    • 在centos7系统中实现分区并格式化挂载一块硬盘到/data目录流程步骤(0个评论)
    • 在Linux系统种查看某一个进程所占用的内存命令(0个评论)
    • Linux中grep命令中的10种高级用法浅析(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-11
    • 2017-07
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-03
    • 2022-04
    • 2022-08
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-06
    • 2023-07
    • 2023-10
    • 2023-12
    • 2024-01
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客