一、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. Introduction to Microsoft Dynamics 365 licensing

    Microsoft Dynamics 365 will be released on November 1. In preparation for that, Scott Guthrie hosted ...

  2. 利用UICollectionViewFlowLayout的隐式动画实现UICollectionView的layout的动画调整(外加放大指定cell效果)

    前几天在gitHub看到个不错的效果,就是DaiExpandCollectionView,效果如图:   所以赶紧下下来源码看看他怎么实现的,打开源码看了半天,发现他没写什么关于动画的代码啊... 经 ...

  3. Linux0.11内核--加载可执行二进制文件之1.copy_strings

    从现在开始就是分析最后的核心模块exec.c了,分析完这个文件后,就会和之前的所有分析形成一个环路,从创建进程.加载进程程序到进程调度.内存管理. exec.c的核心do_execve函数很长,而且用 ...

  4. 关于csrss.exe和winlogon.exe进程多、占用CPU高的解决办法,有人在暴力破解

    关于csrss.exe和winlogon.exe进程多.占用CPU高的解决办法 最近VPS的CPU一直处在100%左右,后台管理上去经常打不开,后来发现上远程都要好半天才反映过来,看到任务管理器有多个 ...

  5. oc 中组合排序算法

    - (NSMutableArray *)zuHeSuanFa:(NSMutableArray *)array chooseCount:(int)m { int n = (int)[array coun ...

  6. Android Material Design 兼容库的使用

    Android Material Design 兼容库的使用 mecury 前言:近来学习了Android Material Design 兼容库,为了把这个弄懂,才有了这篇博客,这里先推荐两篇博客: ...

  7. Vs2013 html5开发WP8.1 APP之alert

    Js的alert不被支持 使用 navigator.notification.alert 需要在CONFIG中增加     示例   <script type="text/javasc ...

  8. margin css的外边距

    h2{margin:10px 0;} div{margin:20px 0;} ...... <h2>这是一个标题</h2> <div> <h2>这是又一 ...

  9. centos为用户增加ssh key

    linux增加用户,为用户增加key 可以用  ssh-keygen -t rsa 添加ssh的key,会得到public_key和自己的private_key 然后这个key可以用在任何用户上 ad ...

  10. leveldb源码分析--SSTable之Compaction

    对于compaction是leveldb中体量最大的一部分,也应该是最为复杂的部分,为了便于理解我们首先从一些基本的概念开始.下面是一些从doc/impl.html中翻译和整理的内容: Level 0 ...