以libfuse为例介绍rpm打包工具rpmbuild的使用和SPEC文件的编写
一、rpmbuild命令的安装
yum install rpm-build
二、用法
rpmbuild -bb XXXX.spec或者rpmbuild -ba XXX.tar.gz
三、目录概述
rpmbuild在运行后会在用户目录下生成一个rpmbuild的文件夹:
- [root@localhost rpmbuild]# ls ~/rpmbuild/
- BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
有四个目录:
BUILD:你要打包的文件将会在这里编译;
BUILDROOT:在虚拟安装(make install)的目录;
RPMS:存放生成的二进制的rpm包,也就是我们普通用的那种RPM包;
SOURCES:你要编译的源码包会被copy到这里;
SPECS:你执行的spec文件会被copy到这里;
SRPMS:存放的是rpm源码包,源码包里只有一个文件,就是你的XXXX.tar.gz
四、SPEC文件的编写
vim一个空文件,可以看到rpmbuild已经帮我们生成了一个格式:
- [root@localhost packages]# vi aaa.spec
- Name:
- Version:
- Release: %{?dist}
- Summary:
- Group:
- License:
- URL:
- Source0:
- BuildRequires:
- Requires:
- %description
- %prep
- %setup -q
- %build
- %configure
- make %{?_smp_mflags}
- %install
- make install DESTDIR=%{buildroot}
- %files
- %doc
- %changelog
相对应的关键字介绍如下:
- Name:软件包的名称 %{name}
- Version:软件的实际版本号
- Release:发布序列号 %{release}
- 比如:moosefs-3.0.-.tar.gz
- Name:moosefs; 版本号:3.0. Release:
- Summary:软件包的内容概要
- Group:软件分组,建议使用标准分组
- License:软件授权方式
- URL:软件的主页
- Source0:源代码包地址,多个源可以用"%{source1}"、"%{source1}"等引用
- Requires:该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本
- PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不同打包阶段的依赖指定的
- %description:软件的详细说明
- %prep:表示要开始编译软件了,通常包括%setup和%patch两个命令
- %setup -q: 解压源文件程序
- %patch:把补丁放到源码中
- %build表示开始构建
- %configure 相当于"./configure",也可以指定参数
- make %{?_smp_mflags} 就是"make"
- %install:表示开始安装(其实是安装到虚拟目录,一般我们指定是BUILDROOT)
- make install DESTDIR=%{buildroot}就是"make install"
- %files:用来指定要把那些文件打包到rpm包中
- %defattr(,root,root,)用来设定文件的默认权限
- %doc:这个非常重要,只有写在这下面的文件,才会被打包到rpm中去
- 如果目录不对都会提醒你File not found by glob: /root/rpmbuild/BUILDROOT/XXXXX
- 其实在打包的时候%doc可以先不用写,执行过后到 /root/rpmbuild/BUILDROOT/目录下看都安装了什么,再写;
%changelog:变更日志,有些时候回提醒你前面加"*"
下面是我给fuse-2.9.7写的spec文件:
- %define _relname .devel
- Summary: File System in Userspace (FUSE) utilities
- Name: fuse
- Version: 2.9.
- Release: %{?_reasename}
- License: commercial
- Group: System Environment/Base
- Source0: %{name}-%{version}.tar.gz
- BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
- Requires: kernel >= 2.6.
- %description
- libfuse
- %prep
- %setup -q
- %clean
- rm -rf $RPM_BUILD_ROOT
- %build
- %configure
- make
- %install
- make install DESTDIR=$RPM_BUILD_ROOT
- %files
- %defattr(,root,root,)
- %doc
- %{_includedir}/*
- %{_includedir}/fuse/*
- %{_libdir}/*
- %{_libdir}/pkgconfig/*
- %{_bindir}/*
- %{_mandir}/man1/*
- %{_mandir}/man8/*
- /sbin/*
- %{_sysconfdir}/init.d/*
- %{_sysconfdir}/udev/*
- %{_sysconfdir}/udev/rules.d/*
- %changelog
- *Mon Feb 13 2006 Peter Lemenkov <lemenkov newmail ru> - 2.9.1-1
- *Proper udev rule
- *Mon Feb 13 2006 Peter Lemenkov <lemenkov newmail ru> - 2.9.1-1
- *Added missing requires
五、打包之后的疑问和解决方法
1.那么打包之后的文件是不是我们想要的呢?
答:可以用"rpm --prefix"去安装,结果:error: package fuse is not relocatable,用rpm命令查看包信息,原来被禁掉了。
- [root@localhost x86_64]# rpm -ivh fuse-2.9.-.x86_64.rpm --prefix=/usr/local/fuse3
- error: package fuse is not relocatable
- [root@localhost x86_64]# rpm -qpi fuse-2.9.-.x86_64.rpm
- Name : fuse
- Version : 2.9.
- Release :
- Architecture: x86_64
- Install Date: (not installed)
- Group : System Environment/Base
- Size :
- License : commercial
- Signature : (none)
- Source RPM : fuse-2.9.-.src.rpm
- Build Date : Wed Aug ::
- Build Host : localhost
- Relocations : (not relocatable)
- Summary : File System in Userspace (FUSE) utilities
- Description :
- libfuse
2.怎么样不安装rpm就知道里面有什么文件呢?
- #先看我们之前说的SRPM中打的源码包是什么样子的:
[root@localhost SRPMS]# pwd- /root/rpmbuild/SRPMS
- [root@localhost SRPMS]# rpm -qlp fuse-2.9.-.src.rpm
- fuse-2.9..tar.gz
- libfuse.spec
- #再看我们最终想要的二进制的rpm包是神样子的:
- [root@localhost x86_64]# pwd
- /root/rpmbuild/RPMS/x86_64
- [root@localhost x86_64]# rpm -qlp fuse-2.9.-.x86_64.rpm
- /etc/init.d/fuse
- /etc/udev/rules.d
- /etc/udev/rules.d/-fuse.rules
- /sbin/mount.fuse
- /usr/bin/fusermount
- /usr/bin/ulockmgr_server
- /usr/include/fuse
3.怎么样不安装rpm包就可以提取rpm包里的文件:
http://blog.chinaunix.net/uid-33787-id-3331183.html
4.怎样确定系统多出来的命令就是我们刚装上的呢?
- [root@localhost packages]# rpm -qi fuse-libs
- Name : fuse-libs
- Version : 2.9.
- Release : .el7
- Architecture: x86_64
- Install Date: Wed Aug ::
- Group : System Environment/Libraries
- Size :
- License : LGPLv2+
- Signature : RSA/SHA256, Wed Nov :: , Key ID 24c6a8a7f4a80eb5
- Source RPM : fuse-2.9.-.el7.src.rpm
- Build Date : Fri Nov ::
以libfuse为例介绍rpm打包工具rpmbuild的使用和SPEC文件的编写的更多相关文章
- 写你自己 android 多通道打包工具 可以包libs和.so文件
android上传应用程序,需要区分各个信道. 通常更改配置文件中的一个通道id,假设有多个通道,手动更改并生成apk这将是非常麻烦的,及增加误差的概率. 在这个课堂上分享一个打包工具.也可在网上类似 ...
- rpm打包工具---FPM
FPM的安装:fpm是由ruby gem仓库里面安装的所以要先装ruby.yum安装的ruby版本是1.8.7版本,使用gem命令会报错: >= 1.9.3,所以要安装一个比1.9.3版本高的 ...
- rpm打包工具
http://fedoraproject.org/wiki/How_to_create_an_RPM_package # rpm --showrc|grep _topdir -14: _builddi ...
- 【centos7常用技巧】RPM打包
一.RPM打包的目的 1.当目标机中不存在编译环境时,可以先在本地环境中编译打包,然后直接在目标机中用rpm -ivh *.rpm安装即可. 2.当需要在目标机中安装多个软件或者增加多个文件时,可以将 ...
- RPM 打包技术与典型 SPEC 文件分析
一 .rpm 介绍 1. 概述 RPM全称是 Red Hat Package Manager(Red Hat包管理器).几乎所有的 Linux 发行版本都使用这种形式的软件包管理安装.更新和卸载软件. ...
- 用 RPM 打包软件,第 1 部分
http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part1/ RPM(Red Hat Package Manager ...
- HN669打包工具--打包工具使用文档
打包工具主要包含下载更新资源文件以及打包两个部分 一.下载更新资源文件 1.终端进入工具根目录,即HN669SDK_iOS目录,并运行./api.sh脚本 2.输入游戏id (note:此游戏id为我 ...
- FPM打包工具 可以把源码包制定为rpm包 是自动化部署的环节
注意部FPM时的环境一定要跟生产环境的系统版本最好是保持一至,我第一次测试没通过,(我在CENTOS7和部属FPM打好的包在Centos6.x和安装,结果失败) 1:安装 FPM打包工具的依赖包: [ ...
- 前端打包工具——build release介绍
前言 对于前端开发者来说,资源打包是日常过程中一个必不可少的过程:目前我们大多数时候使用grunt.gulp.webpack这三个工具来完成这个工作:但是有一个特点就是我们没创建一个项目都要对应的去编 ...
随机推荐
- MongoDB配置服务--MongoDB安装成为windows服务
MongoDB安装成为windows服务 1.打开命令提示符(最好以管理员的身份打开),然后输入: mongod --logpath "D:\MongoDB\data\log\logs.tx ...
- 解决eclipse配置Tomcat时找不到server选项(Mac通用)
集成Eclipse和Tomcat时找不到server选项: 按照网上的步骤如下: 在Eclipse中,窗口(window)——首选项(preferences)——服务器(Server)——运行时环境( ...
- 【HTML DOM】Node.nodeValue的用法
目录结构: // contents structure [-] 语法 注意 详述 实例 参考文章 Note.noteValue 属性返回或设置当前属性的值. 语法 value = node.nodeV ...
- JavaScript toUpperCase() 方法和 toLowerCase() 方法
1,toUpperCase() 方法用于把字符串转换为大写. 一个新的字符串,在其中 stringObject 的所有小写字符全部被转换为了大写字符. 语法为: stringObject.toUppe ...
- iOS--xuer(registration)
这个登录页面包含了自适应屏幕的大小,数字用户登录键盘是数字键盘.隐藏键盘.隐藏密码等等. ViewController.h #import <UIKit/UIKit.h> #import ...
- [原创]python之socket-ftp
今天来讲讲ftp文件下载,感觉挺有趣的,知道吧,就那种看到新文件生成,而自己写的代码也不多,那种成就感! 一.需求: 客户端发送指令给服务端,服务端根据指令找到相应文件,发送给客户端 分析: PS:e ...
- MS SQL 日常维护管理常用脚本(二)
监控数据库运行 下面是整理.收集监控数据库运行的一些常用脚本,也是MS SQL 日常维护管理常用脚本(一)的续集,欢迎大家补充.提意见. 查看数据库登录名信息 Code Snippet SELEC ...
- JVM之PC寄存器(Program Counter Register)
基本特性: 当前线程执行的字节码的行号指示器. Java虚拟机支持多个线程同时执行,每一个线程都有自己的pc寄存器. 任意时刻,一个线程都只会执行一个方法的代码,称为该线程的当前方法,对于非nativ ...
- 解决: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19
错误信息:C:\Python27\lib\site-packages\sklearn\utils\validation.py:395: DeprecationWarning: Passing 1d a ...
- SQL Server 2008 R2——TRUNCATE TABLE 无法截断表 该表正由 FOREIGN KEY 约束引用
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...