RPM包快速构建教程

rpm打包需要特定的目录及结构。查看rpm打包目录 测试在CentOS6.3

rpm打包需要特定的目录及结构。查看rpm打包目录 测试在CentOS6.3

[[email protected] ~]#  rpm --showrc|grep _topdir

-14: _builddir  %{_topdir}/BUILD

-14: _buildrootdir      %{_topdir}/BUILDROOT

-14: _rpmdir    %{_topdir}/RPMS

-14: _sourcedir %{_topdir}/SOURCES

-14: _specdir   %{_topdir}/SPECS

-14: _srcrpmdir %{_topdir}/SRPMS

-14: _topdir    %{getenv:HOME}/rpmbuild

[[email protected] ~]# rpm --showrc|grep _usrsrc

-14: _usrsrc    %{_usr}/src

[[email protected] ~]# rpm --showrc|grep _usr

-14: _defaultdocdir     %{_usr}/share/doc

-14: _usr       /usr

-14: _usrsrc    %{_usr}/src

可以通过命令rpm --showrc查看实现代码。另外直接通过 rpm --eval "%{macro}"来查看具体对应路径。

比如我们要查看%{_bindir}的路径,就可以使用命令rpm --eval "%{ _bindir}"来查看。

[[email protected] ~]# rpm --eval "%{_topdir}"

/root/rpmbuild

[[email protected] ~]# tree /root/rpmbuild

/root/rpmbuild

├── BUILD

│   └── hello-0.1

│       ├── debugfiles.list

│       ├── debuglinks.list

│       ├── debugsources.list

│       ├── hello

│       └── hello.c

├── BUILDROOT

├── RPMS

│   └── x86_64

│       ├── hello-0.1-1.x86_64.rpm

│       └── hello-debuginfo-0.1-1.x86_64.rpm

├── SOURCES

│   └── hello-0.1.tar.gz

├── SPECS

│   └── hello.spec

└── SRPMS

└── hello-0.1-1.src.rpm

下面以hello world为例,构建一个最小化打包过程。 首先需要写一个SPEC文件hello.spce:

一般在这个目录下  会自动出现的

rpmdev-newspec leafpad
++++++++++++++++++++++++++++++++++
Summary:    hello world rpm package
Name:       hello
Version:    0.1
Release:    1
Source:     hello-0.1.tar.gz
License:    GPL
Packager:   test
Group:      Application

%description
This is a software for making your life more beautiful!

%prep
%setup -q

%build
gcc -o hello hello.c

%install
install -m 755 hello /usr/local/bin/hello

%files
/usr/local/bin/hello

放到上述SPECS目录下。 然后一个源程序hello.c:

#include <stdio.h>int main()
{
    printf("Hello, World!\n");    return 0;
}
tar zcvf hello-0.1.tar.gz hello-0.1
mv hello-0.1.tar.gz  redhat/SOURCES
rpmbuild -ba hello.spec我们可以通过修改topdir宏的值来自定义打包路径:
$ echo %_topdir $HOME/rpmbuild > ~/.rpmmacros
通过BuildRoot的值告诉rpmbuild,我们的构建根是builddir下的hello-root目录。其中以%{}括起来的是RPM宏,_builddir代表~/rpmbuild/BUILD目录;name代表spec文件开头的Name字段值。

以下划线开头的builddir是系统RPM宏,我们可以通过rpm --showrc看到,可以在.rpmmacros中自定义。

RPM_BUILD_ROOT和前面的宏不同,这里没有{}括起来,是为了在以后安装生成的rpm时不至于也去寻找传说中的构建根。

如果喜欢的话,可以修改Source字段如下:

实例  前提不缺依赖
1. 下载nginx源码,直接运行命令:?12cd /rootwget http://nginx.org/download/nginx-1.7.1.tar.gz在拿到源码包之后,解压,并进入目录:?12tar zxvf nginx-1.7.1.tar.gzcd nginx-1.7.12. 编写SPEC文件文件名为:nginx.spec?1234567891011121314151617181920212223242526272829Summary: High Performance Web ServerName: nginxVersion: 1.7.1Release: el5License: GPLGroup: Applications/ServerSource: http://nginx.org/download/nginx-%{version}.tar.gzURL: http://nginx.org/Distribution: LinuxPackager: yunjianfei <[email protected]>BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}%define srcdir /root/nginx-1.7.1%descriptionnginx [engine x] is a HTTP and reverse proxy server, as well as a mail proxy server%prep%buildcd %{srcdir}./configure --prefix=/usr/local/nginxmake -j8%installcd %{srcdir}make DESTDIR=%{buildroot} install%preunif [ -z "`ps aux | grep nginx | grep -v grep`" ];then killall nginx >/dev/null exit 0fi%files/usr/local/nginx3. 最后执行rpmbuild命令,打rpm包?1rpmbuild -bb nginx.spec


1

2


cd /root

wget http://nginx.org/download/nginx-1.7.1.tar.gz

在拿到源码包之后,解压,并进入目录:


1

2


tar zxvf nginx-1.7.1.tar.gz

cd nginx-1.7.1

2. 编写SPEC文件

文件名为:nginx.spec


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29


Summary: High Performance Web Server

Name: nginx

Version: 1.7.1

Release: el5

License: GPL

Group: Applications/Server

Source: http://nginx.org/download/nginx-%{version}.tar.gz

URL: http://nginx.org/

Distribution: Linux

Packager: test

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}

%define srcdir /root/nginx-1.7.1

%description

nginx [engine x] is a HTTP and reverse proxy server, as well as a mail proxy server

%prep

%build

cd %{srcdir}

./configure --prefix=/usr/local/nginx

make -j8

%install

cd %{srcdir}

make DESTDIR=%{buildroot} install

%preun

if [ -z "`ps aux | grep nginx | grep -v grep`" ];then

 killall nginx >/dev/null

 exit 0

fi

%files

/usr/local/nginx

3. 最后执行rpmbuild命令,打rpm包


1


rpmbuild -bb nginx.spec

spec脚本包括很多关键字,主要有:
引用
Name: 软件包的名称,后面可使用%{name}的方式引用

Summary: 软件包的内容概要

Version: 软件的实际版本号,例如:1.0.1等,后面可使用%{version}引用

Release: 发布序列号,例如:1linuxing等,标明第几次打包,后面可使用%{release}引用

Group: 软件分组,建议使用标准分组

License: 软件授权方式,通常就是GPL

Source: 源代码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用

BuildRoot: 这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:
%{_tmppath}/%{name}-%{version}-%{release}-root
或
%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n}
该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。
后面可使用$RPM_BUILD_ROOT 方式引用。

URL: 软件的主页

Vendor: 发行商或打包组织的信息,例如RedFlag Co,Ltd

Disstribution: 发行版标识

Patch: 补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用

Prefix: %{_prefix} 这个主要是为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录的情况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm安装时重新指定位置的功能

Prefix: %{_sysconfdir} 这个原因和上面的一样,但由于%{_prefix}指/usr,而对于其他的文件,例如/etc下的配置文件,则需要用%{_sysconfdir}标识

Build Arch: 指编译的目标处理器架构,noarch标识不指定,但通常都是以/usr/lib/rpm/marcros中的内容为默认值

Requires: 该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:
libpng-devel >= 1.0.20 zlib 
※“>=”号两边需用空格隔开,而不同软件名称也用空格分开
还有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不同阶段的依赖指定 

Provides: 指明本软件一些特定的功能,以便其他rpm识别

Packager: 打包者的信息

%description 软件的详细说明

假如需要在 rpmbuild 生成软件包, 在安装时候忽略依赖关系
请在 spec 文件中添加下面参数
AutoReqProv: no
时间: 2024-07-28 13:12:51

RPM包快速构建教程的相关文章

RPM包制作方法

一.RPM介绍 RPM 前是Red Hat Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理:现在应为RPM Package Manager的缩写.在Fedora.Redhat.Mandriva.SuSE.YellowDog等主流发行版本,以及在这些版本基础上二次开发出来的发行版采用: RPM包中除了包括程序运行时所需要的文件,也有其它的文件:一个RPM包中的应用程序,有时除了自身所带的附加文件保证其正常以外,还需要其它特定

LAMP基础及其基于rpm方式的构建

本文将初步介绍什么是LAMP,其组合方式有哪几种,一次完整的请求流程是怎样进行的,以及基于rpm安装的方式构建一个简单的LAMP并测试之. 1.LAMP组合及一次完整的请求流程 2.LAMP的组合方式 3.基于rpm包安装构建LAMP 4.基于虚拟机www.a.com创建wordpress 5.基于虚拟机www.b.org创建phpMyAdmin

RPM包制作

制作RPM包,可以方便日后的维护.统一了标准 yum install rpmdevtools 安装后,使用 rpmdev-setuptree命令创建rpm包的目录结构.默认是在$HOME下rmpbuild下,也可以通过~/.rpmmacros配置. SPEC文档是制作rpm包的核心. 下面是从fedora中copy过来的 新建一个 .spec 文件 现在,您需要在 ~/rpmbuild/SPECS 目录下,新建一个 SPEC 文件.文件应命名为 "软件包名.spec".名称根据软件包名

全面学习 Python 包:包的构建与分发

首发于公众号:Python编程时光 1. 为什么需要对项目分发打包? 平常我们习惯了使用 pip 来安装一些第三方模块,这个安装过程之所以简单,是因为模块开发者为我们默默地为我们做了所有繁杂的工作,而这个过程就是 打包. 打包,就是将你的源代码进一步封装,并且将所有的项目部署工作都事先安排好,这样使用者拿到后即装即用,不用再操心如何部署的问题(如果你不想对照着一堆部署文档手工操作的话). 不管你是在工作中,还是业余准备自己写一个可以上传到 PyPI 的项目,你都要学会如何打包你的项目. Pyth

Red Hat 系列如何快速定制二进制内核 RPM 包?

随着Linux服务器越来越多了,底层系统内核想要保持版本统一就需要定制专门的二进制安装包来便捷的升级和管理. RedHat系那当然就是使用rpmbuild来做定制化管理了. 今天我们分俩个部分(root和普通用户)来讲解如何制作内核的二进制rpm包. Building主机系统环境约定: OS : CentOS release 6.6 Arch : i686 第一部分,rpm包简单定制 注意: 这里我们首先要预留至少20GB的临时文件空间. 一.rpm 制作前的环境准备: yum -y group

Centos 中如何快速定制二进制的内核 RPM 包

1.rpm 制作前的环境准备: yum install -y ncurses-devel qt-devel rpm-build redhat-rpm-config asciidoc hmaccalc perl-ExtUtils-Embed xmlto audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel newt-devel python-devel zlib-devel bc 2.准备内核的源代码组件 cd /

Centos 中如何快速定制二进制的内核RPM 包

随着Linux服务器越来越多了,底层系统内核想要保持版本统一就需要定制专门的二进制安装包来便捷的升级和管理. RedHat系那当然就是使用rpmbuild来做定制化管理了. 今天我们分俩个部分(root和普通用户)来讲解如何制作内核的二进制rpm包. Building主机系统环境约定: OS : CentOS release 6.6 Arch : i686 一,rpm包简单定制 注意: 这里我们首先要预留至少20GB的临时文件空间. 1.rpm 制作前的环境准备: yum -y groupins

Linux手动构建RPM包

一.前言 在linux上安装软件和模块很多都是通过rpm包安装的,非常的方便.如果多个主机安装文件和脚本也能用rpm包的方式就好了,节省时间和精力,正好看到了一篇文章,本地构建rpm包,试着学了下,所以写下这篇博客记录构建过程,该博客使用到的主机为Centos7. 二.准备 1.首先,打开一个终端会话,使用root用户创建可用于此项目的普通用户 “student”,并为该用户设置密码. [[email protected] ~]# useradd student [[email protecte

CentOS下lamp的实现之rpm包构建discuz论坛

一.安装需要用的软件 [[email protected] ~]# yum install php php-gdphp-xml php-mysql mysql mysql-server httpd –y 启动mysql和httpd并设置为2.3.4.5级别自动启动 [[email protected] ~]# service mysqld start [[email protected] ~]# chkconfig mysqld on [[email protected] ~]# service