RPM包rpmbuild SPEC文件深度说明(2)

%install 开始把软件安装到虚拟的根目录中
在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make install的操作。这个很重要,因为如果这里的路径不对的话,则下面%file中寻找文件的时候就会失败。 常见内容有:
%makeinstall 这不是关键字,而是rpm定义的标准宏命令。也可以使用非标准写法:
引用make DESTDIR=$RPM_BUILD_ROOT install

引用make prefix=$RPM_BUILD_ROOT install
需要说明的是,这里的%install主要就是为了后面的%file服务的。所以,还可以使用常规的系统命令:
引用install -d $RPM_BUILD_ROOT/
cp -a * $RPM_BUILD_ROOT/
%clean 清理临时文件
通常内容为:
引用[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"
rm -rf $RPM_BUILD_DIR/%{name}-%{version}
※注意区分$RPM_BUILD_ROOT和$RPM_BUILD_DIR:
$RPM_BUILD_ROOT是指开头定义的BuildRoot,而$RPM_BUILD_DIR通常就是指/usr/src/asianux/BUILD,其中,前面的才是%file需要的。

%pre rpm安装前执行的脚本

%post rpm安装后执行的脚本

%preun rpm卸载前执行的脚本

%postun rpm卸载后执行的脚本

%files 定义那些文件或目录会放入rpm中
这里会在虚拟根目录下进行,千万不要写绝对路径,而应用宏或变量表示相对路径。 如果描述为目录,表示目录中除%exclude外的所有文件。
%defattr (-,root,root) 指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755

%exclude 列出不想打包到rpm中的文件
※小心,如果%exclude指定的文件不存在,也会出错的。
%changelog 变更日志四、范例
下面的.spec脚本是一个比较简单的范例,其作用是把一个目录中的所有文件都打包为一个rpm包。
1、前期工作
我们假设需要打包的目录就是我们的源码文件。这样,可以暂时忽略比较麻烦的打补丁、编译等问题,而且也是一种常见的方式。 在编写.spec脚本前,需要准备好“源码”,也就是目录,内容比较简单:引用[root@mail html]# ll
total 4
drwxr-xr-x 3 root root 4096 Jun 4 14:45 demo
[root@mail html]# ll demo/
total 4
drwxr-xr-x 3 root root 4096 Jun 4 14:45 images
-rw-r--r-- 1 root root 0 Jun 4 14:45 index.html
因为rpm只认tar.gz格式,所以,必须打包好并移动到SOURCES目录中:引用[root@mail html]# tar czvf demo.tar.gz demo/
demo/
demo/images/
demo/images/logo.gif/
demo/index.html
[root@mail html]# mv demo.tar.gz /usr/src/asianux/SOURCES/
2、demo.spec的内容
准备工作完成,下面就是范例用的脚本内容:[root@mail html]# cd /usr/src/asianux/SPECS/
[root@mail SPECS]# cat demo.spec 引用Summary: Test package for linuxidc webblog
Name: suite
Version: 1.0.0
Release: 1
License: GPL
Group: System
Source: demo.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
Url:
Packager: Linuxing
Prefix: %{_prefix}
Prefix: %{_sysconfdir}
%define userpath /var/www/html/demo

%description
Just a test rpm suite.

%prep
%setup -c
%install
install -d $RPM_BUILD_ROOT%{userpath}
cp -a %{name}* $RPM_BUILD_ROOT%{userpath}

%clean
rm -rf $RPM_BUILD_ROOT
rm -rf $RPM_BUILD_DIR/%{name}-%{version}

%files
%defattr(-,root,root)
%{userpath}
下载: 下载文件点击这里下载文件
※特别需要注意的是:%install部分使用的是绝对路径,而%file部分使用则是相对路径,虽然其描述的是同一个地方。千万不要写错。 五、其他
1、扩展
虽然上面的范例很简陋,而且缺少%build部分,但实际上只要记住两点:
a)就是%build和%install的过程中,都必须把编译和安装的文件定义到“虚拟根目录” 中。
引用%build
make -f admin/Makefile.common cvs
./configure --prefix=%{_prefix} --enable-final --disable-debug \
--with-extra-includes=%{_includedir}/freetype2 --includedir=%{_includedir}
make
%install
rm -fr $RPM_BUILD_ROOT
make DESTDIR=$RPM_BUILD_ROOT install
cp -r $RPM_BUILD_ROOT%{_datadir}/apps/kolourpaint/icons/hicolor/* $RPM_BUILD_ROOT%{_datadir}/icons/crystalsvg/
b)就是%file中必须明白,用的是相对目录


引用%files
%defattr(-,root,root)
%{_bindir}
%{_libdir}
%{_datadir}
%exclude %{_libdir}/debug
如果把


引用%files
%defattr(-,root,root)
%{_bindir}
写成


引用%files
%defattr(-,root,root)
/usr/bin
则打包的会是根目录下的/usr/bin中所有的文件。
2、一些rpm相关信息
rpm软件包系统的标准分组:/usr/share/doc/rpm-4.3.3/GROUPS
各种宏定义: /usr/lib/rpm/macros
已经安装的rpm包数据库: /var/lib/rpm
如果要避免生成debuginfo包:这个是默认会生成的rpm包。则可以使用下面的命令:


echo '%debug_package %{nil}' >> ~/.rpmmacros
如果rpm包已经做好,但在安装的时候想修改默认路径,则可以:


rpm -ivh --prefix=/opt/usr xxx.rpm
又或者同时修改多个路径:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/18658.html