7.4. rpmbuild - Build RPM Package(s)

安装rpmbuild,我们将使用它来制作rpm包

yum search rpm-build
yum install -y rpm-build
		

Debian: sudo apt-get install rpm

rpm 工作空间,默认是/usr/src/redhat/

mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

echo "%_topdir /home/neo/rpmbuild" >> ~/.rpmmacros
echo "%packager Test User <test@example.com>" >> ~/.rpmmacros
cat ~/.rpmmacros

touch ~/rpmbuild/SPECS/package-1.0.spec

准备好你的文件包

tar zcvf %{name}-%{version}.tar.gz your_dir
		

编辑spec文件

vim ~/rpmbuild/SPECS/package-1.0.spec

Summary: My Test Package
Name: test
Version: 1.0
Release: 1.0
License: BSD
# group you want your package in, mostly for GUI package browsers
# some example groups used by vendors:
# http://www.rpmfind.net/linux/RPM/Groups.html
Group: Networking/Daemons
# your name for example
Packager: Neo Chen <openunix@163.com>
#
#Source: http://full.url.to.the/package/%{name}-%{version}.tar.gz
Source: %{name}-%{version}.tar.gz
# list all your patches here:
#Patch:
# list all packages required to build this package
#BuildRequires:
#Provides:
# list all packages that conflict with this one:
#BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRoot: %{_tmppath}/%{name}-%{version}

####
# full length description
%description

description

#####
# this prepares a fresh build directory in ~/build/BUILD, useful macros here
# are:
# %setup - cleans any previous builds and untargzips the source
# %patch - applies patches
# any other commands here are executed as standard sh commands
%prep

%setup
#%patch

#####
# this tells rpmbuild how to build your package, rpmbuild runs it as a sh
# script
%build
#make

