一、rpmbuild命令的安装

yum install rpm-build

二、用法

rpmbuild -bb XXXX.spec或者rpmbuild -ba XXX.tar.gz

三、目录概述

rpmbuild在运行后会在用户目录下生成一个rpmbuild的文件夹:

  1. [root@localhost rpmbuild]# ls ~/rpmbuild/
  2. 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已经帮我们生成了一个格式:

  1. [root@localhost packages]# vi aaa.spec
  2. Name:
  3. Version:
  4. Release: %{?dist}
  5. Summary:
  6.  
  7. Group:
  8. License:
  9. URL:
  10. Source0:
  11.  
  12. BuildRequires:
  13. Requires:
  14.  
  15. %description
  16.  
  17. %prep
  18. %setup -q
  19.  
  20. %build
  21. %configure
  22. make %{?_smp_mflags}
  23.  
  24. %install
  25. make install DESTDIR=%{buildroot}
  26.  
  27. %files
  28. %doc
  29.  
  30. %changelog

相对应的关键字介绍如下:

  1. Name:软件包的名称 %{name}
  2. Version:软件的实际版本号
  3. Release:发布序列号 %{release}
  4. 比如:moosefs-3.0.-.tar.gz
  5. Namemoosefs; 版本号:3.0. Release:
  6.  
  7. Summary:软件包的内容概要
  8. Group:软件分组,建议使用标准分组
  9. License:软件授权方式
  10. URL:软件的主页
  11. Source0:源代码包地址,多个源可以用"%{source1}""%{source1}"等引用
  12. Requires:该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本
  13. PreReqRequires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不同打包阶段的依赖指定的
  14. %description:软件的详细说明
  15. %prep:表示要开始编译软件了,通常包括%setup和%patch两个命令
  16. %setup -q: 解压源文件程序
  17. %patch:把补丁放到源码中
  18. %build表示开始构建
  19. %configure 相当于"./configure",也可以指定参数
  20. make %{?_smp_mflags} 就是"make"
  21. %install:表示开始安装(其实是安装到虚拟目录,一般我们指定是BUILDROOT)
  22. make install DESTDIR=%{buildroot}就是"make install"
  23. %files:用来指定要把那些文件打包到rpm包中
  24. %defattr(,root,root,)用来设定文件的默认权限
  25. %doc:这个非常重要,只有写在这下面的文件,才会被打包到rpm中去
  26.  
  27. 如果目录不对都会提醒你File not found by glob: /root/rpmbuild/BUILDROOT/XXXXX
  28. 其实在打包的时候%doc可以先不用写,执行过后到 /root/rpmbuild/BUILDROOT/目录下看都安装了什么,再写;
    %changelog:变更日志,有些时候回提醒你前面加"*"

