8

linux下源码包制作成rpm包教程

 4 years ago
source link: https://blogread.cn/it/article/4975?f=hot1
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

linux下源码包制作成rpm包教程

浏览:1798次  出处信息

[导读]

在puppet cookbook系列文档中,sky就不至一次的提到过使用puppet 来管理软件包,而大多数

同学都会问,那我下载的.tar.gz的压缩包怎么办呢?那如何使用puppet来管理呢?关于源码包的

安装,之前有篇文章已经介绍了从源码包构建包,sky还是会建议大家把源码包制作成rpm包,

放进yum仓库,再使用puppet来管理,这样会方便许多,做运维的,你懂的.

[正文]

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服务,

就可以了.本篇文章大部分网上大多数都有的,大家可以实际测试下,如不清楚再问下吧.
推荐阅读:SPEC文件深度说明:

觉得文章有用?立即:

和朋友一起 共学习 共进步!

建议继续学习:

QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK