> CentOS > CentOS教程 >

rpmbuild制作cfengine rpm包

对cfengine进行定制,自制rpm包。

 

  • 1 安装rpm制作工具
  • 2  查看宏变量
  • 3 spec文件
  • 4 查看包信息
  • 5  参考资料

安装rpm制作工具

 

 
1
2
3
4
yum install rpm-build    #安装rpm-build
yum install rpmdevtools    #安装rpmdevtools
rpmdev-setuptree           #创建rpmbuild目录
rpmdev-newspec -o cfengine-2.2.1.spec    #创建spec模板

 

 查看宏变量

执行rpmdev-setuptree会在用户家目录创建一个隐藏文件 .rpmmacros ,该文件重定义了一些宏变量,将默认的工作目录改在了用户家目录下的rpmbuild目录。

 
1
2
3
4
5
6
[root@HADOOP-215 bin]# cat /root/.rpmmacros
%_topdir      %(echo $HOME)/rpmbuild
 
%_smp_mflags  -j3
 
%__arch_install_post   /usr/lib/rpm/check-rpaths   /usr/lib/rpm/check-buildroot

默认的工作目录

 
1
2
3
4
5
6
7
8
[root@HADOOP-215 bin]# rpm --showrc |grep topdir
-14: _builddir %{_topdir}/BUILD
-14: _buildrootdir %{_topdir}/BUILDROOT
-14: _rpmdir %{_topdir}/RPMS
-14: _sourcedir %{_topdir}/SOURCES
-14: _specdir %{_topdir}/SPECS
-14: _srcrpmdir %{_topdir}/SRPMS
-14: _topdir %(echo $HOME)/rpmbuild

默认的安装目录

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@HADOOP-215 bin]# rpm --showrc |grep _prefix
  %{-C:${_mydir}}%{!-C:.}/configure --prefix=%{_prefix} --exec-prefix=%{_exec_prefix} --bindir=%{_bindir} --sbindir=%{_sbindir} --sysconfdir=%{_sysconfdir} --datadir=%{_datadir} --includedir=%{_includedir} --libdir=%{_libdir} --libexecdir=%{_libexecdir} --localstatedir=%{_localstatedir} --sharedstatedir=%{_sharedstatedir} --mandir=%{_mandir} --infodir=%{_infodir} %* ;
-14: _bindir %{_exec_prefix}/bin
-14: _datarootdir %{_prefix}/share
-14: _exec_prefix %{_prefix}
-14: _includedir %{_prefix}/include
-14: _libdir %{_prefix}/lib64
-14: _libexecdir %{_exec_prefix}/libexec
-14: _prefix /usr        #默认安装路径
-14: _sbindir %{_exec_prefix}/sbin
--program-prefix=%{?_program_prefix} \
--prefix=%{_prefix} \
--exec-prefix=%{_exec_prefix} \
prefix=%{?buildroot:%{buildroot}}%{_prefix} \
exec_prefix=%{?buildroot:%{buildroot}}%{_exec_prefix} \

 

spec文件

由于默认的_prefix宏变量值为 /usr,制作的rpm包安装时将会安装到/usr目录下各个目录如/usr/sbin/,/usr/share。如果想将软件安装至单一的目录,需要重定义该变量。一开始尝试过直接修改make install的DESTDIR

 
1
make install DESTDIR=%{buildroot}/usr/local/cfengine

但是由于_prefix的影响,软件会安装在/usr/local/cfengine/usr 目录下。

另外configure --prefix=/usr/local/cfengine和Prefix: /usr/local/cfengine也都尝试过,均不起作用。

通过rpm --showrc |grep _prefix看到_prefix变量后,直接修改.rpmmacros,重定义_prefix,可以生效。但是每制作一个包就得重改一次,需要找一种在spec文件中重定义宏变量的方法:

宏(Macros)是使用变量和功能来控制rpm和 rpmbuild 的自定义的行为,宏指令一般地定义在 spec 文件中。语法象 %define macro value .宏指定也可以事先在配置文件中调整。
就是下面的文件。

  • 默认设置为 /usr/lib/rpm/macros or /etc/rpm/macros
  • 用户设置 ~/.rpmmacros

在打包的过程中,spec files 和 rpmbuild 能使用RPM 的宏命令中的变量.
此外,在 rpmbuild 时要不顾当前设置,可以在后面加上 –define=’macro value’ 选项,要显示当前的宏指令可以使用 rpm –eval %{macro} ,也可以rpm –showrc 来 dump 全部当前的宏指令和设置。