下面是我给fuse-2.9.7写的spec文件:

  1. %define _relname .devel
  2.  
  3. Summary: File System in Userspace (FUSE) utilities
  4. Name: fuse
  5. Version: 2.9.
  6. Release: %{?_reasename}
  7. License: commercial
  8. Group: System Environment/Base
  9. Source0: %{name}-%{version}.tar.gz
  10. BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
  11. Requires: kernel >= 2.6.
  12.  
  13. %description
  14. libfuse
  15.  
  16. %prep
  17. %setup -q
  18.  
  19. %clean
  20. rm -rf $RPM_BUILD_ROOT
  21.  
  22. %build
  23. %configure
  24. make
  25.  
  26. %install
  27. make install DESTDIR=$RPM_BUILD_ROOT
  28.  
  29. %files
  30. %defattr(,root,root,)
  31. %doc
  32. %{_includedir}/*
  33. %{_includedir}/fuse/*
  34. %{_libdir}/*
  35. %{_libdir}/pkgconfig/*
  36. %{_bindir}/*
  37. %{_mandir}/man1/*
  38. %{_mandir}/man8/*
  39. /sbin/*
  40. %{_sysconfdir}/init.d/*
  41. %{_sysconfdir}/udev/*
  42. %{_sysconfdir}/udev/rules.d/*
  43.  
  44. %changelog
  45. *Mon Feb 13 2006 Peter Lemenkov <lemenkov newmail ru> - 2.9.1-1
  46. *Proper udev rule
  47. *Mon Feb 13 2006 Peter Lemenkov <lemenkov newmail ru> - 2.9.1-1
  48. *Added missing requires

五、打包之后的疑问和解决方法

1.那么打包之后的文件是不是我们想要的呢?

答:可以用"rpm --prefix"去安装,结果:error: package fuse is not relocatable,用rpm命令查看包信息,原来被禁掉了。

  1. [root@localhost x86_64]# rpm -ivh fuse-2.9.-.x86_64.rpm --prefix=/usr/local/fuse3
  2. error: package fuse is not relocatable
  3. [root@localhost x86_64]# rpm -qpi fuse-2.9.-.x86_64.rpm
  4. Name : fuse
  5. Version : 2.9.
  6. Release :
  7. Architecture: x86_64
  8. Install Date: (not installed)
  9. Group : System Environment/Base
  10. Size :
  11. License : commercial
  12. Signature : (none)
  13. Source RPM : fuse-2.9.-.src.rpm
  14. Build Date : Wed Aug ::
  15. Build Host : localhost
  16. Relocations : (not relocatable)
  17. Summary : File System in Userspace (FUSE) utilities
  18. Description :
  19. libfuse

2.怎么样不安装rpm就知道里面有什么文件呢?

  1. #先看我们之前说的SRPM中打的源码包是什么样子的:
    [root@localhost SRPMS]# pwd
  2. /root/rpmbuild/SRPMS
  3. [root@localhost SRPMS]# rpm -qlp fuse-2.9.-.src.rpm
  4. fuse-2.9..tar.gz
  5. libfuse.spec
  6. #再看我们最终想要的二进制的rpm包是神样子的:
  7. [root@localhost x86_64]# pwd
  8. /root/rpmbuild/RPMS/x86_64
  9. [root@localhost x86_64]# rpm -qlp fuse-2.9.-.x86_64.rpm
  10. /etc/init.d/fuse
  11. /etc/udev/rules.d
  12. /etc/udev/rules.d/-fuse.rules
  13. /sbin/mount.fuse
  14. /usr/bin/fusermount
  15. /usr/bin/ulockmgr_server
  16. /usr/include/fuse

3.怎么样不安装rpm包就可以提取rpm包里的文件:
http://blog.chinaunix.net/uid-33787-id-3331183.html

4.怎样确定系统多出来的命令就是我们刚装上的呢?

  1. [root@localhost packages]# rpm -qi fuse-libs
  2. Name : fuse-libs
  3. Version : 2.9.
  4. Release : .el7
  5. Architecture: x86_64
  6. Install Date: Wed Aug ::
  7. Group : System Environment/Libraries
  8. Size :
  9. License : LGPLv2+
  10. Signature : RSA/SHA256, Wed Nov :: , Key ID 24c6a8a7f4a80eb5
  11. Source RPM : fuse-2.9.-.el7.src.rpm
  12. 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. MongoDB配置服务--MongoDB安装成为windows服务

    MongoDB安装成为windows服务 1.打开命令提示符(最好以管理员的身份打开),然后输入: mongod --logpath "D:\MongoDB\data\log\logs.tx ...

  2. 解决eclipse配置Tomcat时找不到server选项(Mac通用)

    集成Eclipse和Tomcat时找不到server选项: 按照网上的步骤如下: 在Eclipse中,窗口(window)——首选项(preferences)——服务器(Server)——运行时环境( ...

  3. 【HTML DOM】Node.nodeValue的用法

    目录结构: // contents structure [-] 语法 注意 详述 实例 参考文章 Note.noteValue 属性返回或设置当前属性的值. 语法 value = node.nodeV ...

  4. JavaScript toUpperCase() 方法和 toLowerCase() 方法

    1,toUpperCase() 方法用于把字符串转换为大写. 一个新的字符串,在其中 stringObject 的所有小写字符全部被转换为了大写字符. 语法为: stringObject.toUppe ...

  5. iOS--xuer(registration)

    这个登录页面包含了自适应屏幕的大小,数字用户登录键盘是数字键盘.隐藏键盘.隐藏密码等等. ViewController.h #import <UIKit/UIKit.h> #import ...

  6. [原创]python之socket-ftp

    今天来讲讲ftp文件下载,感觉挺有趣的,知道吧,就那种看到新文件生成,而自己写的代码也不多,那种成就感! 一.需求: 客户端发送指令给服务端,服务端根据指令找到相应文件,发送给客户端 分析: PS:e ...

  7. MS SQL 日常维护管理常用脚本(二)

    监控数据库运行 下面是整理.收集监控数据库运行的一些常用脚本,也是MS SQL 日常维护管理常用脚本(一)的续集,欢迎大家补充.提意见. 查看数据库登录名信息   Code Snippet SELEC ...

  8. JVM之PC寄存器(Program Counter Register)

    基本特性: 当前线程执行的字节码的行号指示器. Java虚拟机支持多个线程同时执行,每一个线程都有自己的pc寄存器. 任意时刻,一个线程都只会执行一个方法的代码,称为该线程的当前方法,对于非nativ ...

  9. 解决: 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 ...

  10. SQL Server 2008 R2——TRUNCATE TABLE 无法截断表 该表正由 FOREIGN KEY 约束引用

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...