Centos 6 rpmbuild

Centos 6 自定义打包 rpm

需要的工具:
1.Centos 6
2.rpm-build
3.系统普通用户

yum install rpm-build

简单的打包过程

1
2
3
4
5
6
7
8
9
10
11
$ su libanglong
$ echo "%_topdir /home/$(id -un)/rpmbuild" >~/.rpmmacros #自定义制作目录
$ mkdir -pv ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} #创建基本需要目录

# 基本需要目录可以使用一下命令获得
$ rpmbuild --showrc | grep topdir

# 编写spec文件
$ vim ~/rpmbuild/SPECS/xxxx.spec # 具体写法可以百度,后面有简单说明,后面贴上mysq的简单实例

$ rpmbuild -ba ~/rpmbuild/SPECS/xxxx.spec # 生成二进制文件和rpm包

rpmbuild 简单参数说明:
rpmbuild [args] xxx.spec
-ba 既生成 src.rpm 又生成二进制 rpm
-bs 只生成 src 的 rpm
-bb 只生二进制的 rpm
-bp 执行到 pre
-bc 执行到 build 段
-bi 执行 install 段
-bl 检测有文件没包含

可以进行简单的测试先 rpmbuild -bp ,再-bc 再-bi 如果没问题再执行 -ba

演示:

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
104
105
106
107
### %define mysql_user mysql
#名字为tar包的名字
Name: mysql
#版本号,一定要与tar包的一致哦
Version: 5.6.23
#释出号,也就是第几次制作rpm
Release: 1%{?dist}
#软件包简介,最好不要超过50字符
Summary: mysql 5.6.23 rpm

#组名,可以通过less /usr/share/doc/rpm-4.8.0/GROUPS 选择合适组
Group: System Environment/Daemons
#许可,GPL还是BSD等
License: GPLv2
#可以写一个网址
URL: https://github.com/ccbang/
Packager: ccbang
Vendor: domain.com
Source0: %{name}-%{version}.tar.gz

# 这里特殊,取消不必要的依赖例如安装时会报错perl(lib:mtr_xxx)
Autoreq: no

#如果需要补丁,依次写
#patch0: a.patch
BuildRoot: %_topdir/BUILDROOT

#制作过程中用到的软件包
BuildRequires: gcc

#软件运行需要的软件包,也可以指定最低版本如 bash >= 1.1.1
Requires: openssl,libunwind,libunwind-devel,gperftools,gperftools-libs,gperftools-devel

#软件包描述,尽情的写吧
%description
It is a mysql 5.6 for txitech.com #描述内容


### 2.The Prep section 准备阶段,主要目的解压source并cd进去

#这个宏开始
%prep
#这个宏的作用静默模式解压并cd
%setup -q
#%%patch0 -p1 #如果需要在这打补丁,依次写


### 3.The Build Section 编译制作阶段,主要目的就是编译
%build
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DWITH_SSL=yes \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=utf8,gbk,gb2132 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_DEBUG=0 \
-DENABLE_DOWNLOADS=1

#make后面的意思是:如果就多处理器的话make时并行编译
make %{?_smp_mflags}



### 4.Install section 安装阶段
%install

#先删除原来的安装的,如果你不是第一次安装的话
rm -rf %{buildroot}

#DESTDIR指定安装的目录,而不是真实的安装目录
#INSTALL_ROOT也是指安装目录。例如php
make install DESTDIR=%{buildroot}

# %%pre #rpm安装前制行的脚本或者命令

# %%post #安装后执行的脚本

# %%preun #卸载前执行的脚本

# %%postun #卸载后执行的脚本


### 5.clean section 清理段,删除buildroot

%clean
rm -rf %{buildroot}


### 6.file section rpm包需要打包的文件
%files
#设定默认权限,如果下面没有指定权限,则继承默认
%defattr (-,root,root,0755)
#/etc/ #下面的内容要根据你在%{rootbuild}下生成的来写
/usr/
#/var/



### 7.chagelog section 改变日志段
%changelog
* Fri Dec 29 2012 mysql 5.6.23 ccbang create
- Initial version

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
Summary:        rpm的内容概要
Name: rpm的名称,后面可使用%{name}的方式引用
Version: rpm的实际版本号,例如:1.2.5等,后面可使用%{version}引用
Release: 发布序列号,例如:1等,标明第几次打包,后面可使用%{release}引用
License: 软件授权方式,通常就是GPL
Group: 软件分组
Source: 源代码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用
Build Arch: 指编译的目标处理器架构,noarch标识不指定,但通常都是以/usr/lib/rpm/marcros中的内容为默认值
BuildRoot: 这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:
%{_tmppath}/%{name}-%{version}-%{release}-root
或%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n}
该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。
后面可使用$RPM_BUILD_ROOT 方式引用。
URL: 软件的主页
Packager: 打包者的信息
Requires: 该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:
libpng-devel >= 1.0.20
">="号两边需用空格隔开,而不同软件名称也用空格分开


%description 软件的详细说明
%prep 预处理脚本
%setup 通常是从/usr/src/redhat/SOURCES里的包解压到/usr/src/redhat/BUILD/%{name}-%{version}中。
一般用%setup -c就可以了,但有两种情况:一就是同时编译多个源码包,二就是源码的tar包的名称与解压出来的目录不一致,此时,就需要使用-n参数指定一下了。
%build 开始构建包,在/usr/src/redhat/BUILD目录中
%install 开始把软件安装到虚拟的根目录中,这个很重要,因为如果这里的路径不对的话,则下面%files中寻找文件的时候就会失败。
可以使用:make DESTDIR=$RPM_BUILD_ROOT install
或者使用常规的系统命令 cp -rf filename $RPM_BUILD_ROOT/
%clean 清理临时文件,注意区分$RPM_BUILD_ROOT和$RPM_BUILD_DIR:
$RPM_BUILD_ROOT是指开头定义的BuildRoot,而$RPM_BUILD_DIR通常就是指/usr/src/redhat/BUILD,其中,前面的才是%files需要的。
%pre rpm安装前执行的脚本
%post rpm安装后执行的脚本
%preun rpm卸载前执行的脚本
%postun rpm卸载后执行的脚本
%preun %postun 的区别是前者在升级rpm包的时候会执行,后者在升级rpm包的时候不会执行
%files 定义那些文件或目录会放入rpm中,下面的路径不是系统的绝对路径而是$RPM_BUILD_ROOT下的路径
%defattr 指定安装rpm包后的文件属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755