资料
实践
1
2
3
4
5
6
7
8
9
10
| # 新建一个docker实例,来测试、学习
[root@cu1 ~]# docker run -ti centos:centos6 /bin/bash
[root@bdc25400cc63 mywget]# cat /etc/redhat-release
CentOS release 6.6 (Final)
# 安装编译环境所需的软件
yum install which tree lrzsz tar gcc rpm-build
# wget编译的依赖
yum install -y gnutls gnutls-devel
|
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
| [root@bdc25400cc63 home]# mkdir mywget
[root@bdc25400cc63 home]# cd mywget/
[root@bdc25400cc63 mywget]# mkdir BUILD RPMS SOURCES SPECS SRPMS
[root@bdc25400cc63 mywget]# cd SOURCES/
[root@bdc25400cc63 SOURCES]# mv /home/wget-1.17.tar.gz .
[root@bdc25400cc63 SOURCES]# ls
wget-1.17.tar.gz
[root@bdc25400cc63 SOURCES]# cd ..
[root@bdc25400cc63 mywget]# rpmbuild --showrc
[test@bdc25400cc63 mywget]$ rpm --eval "%{_topdir}"
[test@bdc25400cc63 mywget]$ grep -i _topdir /usr/lib/rpm/rpmrc /usr/lib/rpm/redhat/rpmrc /usr/lib/rpm/macros /usr/lib/rpm/redhat/macros | less
/usr/lib/rpm/macros:%_builddir %{_topdir}/BUILD
/usr/lib/rpm/macros:%_rpmdir %{_topdir}/RPMS
/usr/lib/rpm/macros:%_sourcedir %{_topdir}/SOURCES
/usr/lib/rpm/macros:%_specdir %{_topdir}/SPECS
/usr/lib/rpm/macros:%_srcrpmdir %{_topdir}/SRPMS
/usr/lib/rpm/macros:%_buildrootdir %{_topdir}/BUILDROOT
/usr/lib/rpm/macros:%_topdir %{getenv:HOME}/rpmbuild
[test@bdc25400cc63 mywget]$ cat ~/.rpmmacros
%_topdir /home/mywget/rpm
# 2016-5-12 15:28:35
# spec里面有define和global,应该是这个导致的!用global应该即可以了?
[root@bdc25400cc63 mywget]# vi SPECS/wget.spec
# this is a sample spec file for wget
%define _topdir /home/mywget
%define name wget
%define release 2
%define version 1.17
# 定义 _buildrootdir 不起作用,不知道为啥??? 在 .rpmmacros 定义了 %_topdir,root转到 /home/mywget/rpm/BUILDROOT 了。
%define _unpackaged_files_terminate_build 0
Summary: GNU wget
License: GPL
Name: %{name}
Version: %{version}
Release: %{release}
Source: %{name}-%{version}.tar.gz
Prefix: /usr/local/wget
Group: Development/Tools
%description
The GNU wget program downloads files from the Internet using the command-line.
%prep
%setup -q
%build
./configure
make
%install
make install prefix=$RPM_BUILD_ROOT/usr/local/wget # or use DESTDIR=$RPM_BUILD_ROOT
%post
echo "hello world"
%preun
echo "bye"
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-, root, root)
/usr/local/wget/bin/wget
[root@bdc25400cc63 mywget]# rpmbuild -vv -bb --clean SPECS/wget.spec
[root@bdc25400cc63 mywget]# tree .
.
├── BUILD
├── RPMS
│ └── x86_64
│ ├── wget-1.17-2.x86_64.rpm
│ └── wget-debuginfo-1.17-2.x86_64.rpm
├── SOURCES
│ └── wget-1.17.tar.gz
├── SPECS
│ └── wget.spec
└── SRPMS
6 directories, 4 files
[root@bdc25400cc63 mywget]# rpm -qpl RPMS/x86_64/wget-1.17-2.x86_64.rpm
/usr/local/wget/bin/wget
|
接下来就可以直接拿到这个包到其他机器上安装了,如果自己建立了本地库,使用createrepo更新下,就可以使用yum安装最新打的包了。
注: %pre , %post 和 %preun , %postun 可以在安装前后执行一些脚本。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| [root@cu2 ganglia-build]# mkdir BUILD RPMS SOURCES SPECS SRPMS
[root@cu2 ganglia-build]# cd SOURCES/
[root@cu2 SOURCES]# ll
total 1272
-rw-r--r-- 1 root root 1302320 Jan 20 09:35 ganglia-3.7.2.tar.gz
[root@cu2 SOURCES]# cd ..
[root@cu2 ganglia-build]# ll
total 20
drwxr-xr-x 2 root root 4096 Jun 15 10:25 BUILD
drwxr-xr-x 2 root root 4096 Jun 15 10:25 RPMS
drwxr-xr-x 2 root root 4096 Jun 15 10:25 SOURCES
drwxr-xr-x 2 root root 4096 Jun 15 10:25 SPECS
drwxr-xr-x 2 root root 4096 Jun 15 10:25 SRPMS
[root@cu2 ganglia-build]# cd SPECS/
[root@cu2 SPECS]# vi gmetad.spec
[root@cu2 ganglia-build]# rpmbuild --clean -v -ba SPECS/gmetad.spec
[root@cu2 ganglia-build]# rpm -qpl RPMS/x86_64/ganglia-3.7.2-1.el6.x86_64.rpm
|
重新打包已有rpm
下载源码包,再修改内容,最后使用rpm-build重新打包。
这里以puppetserver为例,使用jdk7即可但官网打包的依赖是jdk8,这里修改依赖然后重新打包:
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
| [root@cu2 rpmbuild]# rpm -ivh puppetserver-2.3.1-1.el6.src.rpm
warning: puppetserver-2.3.1-1.el6.src.rpm: Header V4 RSA/SHA1 Signature, key ID 4bd6ec30: NOKEY
1:puppetserver warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
########################################### [100%]
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
[root@cu2 rpmbuild]# ll
total 32904
-rw-r--r-- 1 root root 33681889 May 10 17:44 puppetserver-2.3.1-1.el6.src.rpm
drwxr-xr-x 2 root root 4096 May 10 17:55 SOURCES
drwxr-xr-x 2 root root 4096 May 10 17:55 SPECS
#-- 注释掉jdk8的部分
[root@cu2 rpmbuild]# grep -3 jdk SPECS/puppetserver.spec
# java 1.8.0 is available starting in fedora 20 and el 6
#%if 0%{?fedora} >= 20 || 0%{?rhel} >= 6
#%global open_jdk java-1.8.0-openjdk-headless
#%else
%global open_jdk java-1.7.0-openjdk
#%endif
[root@cu2 rpmbuild]# yum install -y ruby
[root@cu2 rpmbuild]# rpmbuild -v -bb --clean SPECS/puppetserver.spec
[root@cu2 rpmbuild]# yum deplist RPMS/noarch/puppetserver-2.3.1-1.el6.noarch.rpm
Loaded plugins: fastestmirror, priorities
Finding dependencies:
Loading mirror speeds from cached hostfile
* base: centos.ustc.edu.cn
* centosplus: centos.ustc.edu.cn
* epel: mirror01.idc.hinet.net
* extras: centos.ustc.edu.cn
* updates: centos.ustc.edu.cn
193 packages excluded due to repository priority protections
package: puppetserver.noarch 2.3.1-1.el6
dependency: chkconfig
provider: chkconfig.x86_64 1.3.49.3-5.el6
provider: chkconfig.x86_64 1.3.49.3-5.el6_7.2
dependency: /bin/bash
provider: bash.x86_64 4.1.2-33.el6
provider: bash.x86_64 4.1.2-33.el6_7.1
dependency: java-1.7.0-openjdk
provider: java-1.7.0-openjdk.x86_64 1:1.7.0.79-2.5.5.4.el6
provider: java-1.7.0-openjdk.x86_64 1:1.7.0.101-2.6.6.1.el6_7
provider: java-1.7.0-openjdk.x86_64 1:1.7.0.85-2.6.1.3.el6_6
provider: java-1.7.0-openjdk.x86_64 1:1.7.0.85-2.6.1.3.el6_7
provider: java-1.7.0-openjdk.x86_64 1:1.7.0.91-2.6.2.2.el6_7
provider: java-1.7.0-openjdk.x86_64 1:1.7.0.95-2.6.4.0.el6_7
provider: java-1.7.0-openjdk.x86_64 1:1.7.0.99-2.6.5.0.el6_7
dependency: puppet-agent >= 1.4.0
provider: puppet-agent.x86_64 1.4.1-1.el6
dependency: net-tools
provider: net-tools.x86_64 1.60-110.el6_2
dependency: /usr/bin/env
provider: coreutils.x86_64 8.4-37.el6
provider: coreutils.x86_64 8.4-37.el6_7.3
dependency: /bin/sh
provider: bash.x86_64 4.1.2-33.el6
provider: bash.x86_64 4.1.2-33.el6_7.1
dependency: config(puppetserver) = 2.3.1-1.el6
provider: puppetserver.noarch 2.3.1-1.el6
|
如果仅仅是换个环境不改spec的话,直接用 rpmbuild –rebuild XXX.src.rpm 就可以了。
–END