制作一个简单的rpm包:helloworld
一. 简介
之前介绍yum是基于rpm的包管理工具,yum最终安装的是rpm包,那rpm包是如何来的呢?
按照网上的教程制作了个rpm包,这里记录下。
二. 过程
1)安装制作工具
yum -y install rpm-build rpm-devel rpmdevtools
2)生成开发目录
rpmdev-setuptree
3)源代码
现在,我们来编码源代码,这里我们写个脚本,输出Hello World!
mkdir -p ~/rpmbuild/SOURCES/helloworld-1.0.0
cd ~/rpmbuild/SOURCES/helloworld-1.0.0
touch helloworld
chmod 755 helloworld
echo '#!/bin/sh' >> helloworld
echo 'echo Hello World!' >> helloworld
cd ~/rpmbuild/SOURCES
tar zcvf helloworld-1.0.0.tar.gz helloworld-1.0.0
这样我们就有了我们的源代码helloworld-1.0.0.tar.gz
4)编写spec文件
cd ~/rpmbuild/SPECS
# 生成spec模版文件
rpmdev-newspec helloworld.spec
将内容修改为
Name: helloworld
Version: 1.0.0
Release: 1%{?dist}
Summary: helloworld
Group: Development/Tools
License: GPL
#URL:
Source0: %{name}-%{version}.tar.gz
#BuildRequires:
#Requires:
%description
%prep
%setup -q
%build
%install
mkdir -p $RPM_BUILD_ROOT/usr/bin
cp $RPM_BUILD_DIR/%{name}-%{version}/helloworld $RPM_BUILD_ROOT/usr/bin/
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root,-)
%doc
/usr/bin/helloworld
%changelog
5)打包
rpmbuild -ba SPECS/helloworld.spec
查看下最后的目录结构
tree ~/rpmbuild/
/root/rpmbuild/
├── BUILD
│ └── helloworld-1.0.0
│ ├── debugfiles.list
│ ├── debuglinks.list
│ ├── debugsources.list
│ ├── elfbins.list
│ └── helloworld
├── BUILDROOT
├── RPMS
│ └── x86_64
│ ├── helloworld-1.0.0-1.el7.x86_64.rpm
│ └── helloworld-debuginfo-1.0.0-1.el7.x86_64.rpm
├── SOURCES
│ ├── helloworld-1.0.0
│ │ └── helloworld
│ └── helloworld-1.0.0.tar.gz
├── SPECS
│ └── helloworld.spec
└── SRPMS
└── helloworld-1.0.0-1.el7.src.rpm
- BUILD是编译rpm包的临时目录
- BUILDROOT是最后生成rpm包的临时安装目录
- RPMS存放最终生成的rpm二进制包
- SOURCES是源代码(.tar.gz)存放目录
- SPECS用来存放spec文件
- SRPMS存放最终生成的rpm源码包
rpmbuild/RPMS/x86_64/helloworld-1.0.0-1.el7.x86_64.rpm就是我们打出来的rpm包
6)安装
yum install ~/rpmbuild/RPMS/x86_64/helloworld-1.0.0-1.el7.x86_64.rpm
或者
rpm -ivh helloworld-1.0.0-1.el7.x86_64.rpm
命令行运行
helloworld
Hello World!
好啦,成功了!
三. spec
好了,回过头再看看打包的步骤,最重要的莫过于helloworld.spec了,我们来详细解释下。
Name: helloworld
Version: 1.0.0
Release: 1%{?dist}
Summary: helloworld
Group: Development/Tools
License: GPL
名称、版本号、打包版本号、简介、Group、License
Source0: %{name}-%{version}.tar.gz
源代码路径,要确保在SOURCES目录下能找到该包
#BuildRequires:
编译需要的环境,如gcc>=4.7,这里不需要
#Requires:
该软件运行的依赖,如python rpm>=0:4.1.1,这里不需要
%description
详细描述
%prep
%setup -q
编译前的准备操作在这儿,%setup macro 会把 source code tarball 解开并自动进到 %{name}-%{version} 的目录中
%build
编译,对应源代码打包的./configure和make,例如(%configure –prefix=%{_prefix})
%install
mkdir -p $RPM_BUILD_ROOT/usr/bin
cp $RPM_BUILD_DIR/%{name}-%{version}/helloworld $RPM_BUILD_ROOT/usr/bin/
安装,对应源代码包打包的make install,一般我们是安装在$RPM_BUILD_ROOT下
%files
%defattr(-,root,root,-)
%doc
/usr/bin/helloworld
收集文件并创建二进制和源RPM文件
%clean
rm -rf $RPM_BUILD_ROOT
删除临时构建目录
四. 一些变量
%{_bindir} /usr/bin/
五. 结尾
先弄个简单的玩玩,后面有具体的需求再看看下面的链接
https://fedoraproject.org/wiki/Archive:BuildingPackagesGuide?rd=Docs/Drafts/BuildingPackagesGuide
参考: