- 论坛徽章:
- 0
|
本帖最后由 duanjigang 于 2012-12-17 10:26 编辑
wget 源码包制作rpm
首先下载wget 的源码包wget-1.14.tar.gz,然后在个人目录下建立 RPM 的工作目录:
- /home/jigang.djg/lessons/rpmbuild_dir
复制代码 然后建立对应的几个目录:
- $mkdir BUILD RPMS SOURCES SPECS SRPMS
- $ls /home/jigang.djg/lessons/rpmbuild_dir
- BUILD RPMS SOURCES SPECS SRPMS
复制代码 把源码挪到 SOURCES目录下.
然后编写 wget.spec 文件。
参考
http://www.ibm.com/developerworks/library/l-rpm1/
这里的例子,编写的 spec 文件内容如下:
SPECS/wget.spec
- # This is a sample spec file for wget
- %define _topdir /home/jigang.djg/lessons/rpmbuild_dir
- %define name wget
- %define release 1
- %define version 1.14
- %define buildroot %{_topdir}/%{name}-%{version}-root
- BuildRoot: %{buildroot}
- Summary: GNU wget
- License: GPL
- Name: %{name}
- Version: %{version}
- Release: %{release}
- Source: %{name}-%{version}.tar.gz
- Prefix: /usr
- 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
- %files
- %defattr(-,root,root)
- #这也是wget默认的安装目录
- /usr/bin/wget
- #文档的安装路径也要根据wget的默认路径写,否则可能出错,如果你不自己写 --prefix=xx的话
- #如果有报错的话,就根据wget-1.14-root里面的列表进行spec文件校准
- %doc %attr(0444,root,root) /usr/share/man/man1/wget.1.gz
复制代码 然后进行rpm的编译:
- rpmbuild -v -bb SPECS/wget.spec
复制代码 并没有完美的生成rpm,而是报了一堆错误。
部分信息如下:
- error: Installed (but unpackaged) file(s) found:
- /usr/etc/wgetrc
- /usr/share/info/wget.info.gz
- /usr/share/locale/be/LC_MESSAGES/wget.mo
- /usr/share/locale/bg/LC_MESSAGES/wget.mo
复制代码 根据提示,分析下出错的原因。
因为在用 wget 的源码编译安装时 make install 会把很多文件(wget-1.14-root下面的所有文件)都安装到目标目录,而我们在 $install 段写的脚本也正好是是 make install(或者你可以逐行的写 install 安装单个文件)。但是在%file 段却没有把所有 make install 到 wget-1.14-root 下的文件都写出来,因此 rpmbuild 在封装包时会报错,他提示我们: “找到了install 却没有 packaged 的文件”,这个提示是正确的。
解决这个问题有以下三个方法:
其一: 也是最简单的做法,就是把 “installed but unpackaged” 的文件补充到spec 文件的 files 列表当中去。
其二: 从常理思考,虽然build出了一大堆文件,但是只把一部分封装到rpm文件中,这个做法应该是可以接受的,因为某些时候,我们就只需要一部分重要的文件,别的man文件或许暂时不需要。然后该怎么做呢?人性化的配置是好的软件不和缺少的,rpm 当然自带了这个参数的配置项。
在文件:
/usr/lib/rpm/macros
中有一个配置项:
- # Should unpackaged files in a build root terminate a build?
- #
- # Note: The default value should be 0 for legacy compatibility.
- %_unpackaged_files_terminate_build 1
复制代码 从字面意思应该能看懂,“是否应该在build root 目录发现未封装进包的文件时终止编译?”
系统默认这个值为 1,因此我们的编译会被终止。
然后将它改为0,再次 build,发现还是报错?
原因又何在呢?
查看帮助手册能够看到 rpmbuild 使用的宏定义文件的路径:
- /usr/lib/rpm/macros
- /usr/lib/rpm/redhat/macros
- /etc/rpm/macros
- ~/.rpmmacros
复制代码 而且生效顺序是从上往下的,这时可以理解,我们在 /usr/lib/rpm/macros 文件中把
%_unpackaged_files_terminate_build 1
改为 %_unpackaged_files_terminate_build 0
后,在 /usr/lib/rpm/redhat/macros 文件中它还是 1,因为这个值被覆盖了。
为了能够生效,可以把这个配置写到或者文件中,在此,我们写进 /etc/rpm/macros 文件中。
- echo "%_unpackaged_files_terminate_build 0" >> /etc/rpm/macros
复制代码 再次编译,果然通过,输出了 rpm 文件
- Wrote: /home/jigang.djg/lessons/rpmbuild_dir/RPMS/i386/wget-1.14-1.i386.rpm
- Wrote: /home/jigang.djg/lessons/rpmbuild_dir/RPMS/i386/wget-debuginfo-1.14-1.i386.rpm
复制代码 然后我们看下rpm的信息:
- rpm -qpl RPMS/i386/wget-1.14-1.i386.rpm
- /usr/bin/wget
- /usr/share/man/man1/wget.1.gz
复制代码 能够看到,不纳入到 %files 中的文件确实是 installed but unpackaged 了,呵呵.
其三:就是把不想封装进包的文件从build输出的目录删掉。
http://blog.163.com/hui_san/blog/static/5710286720125272350508/
这里有个例子,如是说:
- make install后删除这些文件:
- rm -rf %{buildroot}
- make INSTALL_ROOT=%{buildroot} install
- rm -rf %{buildroot}/.channels/.alias/pear.txt %{buildroot}/.channels/.alias/pecl.txt %{buildroot}/.channels/__uri.reg %{buildroot}/.channels/pear.php.net.reg %{buildroot}/.channels/pecl.php.net.reg %{buildroot}/.depdb %{buildroot}/.depdblock %{buildroot}/.filemap %{buildroot}/.lock
复制代码 可以借鉴上面的做法。
不过个人还是不建议这样做,最合适的做法就是把缺少的文件补充进去。
把 installed but unpackaged 的文件添加进spec 后,spec 文件如下:
- # This is a sample spec file for wget
- %define _topdir /home/jigang.djg/lessons/rpmbuild_dir
- %define name wget
- %define release 1
- %define version 1.14
- %define buildroot %{_topdir}/%{name}-%{version}-root
- BuildRoot: %{buildroot}
- Summary: GNU wget
- License: GPL
- Name: %{name}
- Version: %{version}
- Release: %{release}
- Source: %{name}-%{version}.tar.gz
- Prefix: /usr
- Group: Development/Tools
- %description
- The GNU wget program downloads files from the Internet using the command-line.
- %prep
- %setup -q
- %build
- ./configure --with-ssl=openssl
- make
- %install
- make install prefix=$RPM_BUILD_ROOT/usr
- %files
- %defattr(-,root,root)
- /usr/bin/wget
- /usr/etc/wgetrc
- /usr/share/info/wget.info.gz
- /usr/share/locale/be/LC_MESSAGES/wget.mo
- /usr/share/locale/bg/LC_MESSAGES/wget.mo
- /usr/share/locale/ca/LC_MESSAGES/wget.mo
- /usr/share/locale/cs/LC_MESSAGES/wget.mo
- /usr/share/locale/da/LC_MESSAGES/wget.mo
- /usr/share/locale/de/LC_MESSAGES/wget.mo
- /usr/share/locale/el/LC_MESSAGES/wget.mo
- /usr/share/locale/en_GB/LC_MESSAGES/wget.mo
- /usr/share/locale/eo/LC_MESSAGES/wget.mo
- /usr/share/locale/es/LC_MESSAGES/wget.mo
- /usr/share/locale/et/LC_MESSAGES/wget.mo
- /usr/share/locale/eu/LC_MESSAGES/wget.mo
- /usr/share/locale/fi/LC_MESSAGES/wget.mo
- /usr/share/locale/fr/LC_MESSAGES/wget.mo
- /usr/share/locale/ga/LC_MESSAGES/wget.mo
- /usr/share/locale/gl/LC_MESSAGES/wget.mo
- /usr/share/locale/he/LC_MESSAGES/wget.mo
- /usr/share/locale/hr/LC_MESSAGES/wget.mo
- /usr/share/locale/hu/LC_MESSAGES/wget.mo
- /usr/share/locale/id/LC_MESSAGES/wget.mo
- /usr/share/locale/it/LC_MESSAGES/wget.mo
- /usr/share/locale/ja/LC_MESSAGES/wget.mo
- /usr/share/locale/lt/LC_MESSAGES/wget.mo
- /usr/share/locale/nb/LC_MESSAGES/wget.mo
- /usr/share/locale/nl/LC_MESSAGES/wget.mo
- /usr/share/locale/pl/LC_MESSAGES/wget.mo
- /usr/share/locale/pt/LC_MESSAGES/wget.mo
- /usr/share/locale/pt_BR/LC_MESSAGES/wget.mo
- /usr/share/locale/ro/LC_MESSAGES/wget.mo
- /usr/share/locale/ru/LC_MESSAGES/wget.mo
- /usr/share/locale/sk/LC_MESSAGES/wget.mo
- /usr/share/locale/sl/LC_MESSAGES/wget.mo
- /usr/share/locale/sr/LC_MESSAGES/wget.mo
- /usr/share/locale/sv/LC_MESSAGES/wget.mo
- /usr/share/locale/tr/LC_MESSAGES/wget.mo
- /usr/share/locale/uk/LC_MESSAGES/wget.mo
- /usr/share/locale/vi/LC_MESSAGES/wget.mo
- /usr/share/locale/zh_CN/LC_MESSAGES/wget.mo
- /usr/share/locale/zh_TW/LC_MESSAGES/wget.mo
- %doc %attr(0444,root,root) /usr/share/man/man1/wget.1.gz
复制代码 然后我们还是把%_unpackaged_files_terminate_build 改为1
重新rpmbuild,这次终于成功了。
- rpm -qpl RPMS/i386/wget-1.14-1.i386.rpm
复制代码 也能看到新添加进去的filelist.
至此,简单的RPM总算制作成功了,看下包的信息:
- rpm -qpi RPMS/i386/wget-1.14-1.i386.rpm
- Name : wget Relocations: /usr
- Version : 1.14 Vendor: (none)
- Release : 1 Build Date: 2012年12月15日 星期六 14时32分31秒
- Install Date: (not installed) Build Host: localhost.localdomain
- Group : Development/Tools Source RPM: wget-1.14-1.src.rpm
- Size : 2032997 License: GPL
- Signature : (none)
- Summary : 一个使用 HTTP 或 FTP 协议来检索文件的工具。
- Description :
- GNU Wget 是一个文件检索工具,它既可以使用在
- HTTP 协议上,也可以使用在 FTP 协议上。Wget
- 的功能包括:当您注消后在背景内运行的能力,
- 递归地目录检索,文件名通配符匹配,远程文件
- 时间戳贮存和比较,与 FTP 服务器一起使用 Rest
- 和与 HTTP 服务器一起使用 Range 来在缓慢和不
- 可靠的连接上检索文件,对代理服务器的支持,以及可配置性
复制代码 |
|