引自 http://blog.csdn.net/hncomputer/article/details/7049127

重定义_prefix如下

 
1
%define _prefix /usr/local/cfengine    #重定义宏变量_prefix,rpm安装时将安装至此目录

完整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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
[root@HADOOP-215 SPECS]# cat cfengine-2.2.10.spec
%define _prefix /usr/local/cfengine    #重定义宏变量_prefix,rpm安装时将安装至此目录
 
Name:           cfengine
Version:        2.2.10
Release:        1%{?dist}
Summary:        cfengine by hean
 
Group:          Applications/management
License:        GPL
URL:            http://www.cfengine.org/
Source0:        %{name}-%{version}.tar.gz
 
Packager:       hean <hean@staff.sina.com.cn>
BuildRequires:  gcc,make
Requires:       db4,openssl
 
%description
 
cfengine by hean. des
 
%prep
 
%setup -q
 
 
 
%build
 
%configure --with-berkeleydb=/usr/local/BerkeleyDB --prefix=/usr/local/cfengine
 
make %{?_smp_mflags}
 
%install
 
make install DESTDIR=%{buildroot}
mkdir -p %{buildroot}/var/cfengine/bin
mkdir -p %{buildroot}/var/cfengine/inputs
mkdir -p %{buildroot}/var/cfengine/outputs
for id in `ls %{buildroot}/usr/local/cfengine/sbin/`;do ln -s /usr/local/cfengine/sbin/$id %{buildroot}/var/cfengine/bin/$id;done
cp %{buildroot}/usr/local/cfengine/share/cfengine/update.conf.example %{buildroot}/var/cfengine/inputs/update.conf
sed -i 's/ policyhost.*/policyhost      = ( 10.7.5.10 )/g' %{buildroot}/var/cfengine/inputs/update.conf
 
%clean
 
 
 
%files
 
%defattr(-,root,root,-)
 
%doc
 
/usr/local/cfengine/lib64/libcfengine.a
/usr/local/cfengine/lib64/libcfengine.la
/usr/local/cfengine/sbin/cfagent
/usr/local/cfengine/sbin/cfdoc
/usr/local/cfengine/sbin/cfenvd
/usr/local/cfengine/sbin/cfenvgraph
/usr/local/cfengine/sbin/cfetool
/usr/local/cfengine/sbin/cfetoolgraph
/usr/local/cfengine/sbin/cfexecd
/usr/local/cfengine/sbin/cfkey
/usr/local/cfengine/sbin/cfrun
/usr/local/cfengine/sbin/cfservd
/usr/local/cfengine/sbin/cfshow
/usr/local/cfengine/share/cfengine/ChangeLog
/usr/local/cfengine/share/cfengine/INSTALL
/usr/local/cfengine/share/cfengine/NEWS
/usr/local/cfengine/share/cfengine/README
/usr/local/cfengine/share/cfengine/cf.chflags.example
/usr/local/cfengine/share/cfengine/cf.freebsd.example
/usr/local/cfengine/share/cfengine/cf.ftp.example
/usr/local/cfengine/share/cfengine/cf.groups.example
/usr/local/cfengine/share/cfengine/cf.linux.example
/usr/local/cfengine/share/cfengine/cf.main.example
/usr/local/cfengine/share/cfengine/cf.motd.example
/usr/local/cfengine/share/cfengine/cf.preconf.example
/usr/local/cfengine/share/cfengine/cf.services.example
/usr/local/cfengine/share/cfengine/cf.site.example
/usr/local/cfengine/share/cfengine/cf.solaris.example
/usr/local/cfengine/share/cfengine/cf.sun4.example
/usr/local/cfengine/share/cfengine/cf.users.example
/usr/local/cfengine/share/cfengine/cfagent.conf-advanced.example
/usr/local/cfengine/share/cfengine/cfagent.conf.example
/usr/local/cfengine/share/cfengine/cfengine.el
/usr/local/cfengine/share/cfengine/cfrc.example
/usr/local/cfengine/share/cfengine/cfrun.hosts.example
/usr/local/cfengine/share/cfengine/cfservd.conf.example
/usr/local/cfengine/share/cfengine/update.conf.example
/var/cfengine/bin/cfagent
/var/cfengine/bin/cfdoc
/var/cfengine/bin/cfenvd
/var/cfengine/bin/cfenvgraph
/var/cfengine/bin/cfetool
/var/cfengine/bin/cfetoolgraph
/var/cfengine/bin/cfexecd
/var/cfengine/bin/cfkey
/var/cfengine/bin/cfrun
/var/cfengine/bin/cfservd
/var/cfengine/bin/cfshow
/var/cfengine/inputs/update.conf
%changelog

 