#####
# all the steps necessary to install your package into $RPM_BUILD_ROOT
# first step is to clear $RPM_BUILD_ROOT
%install
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
cp -r ../* %{_tmppath}
#install all files under RPM_BUILD_ROOT
#make install DESTDIR=$RPM_BUILD_ROOT
# now you can remove uneeded stuff
#rm -f $RPM_BUILD_ROOT{_prefix}

#####
# NOTE: this section is optional
# commands run just before the package is installed
%pre
#/usr/sbin/useradd -c "test user" -r -s /bin/false -u 666 -d / neo 2> /dev/null

#####
# NOTE: this section is optional
# commands run before uninstalling the software
%preun
#/sbin/service test stop > /dev/null 2>&1
#/sbin/chkconfig --del test

#####
# NOTE: this section is optional
# commands run after installing the package
%post
#/sbin/chkconfig -add test
#touch /var/log/test

#####
# NOTE: this section is optional
# commands run after unistalling the package
%postun
#/sbin/service test stop
#/usr/sbin/userdel test

#####
# list all the files that are part of the package. If a file is not in the
# list rpmbuild won't put it in the package
# see below on how to automate the process of creating this list.
# some useful macros here:
# %doc /path/to/filename - installs filename into /path/to/filename and marks
# it as being documentation
# %config /etc/config_file - similar for configuration files
# %attr(mode, user, group) file - lets you specify file attributes applied
# during installation, use - if you want to use defaults
%files
#/usr/bin/test
#/usr/sbin/test
# this will package the dir and all directories inside it
#/example/of/a/dir
/srv/neo
# this will package only the 'dir' directory
#%dir /example/of/a/dir

#####
# document changes between package releases
%changelog

开始制作rpm文件

rpmbuild -ba ~/rpmbuild/SPECS/package-1.0.spec
		

查看你的rpm文件包含文件列表

rpm -qpl /usr/src/redhat/RPMS/x86_64/test-1.0-1.0.x86_64.rpm
/srv
/srv/bin
/srv/bin/console
/srv/bin/nodekeeper
/srv/etc
/srv/etc/commands.cfg
/srv/etc/nodekeeper.cfg
/srv/etc/protocol.cfg
/srv/logs
/srv/logs/nodekeeper.log
/srv/run
/srv/run/nodekeeper.pid
		

安装RPM

# rpm -Uvh --nodeps /tmp/test-1.0-1.0.x86_64.rpm
Preparing...                ########################################### [100%]
   1:test                   ########################################### [100%]
		

也可以使用 yum 安装

yum localinstall /tmp/test-1.0-1.0.x86_64.rpm
		

查看安装信息

# rpm -qi test
Name        : test                         Relocations: (not relocatable)
Version     : 1.0                               Vendor: (none)
Release     : 1.0                           Build Date: Wed 21 Sep 2011 05:50:54 PM CST
Install Date: Wed 21 Sep 2011 05:46:50 PM CST      Build Host: dev3.example.com
Group       : Networking/Daemons            Source RPM: test-1.0-1.0.src.rpm
Size        : 20373                            License: BSD
Signature   : (none)
Packager    : Neo Chen <openunix@163.com>
Summary     : My Test Package
Description :

description

是使用yum info 查看信息

# yum info test
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.163.com
 * extras: mirrors.163.com
 * updates: mirrors.163.com
Installed Packages
Name       : test
Arch       : x86_64
Version    : 1.0
Release    : 1.0
Size       : 20 k
Repo       : installed
Summary    : My Test Package
License    : BSD
Description:
           : description
		

7.4.1. RPM_directory_macros

http://fedoraproject.org/wiki/Packaging/RPMMacros#RPM_directory_macros

%{_sysconfdir}        /etc

%{_prefix}            /usr

%{_exec_prefix}       %{_prefix}

%{_bindir}            %{_exec_prefix}/bin

%{_lib}               lib (lib64 on 64bit systems)

%{_libdir}            %{_exec_prefix}/%{_lib}

%{_libexecdir}        %{_exec_prefix}/libexec

%{_sbindir}           %{_exec_prefix}/sbin

%{_sharedstatedir}    /var/lib

%{_datadir}           %{_prefix}/share

%{_includedir}        %{_prefix}/include

%{_oldincludedir}     /usr/include

%{_infodir}           /usr/share/info

%{_mandir}            /usr/share/man

%{_localstatedir}     /var

%{_initddir}          %{_sysconfdir}/rc.d/init.d

Note: On releases older than Fedora 10 (and EPEL), %{_initddir} does not exist. Instead, you should use the deprecated%{_initrddir} macro.
RPM directory macros
%{_topdir}            %{getenv:HOME}/rpmbuild

%{_builddir}          %{_topdir}/BUILD

%{_rpmdir}            %{_topdir}/RPMS

%{_sourcedir}         %{_topdir}/SOURCES

%{_specdir}           %{_topdir}/SPECS

%{_srcrpmdir}         %{_topdir}/SRPMS

%{_buildrootdir}      %{_topdir}/BUILDROOT

Note: On releases older than Fedora 10 (and EPEL), %{_buildrootdir} does not exist.
Build flags macros
%{_global_cflags}     -O2 -g -pipe

%{_optflags}          %{__global_cflags} -m32 -march=i386 -mtune=pentium4 # if redhat-rpm-config is installed

Other macros
%{_var}               /var

%{_tmppath}           %{_var}/tmp

%{_usr}               /usr

%{_usrsrc}            %{_usr}/src

%{_docdir}            %{_datadir}/doc

7.4.2. --define 专递模板变量

spec 文件中定义宏默认值

%define <variable> <value>

另一种是在外部传递变量值

rpmbuild -ba SPECS/bacula.spec --define "build_su110 1" --define "build_mysql4 1"
			

注意:当两种同时使用时,外部--define无法替代%define 的定义。

7.4.3. defattr

%defattr(-,root,root,-)		

7.4.4. GPG 签名

查看GPG证书

$ gpg --list-keys
/home/neo/.gnupg/pubring.gpg
----------------------------
pub   1024R/63268A35 2013-09-11
uid                  Neo Chen (netkiller) <netkiller@msn.com>
sub   1024R/F4F946F9 2013-09-11

设置 _gpg_name 宏,与上面查看结果需一致

cat << EOF >> ~/.rpmmacros
%_signature gpg
%_gpg_name Neo Chen (netkiller) <netkiller@msn.com>
%_gpgpath ~/.gnupg
%_gpgbin /usr/bin/gpg
EOF

建立RPM

rpmbuild --define "_topdir /path/to/macrodir" -bb --sign spec
			

如果你的证书有Passphrase,会提示你输入了密码。

Enter pass phrase:
Pass phrase is good.
			

7.4.5. 使用 CMake3 编译并创建RPM包

root@VM_7_221_centos ~/mysql-outfile-plugin % cat Outfile.spec
Name: mysql-outfile-plugin
Version: 1.0
Release:	1%{?dist}
Summary: MySQL outfile plugin	

Group: MySQL Database server
License: CC 3.0
URL: http://www.netkiller.cn
Source0: https://github.com/netkiller/mysql-outfile-plugin/archive/v1.0.tar.gz

BuildRequires: cmake3 mysql-community-devel
Requires: gcc	

%description

%prep
%setup -q

%build
cmake3 .
make %{?_smp_mflags}

%install
make install DESTDIR=%{buildroot}

%files
/usr/lib64/mysql/plugin/liboutfile.so
%doc

%changelog

7.4.6. FAQ

error: File /home/neo/rpmbuild/SOURCES/netkiller-docbook-1.0.1.tar.gz: No such file or directory

Source 定义的文件不存在,如果你需要忽略Source可以使用 %setup -T

原文出处:Netkiller 系列 手札
本文作者:陈景峯
转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。

时间: 2024-09-22 23:10:36

7.4. rpmbuild - Build RPM Package(s)的相关文章

7.3. rpm - RPM Package Manager

7.3.1. install/upgrade/remove 1.安装一个包 # rpm -ivh 2.升级一个包 # rpm -Uvh 3.删除一个包 # rpm -e 不检查依赖性关系 rpm -ivh --nodeps 强制安装 rpm -ivh --force --nodeps 7.3.1.1. --prefix 安装到指定目录 rpm -ivh --prefix=/opt/usr your.rpm 同时修改多个路径: rpm xxx.rpm --relocate=/usr=/opt/us

使用Docker镜像构建RPM包

本文讲的是使用Docker镜像构建RPM包,[编者的话]RPM(Red Hat Package Manager)是用于 Linux 分发版的最常见的软件包管理器.因为它允许分发已编译的软件,所以用户只用一个命令就可以安装软件.而RPM包的构建相当繁琐,并且对环境的要求比较高,本文作者介绍了如何借助Docker来构建可以适用多个平台的RPM包. 在一个内部项目中,我一直在思考如何通过非CI工具/流程生成RPM包,我想手动生成RPM包,这样我可以测试它们是否能正常安装,并用于正常的冒烟测试(译者注:

Linux软件安装:RPM、SRPM与YUM功能

一.软件管理器简介 --包管理模式 ·用户使用的系统与软件发行商的一样,发行商就可以在他们的系统上编译好用户需要的软件,然后将编译好的软件发给用户,就可以在用户的系统上直接安装使用,省去了编译的过程: ·包管理模式的安装方式类似于Windows下面的安装,不需要编译: ·发行商即是Linux distribution的发行商或团体组织,这些用户使用它们的Linux distribution: --软件管理器(或包管理器) ·软件管理器在软件安装的时候会记录一些与安装软件相关的信息,方便以后进行软

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

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

怎样制作RPM包

怎样制作RPM包   Mr. Neo Chen (netkiller), 陈景峰(BG7NYT) 中国广东省深圳市龙华新区民之街道溪山美地518109+86 13113668890+86 755 29812080<netkiller@msn.com> 版权 2011, 2012, 2013 http://netkiller.github.com 摘要 我在网上找RPM包的制作例子几乎都是C源码编译安装然后生成RPM包, 而我的程序不是C写的很多时候是脚本语言如Python, PHP 甚至是 H

linux中制作PHP的RPM包教程

下面我们以制作php的rpm开始介绍其制作方法.以下操作在CentOS6.6 64位系统进行. 安装rpm-build [root@linuxeye.com SOURCES]# yum -y install rpm-build 建立工作车间目录 [root@linuxeye.com SOURCES]# vim ~/.rpmmacros %_topdir /root/rpmbuild [root@linuxeye.com SOURCES]# mkdir -pv ~/rpmbuild/{BUILD,

rpm 神器第二篇-multipkg 高阶用法介绍与实战

前言 前一篇文章中介绍了 multipkg 的安装和基本用法,这两天又结合之前的例子,整理了一篇类似于"实战系列"的文档, 详细说明了 rpm 中的一些细节配置在multipkg中怎么写,以便读者能通过multipkg实现rpm/spec的高阶功能:另外, 晚上总结了最近和以前的几个思路,给multipkg加了一些功能,还未合并到作者的master分支,需要使用的同学可以直接从我 的仓库来获取: git clone https://github.com/duanjigang1983/m

Centos使用checkinstall制作RPM包的方法

一.checkinstall的安装 目前最新版本是1.6.2,可以按下面的方式下载安装.  代码如下 复制代码 wget http://asic-linux.com.mx/~izto/checkinstall/files/source/checkinstall-1.6.2.tar.gz tar  zxvf checkinstall-1.6.2.tar.gz cd checkinstall-1.6.2 make  && make install 不过我在centos6.5 X64上安装时,并

Centos6_64 rpm打包实践

安装rpmbuild sudo yum install rpm-build 普通用户的配置 /home/you/rpmbuild/ 假设是要构建rpm的目录   先说说rpmbuild有什么用,给一个例子: echo "%  _topdir/home/you/rpmbuild" > ~/.rpmmacros mkdir -p /home/you/rpmbuild/{SPECS,BUILD,SRPMS,RPMS,SOURCES}   /usr/lib/rpm/macros 中配置可