一、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文件的编写的更多相关文章

  1. 写你自己 android 多通道打包工具 可以包libs和.so文件

    android上传应用程序,需要区分各个信道. 通常更改配置文件中的一个通道id,假设有多个通道,手动更改并生成apk这将是非常麻烦的,及增加误差的概率. 在这个课堂上分享一个打包工具.也可在网上类似 ...

  2. rpm打包工具---FPM

    FPM的安装:fpm是由ruby gem仓库里面安装的所以要先装ruby.yum安装的ruby版本是1.8.7版本,使用gem命令会报错: >= 1.9.3,所以要安装一个比1.9.3版本高的 ...

  3. rpm打包工具

    http://fedoraproject.org/wiki/How_to_create_an_RPM_package # rpm --showrc|grep _topdir -14: _builddi ...

  4. 【centos7常用技巧】RPM打包

    一.RPM打包的目的 1.当目标机中不存在编译环境时,可以先在本地环境中编译打包,然后直接在目标机中用rpm -ivh *.rpm安装即可. 2.当需要在目标机中安装多个软件或者增加多个文件时,可以将 ...

  5. RPM 打包技术与典型 SPEC 文件分析

    一 .rpm 介绍 1. 概述 RPM全称是 Red Hat Package Manager(Red Hat包管理器).几乎所有的 Linux 发行版本都使用这种形式的软件包管理安装.更新和卸载软件. ...

  6. 用 RPM 打包软件,第 1 部分

    http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part1/ RPM(Red Hat Package Manager ...

  7. HN669打包工具--打包工具使用文档

    打包工具主要包含下载更新资源文件以及打包两个部分 一.下载更新资源文件 1.终端进入工具根目录,即HN669SDK_iOS目录,并运行./api.sh脚本 2.输入游戏id (note:此游戏id为我 ...

  8. FPM打包工具 可以把源码包制定为rpm包 是自动化部署的环节

    注意部FPM时的环境一定要跟生产环境的系统版本最好是保持一至,我第一次测试没通过,(我在CENTOS7和部属FPM打好的包在Centos6.x和安装,结果失败) 1:安装 FPM打包工具的依赖包: [ ...

  9. 前端打包工具——build release介绍

    前言 对于前端开发者来说,资源打包是日常过程中一个必不可少的过程:目前我们大多数时候使用grunt.gulp.webpack这三个工具来完成这个工作:但是有一个特点就是我们没创建一个项目都要对应的去编 ...

随机推荐

  1. BuilderParttern(建造者模式)

    /** * 建造者模式 * 主要用于构造复杂的对象 * 在优朋播放器就是采用建造者构建的,可以说比较有心得吧 * @author TMAC-J * */ public class BuilderPat ...

  2. tomcat 7 WARNING: A context path must either be an empty string or start with a '/' and do not end with a '/'. The path [/] does not meet these criteria and has been changed to []

    tomcat 7 WARNING: A context path must either be an empty string or start with a '/' and do not end w ...

  3. web移动端fixed布局和input等表单的爱恨情仇 - 终极BUG,完美解决

    [问题]移动端开发,ios下当fixed属性和输入框input(这里不限于input,只要可以调用移动端输入法的都包括,如:textarea.HTML5中contenteditable等),同时存在的 ...

  4. FIS3的简单使用

    序言: 最近在收集前端的优化工具,随便一搜,厉害了word哥,有grunt.gulp.FIS3.webpack等等,简直就是眼花缭乱!前辈们对于他们的评价各有千秋,于是乎就想每个都来用一遍(之前已经倒 ...

  5. js获取网页高度

    网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.body.offsetWi ...

  6. Play Framework 完整实现一个APP(四)

    上一篇最后出现的错误是因为断言 assertEquals(1, Post.count()); 出错,取到的Post的数量不是1,运行Test之前,表中有数据 可以添加以下方法,运行Test前清空数据 ...

  7. Linux 格式化扩展分区(Extended)

    如果你在Linux系统中格式化磁盘时遇到如下错误,那么表示你正在格式化一个扩展分区. [root@GETTestLNX06 ~]# mkfs.ext4 /dev/sdb1   mke2fs 1.41. ...

  8. mysql_建立索引的优缺点 #转自Starzm#

    建立索引的优缺点: 为什么要创建索引呢? 这是因为,创建索引可以大大提高系统的性能.         第一.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性.         第二.可以大大加 ...

  9. SQLSERVER中正则表达式封装使用

    封装好的正则表达式供SQLSERVER调用 打开数据库->可编程性->函数->标量值函数->新建标量值函数名 USE [数据库]GOSET ANSI_NULLS ONGOSET ...

  10. HDFS Federation (读书笔记)

    HDFS Federation (读书笔记) HDFS的架构 HDFS包含两个层次:命名空间管理(Namespace) 和 块/存储管理(Block Storage). 命名空间管理(Namespac ...