查看包信息

查看制作好的rpm包信息

 
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@HADOOP-215 SPECS]# rpm -qpi ../RPMS/x86_64/cfengine-2.2.10-1.el6.x86_64.rpm
Name        : cfengine                     Relocations: (not relocatable)
Version     : 2.2.10                            Vendor: (none)
Release     : 1.el6                         Build Date: 2015年04月09日 星期四 14时15分58秒
Install Date: (not installed)               Build Host: HADOOP-215
Group       : Applications/management       Source RPM: cfengine-2.2.10-1.el6.src.rpm
Size        : 13358939                         License: GPL
Signature   : (none)
Packager    : hean <hean@staff.sina.com.cn>
URL         : http://www.cfengine.org/
Summary     : cfengine by hean
Description :
cfengine by hean. des

文件列表

 
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
[root@HADOOP-215 SPECS]# rpm -qpl ../RPMS/x86_64/cfengine-2.2.10-1.el6.x86_64.rpm
/usr/local/cfengine/lib64/libcfengine.a
/usr/local/cfengine/lib64/libcfengine.la
/usr/local/cfengine/sbin/cfagent
/usr/local/cfengine/sbin/cfdoc
/usr/local/cfengine/sbin/cfenvd
/usr/local/cfengine/sbin/cfenvgraph
/usr/local/cfengine/sbin/cfetool
/usr/local/cfengine/sbin/cfetoolgraph
/usr/local/cfengine/sbin/cfexecd
/usr/local/cfengine/sbin/cfkey
/usr/local/cfengine/sbin/cfrun
/usr/local/cfengine/sbin/cfservd
/usr/local/cfengine/sbin/cfshow
/usr/local/cfengine/share/cfengine/ChangeLog
/usr/local/cfengine/share/cfengine/INSTALL
/usr/local/cfengine/share/cfengine/NEWS
/usr/local/cfengine/share/cfengine/README
/usr/local/cfengine/share/cfengine/cf.chflags.example
/usr/local/cfengine/share/cfengine/cf.freebsd.example
/usr/local/cfengine/share/cfengine/cf.ftp.example
/usr/local/cfengine/share/cfengine/cf.groups.example
/usr/local/cfengine/share/cfengine/cf.linux.example
/usr/local/cfengine/share/cfengine/cf.main.example
/usr/local/cfengine/share/cfengine/cf.motd.example
/usr/local/cfengine/share/cfengine/cf.preconf.example
/usr/local/cfengine/share/cfengine/cf.services.example
/usr/local/cfengine/share/cfengine/cf.site.example
/usr/local/cfengine/share/cfengine/cf.solaris.example
/usr/local/cfengine/share/cfengine/cf.sun4.example
/usr/local/cfengine/share/cfengine/cf.users.example
/usr/local/cfengine/share/cfengine/cfagent.conf-advanced.example
/usr/local/cfengine/share/cfengine/cfagent.conf.example
/usr/local/cfengine/share/cfengine/cfengine.el
/usr/local/cfengine/share/cfengine/cfrc.example
/usr/local/cfengine/share/cfengine/cfrun.hosts.example
/usr/local/cfengine/share/cfengine/cfservd.conf.example
/usr/local/cfengine/share/cfengine/update.conf.example
/var/cfengine/bin/cfagent
/var/cfengine/bin/cfdoc
/var/cfengine/bin/cfenvd
/var/cfengine/bin/cfenvgraph
/var/cfengine/bin/cfetool
/var/cfengine/bin/cfetoolgraph
/var/cfengine/bin/cfexecd
/var/cfengine/bin/cfkey
/var/cfengine/bin/cfrun
/var/cfengine/bin/cfservd
/var/cfengine/bin/cfshow
/var/cfengine/inputs/update.conf

 

 参考资料

 

 
1
2
3
1. 使用rpm-build制作nginx的rpm包 http://nmshuishui.blog.51cto.com/1850554/1583117
2. 一堂课玩转rpm包的制作  http://blog.chinaunix.net/uid-23069658-id-3944462.html
3. spec文件详解 http://blog.csdn.net/hncomputer/article/details/7049127



(责任编辑:IT)