Centos系统中用mock构建rpm的方法

  • Post category:Linux

当需要构建自己的rpm软件包时,CentOS系统提供的mock工具可以非常方便地进行代码构建。使用mock可以自动构建并测试rpm包,从而简化了构建软件包的流程,减少了构建错误。

以下是在CentOS系统中使用mock构建rpm的步骤:

1. 安装mock

在CentOS系统上,可以通过以下命令安装mock:

sudo yum install mock

2. 创建mock配置文件

/etc/mock目录下创建一个配置文件,命名为<distro>-<release>-<arch>.cfg。例如,为CentOS 7 x86_64创建一个配置文件:

sudo vim /etc/mock/epel-7-x86_64.cfg

使用以下内容填充文件:

# /etc/mock/epel-7-x86_64.cfg
#
# This is a mock config file. See the mock man-page for more info,
# or look at /etc/mock/site-defaults.cfg for more examples.
#
config_opts['root'] = 'epel-7-x86_64'
config_opts['target_arch'] = 'x86_64'
config_opts['legal_host_arches'] = ('x86_64',)
config_opts['chroothome'] = '/var/lib/mock'
config_opts['cache_topdir'] = '/var/cache/mock'
config_opts['cleanup_on_exit'] = False
config_opts['rpmbuild_timeout'] = 7200
config_opts['macros']['%_disable_source_fetch'] = 1
config_opts['package_manager'] = 'yum'
config_opts['yum.conf'] = '[main]\nkeepcache=1\n[epel]\nname=Extra Packages for Enterprise Linux 7 - $basearch\n#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch\nmirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7\n'
config_opts['dist'] = 'epel-7'
config_opts['releasever'] = '7'

config_opts['build_requires'] += ['gcc', 'make']

这个例子配置了mock用于构建和测试rpm软件包的基本设置,设定了构建环境,配置了mock使用的yum源。

3. 准备源代码并打包

将要打包的源代码放在一个独立的目录下,例如 /home/myproject下。将代码打包为一个tar.gz压缩包:

cd /home/myproject
tar czf myproject-1.0.tar.gz *

4. 创建SPEC文件

在rpmbuild环境中,需要一个.spec文件描述要构建的软件包,包括软件包版本、依赖项、文件清单等。可以使用以下命令创建样板:

cd /home/myproject
mock -r epel-7-x86_64 --spec=/usr/share/doc/mock/examples/example.spec --sources=myproject-1.0.tar.gz --dnf install dependency1 dependency2

其中example.spec是一个mock提供的示例.spec文件,--sources指定了打包的源代码文件,--dnf install指定了需要在构建环境中安装的依赖项。

构建软件包前,需要编辑.spec文件,设置软件包名称、版本、作者等其他信息。

5. 指定mock配置文件并构建

使用以下命令来构建rpm软件包:

cd /home/myproject
mock -r epel-7-x86_64 --resultdir=./rpmresult myproject-1.0.tar.gz

其中,-r epel-7-x86_64指定使用哪个mock配置文件进行构建,--resultdir指定rpm软件包构建结果的输出目录。

6. 查看构建结果

rpm软件包的构建结果将存储在了./rpmresult目录下,包括.src.rpm和构建好的.rpm文件。

示例:

假设我们要构建的软件包名称是myproject,版本号是1.0,依赖项为gccmake

/etc/mock/目录下创建mock配置文件,为epel-7-x86_64.cfg,内容为:

config_opts['root'] = 'epel-7-x86_64'
config_opts['target_arch'] = 'x86_64'
config_opts['legal_host_arches'] = ('x86_64',)
config_opts['chroothome'] = '/var/lib/mock'
config_opts['cache_topdir'] = '/var/cache/mock'
config_opts['cleanup_on_exit'] = False
config_opts['rpmbuild_timeout'] = 7200
config_opts['macros']['%_disable_source_fetch'] = 1
config_opts['package_manager'] = 'yum'
config_opts['yum.conf'] = '[main]\nkeepcache=1\n[epel]\nname=Extra Packages for Enterprise Linux 7 - $basearch\n#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch\nmirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7\n'
config_opts['dist'] = 'epel-7'
config_opts['releasever'] = '7'

config_opts['build_requires'] += ['gcc', 'make']

下载并打包myproject的源代码:

cd /home/myproject
tar czf myproject-1.0.tar.gz *

使用mock命令生成.spec文件:

mock -r epel-7-x86_64 --spec=/usr/share/doc/mock/examples/example.spec --sources=myproject-1.0.tar.gz --dnf install gcc make

打开myproject.spec文件,并编辑软件包名称、版本、作者等其他信息。

使用mock构建rpm包:

mock -r epel-7-x86_64 --resultdir=./rpmresult myproject-1.0.tar.gz

查看构建结果,输出目录为./rpmresult

myproject-1.0-1.el7.src.rpm
myproject-1.0-1.el7.x86_64.rpm

这里生成了一个.src.rpm源文件和一个.rpm二进制文件,你可以使用rpm命令来安装.rpm软件包,例如:

sudo rpm -ivh ./rpmresult/myproject-1.0-1.el7.x86_64.rpm