需要软件:
系统环境:[红帽企业Linux.6.4.服务器版].rhel-server-6.4-x86_64
首先安装rpmdevtools这个工具,该工具包含rpmbuild,rpmdev-newspec,rpmdev-setuptree等工具,rpmdevtools这个工具有依赖关系需要处理,依赖于fakeroot,fakeroot又依赖于fakeroot-lib,所以安装的软件名称以及顺序为:
1、fakeroot-libs-1.12.2-22.2.el6.x86_64.rpm
2、fakeroot-1.12.2-22.2.el6.x86_64.rpm
3、rpmdevtools-7.5-2.el6.noarch.rpm
之后可以进行spec文件的生成。
关于生成rpm包的相关目录说明如下:
整个rpm制作都是在$HOME/rpmbuild目录下完成的。比如在CentOS中,rpmbuild目录下面,有BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS六个子目录。BUILD是编译rpm包的临时目录;BUILDROOT是最后生成rpm包的临时安装目录;RPMS存放最终生成的rpm二进制包;SPECS用来存放spec文件;SRPMS存放最终生成的rpm源码包。倘若这些目录不存在我们运行rpmdev-setuptree命令就会在当前用户目录下的rpmbuild目录下生成上述六个子目录。spec文件可以放到任何地方,但是自己的源码包(.tar.gz)必须放到SOURCES目录下,否则rpmbuild编译时会找不到指定的源码包。而上述的这些目录默认是在用户目录下的,即$HOME/rpmbuild,我们也可以自定义,这个路径是在/usr/lib/rpm/macros文件里面%_topdir的宏变量来定义。我们可以在自己的主目录下建立一个名为.rpmmacros的隐藏文件,然后在里面重新定义%_topdir,指向一个新的目录名。通常情况下.rpmmacros文件里一般只有一行内容,比如:
%_topdir $HOME/myrpmbuild
然后,再运行rpmdev-setuptree命令即可在/myrpmbuild生成其他子目录。
下面开始制作:
1. 将上一步最后生成的源码包拷贝到生成rpm包的目录下,如果没有rpm目录,需要手动在root目录下创建该目录,同时创建rpm目录下的6个目录:BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS。
#cp server-1.0.tar.gz /root/rpmbuild/SOURCES
2. 接下来就是最最主要的工作——编写.spec文件。有个rpmdev-newspec工具可以自动生成一个.spec 模板,然后我们再根据规则对模板进行简单修改即可。
#rpmdev-newspec –o server.spec
#gedit server.spec
Name: server
Version: 1.0
Release: 1%{?dist} #更改此处即可得到新的发布版rpm包
Summary: this is the test code
Group: System Environment/TEST
License: GPL
URL: http://www.hao123.com
Source0: %{name}-%{version}.tar.gz #要确保在SOURCES目录下能找到该包
BuildROOT: %{_topdir}/BUILDROOT
BuildRequires: gcc>= 4.7 #进行编译时候的条件,若不符合则编译失败,退出建包进程。
Requires: python rpm >=0:4.1.1 #进行安装时候,此包的依赖包。
%description
this is a test program to test by zsh
……
%files
%{_bindir} #一定要填上,否则会报错
%defattr(-,root,root,-)
%doc
…….
3. 运行rpmbuild命令。#rpmbuild –ba server.spec 即可在RPMS/i386或(若系统为64位怎显示X86_64)下得到server-1.0-1.el6.i386.rpm,在SRPMS/下面得到server-1.0-1.el6.src.rpm。RPMS/i386或(X86_64)下得到server-1.0-1.el6.i386.rpm是可执行文件。
注意:首先安装rpmdevtools这个工具,该工具包含rpmbuild,rpmdev-newspec,rpmdev-setuptree等工具;
在编写.spec文件时,注意%files下面添加%{_bindir},否则会报错“Installed(but unpackaged) file(s) found:”,针对此类问题就是在%file下按需添加内容,如:
/usr/bin/xxx=> %{_bindir}/xxx #安装后将二进制可执行文件放到/usr/bin/server
/usr/lib/xxx=> %{_libdir}/xxx #安装后将库文件放到/usr/lib/目录下
/usr/include/xxx=> %{_includedir}/xxx
/usr/share/xxx=> %{_datadir}
/xxx/usr/man/xxx=> %{_mandir}/xxx
亦可修改/usr/lib/rpm/macros文件:%_unpackaged_files_terminate_build 1,把1改为0只警告,再或者将文件中的%__check_files /usr/lib/rpm/check-files %{buildroot} 注释掉。
需要软件:httpd,createrepo 若没有安装则#yuminstall httpd createrepo
步骤:
1. 建立本地库,在/var/zsh 下面,运行createrepo命令,将自己的rpm包放到/var/zsh/i386/下面,#cp /root/rpmbuild/RPMS/i386/server-1.0-1.el6.i386.rpm/var/zsh/i386。
2. 在httpd根目录下添加自己的Yum本地库,#cp –r /var/zsh /www/html/
3. 配置yum,在/etc/yum.repos.d/下面编写zsh.repo
[zshhttp]
name=zsh
baseurl=http://127.0.0.1/zsh
gpgcheck=0
enabled=1
#yum clean all ,清空yum缓存
#yum list ,可以看到可用包:server-1.1-1.el6.src.rpm 在zshhttp源下。
4. 现在就可以对自己的包进行安装更新了。#yum install server,将server安装到/usr/bin目录下。
5. 将server.spec的Release选项改为2,生成server-1.1-2.el6.i386.rpm,拷贝到/var/www/html/zsh/i386/目录下,#createrepo–update / var/www/html/zsh/ 对http服务器上的yum源进行更新,每次有包的变动都要更新,这样客户才会知道新包的存在。#yum update server,即可对server进行更新。