常见的Linux发行版主要可以分为两类,类ReadHat系列和类Debian系列,这里我们是以其软件包的格式来划分的,这两类系统分别提供了自己的软件包管理系统和相应的工具。类RedHat系统中软件包的后缀是rpm;类Debian系统中软件包的后缀是deb。另一方面,类RedHat系统提供了同名的rpm命令来安装、卸载、升级rpm软件包;类Debian系统同样提供了dpkg命令来对后缀是deb的软件包进行安装、卸载和升级等操作。
rpm的全称是Redhat
Package Manager,常见的使用rpm软件包的系统主要有Fedora、CentOS、openSUSE、SUSE企业版、PCLinuxOS以及Mandriva Linux、Mageia等。使用deb软件包后缀的类Debian系统最常见的有Debian、Ubuntu、Finnix等。
从软件运行的结构来说,一个软件主要可以分为三个部分:可执行程序、配置文件和动态库。当然还有可能会有相关文档、手册、供二次开发用的头文件以及一些示例程序等等。其他部分都是可选的,只有可执行文件是必须的。
rpmbuild默认工作路径的确定,通常由在/usr/lib/rpm/macros这个文件里的一个叫做%_topdir的宏变量来定义。如果用户想更改这个目录名,rpm官方并不推荐直接更改这个目录,而是在用户家目录下建立一个名为.rpmmacros的隐藏文件(注意前面的点不能少,这是Linux下隐藏文件的常识),然后在里面重新定义%_topdir,指向一个新的目录名。这样就可以满足某些“高级”用户的差异化需求了。通常情况下.rpmmacros文件里一般只有一行内容
1 %_topdir $HOME/rpmbuild
echo '%_topdir %(echo $HOME)/path/to/dir' > .rpmmacros
rpmdev-setuptree会在%_topdir自动生成目录结构
此外rpm -ivh name-version-release.src.rpm时,会在%_topdir的相关目录中安装包(其实就是拷贝),此过程需要%_topdir变量
rpmbuild --showrc
rpmbuild --target x86_64 可指明目标平台架构
2. spec文件
Name: myapp <===软件包的名字(后面会用到) Version: 0.1.0 <===软件包的版本(后面会用到) Release: 1%{?dist} <===发布序号 Summary: my first rpm <===软件包的摘要信息 Group: <===软件包的安装分类,参见/usr/share/doc/rpm-4.x.x/GROUPS这个文件 License: GPL <===软件的授权方式 URL: <===这里本来写源码包的下载路径或者自己的博客地址或者公司网址之类 Source0: %{name}-%{version}.tar.gz <===源代码包的名称(默认时rpmbuid回到SOURCES目录中去找),这里的name和version就是前两行定义的值。如果有其他配置或脚本则依次用Source1、Source2等等往后增加即可。 BuildRoot: %{_topdir}/BUILDROOT <=== 这是make install时使用的“虚拟”根目录,最终制作rpm安装包的文件就来自这里。 BuildRequires: <=== 在本机编译rpm包时需要的辅助工具,以逗号分隔。假如,要求编译myapp时,gcc的版本至少为4.4.2,则可以写成gcc >=4.2.2。还有其他依赖的话则以逗号分别继续写道后面。 Requires: <=== 编译好的rpm软件在其他机器上安装时,需要依赖的其他软件包,也以逗号分隔,有版本需求的可以 %description <=== 软件包的详细说明信息,但最多只能有80个英文字符
%{_tmppath}代表的路径为 /var/tmp
SPEC文件各阶段:
-
%prep
源代码的解压和打补丁,最常见的指令%setup -q
位于SOURCES目录下的源码包必须为name-version.tar.gz格式,会自动进行后续阶段的目录切换和设置
-
%build
一般执行configure和make,常见指令%configure make %{?_smp_mflags}
软件安装时路径默认设置(configure的默认设置):
- --build=x86_64-redhat-linux-gnu
- --host=x86_64-redhat-linux-gnu
- --program-prefix=
- --prefix=/usr
- --exec-prefix=/usr
- --bindir=/usr/bin
- --sbindir=/usr/sbin
- --sysconfdir=/etc
- --datadir=/usr/share
- --includedir=/usr/include 二次开发的头文件
- --libdir=/usr/lib64 库文件路径,32和64系统是不同的
- --libexecdir=/usr/libexec
- --localstatedir=/var
- --sharestatedir=/var/lib
- --mandir=/usr/share/man
- --infodir=/usr/share/info
%configure是个宏常量,会自动设置上面的默认路径,可接受额外参数,可不使用%configure的宏,自定义configure的配置参数,同样可给make传递额外参数
-
%install
这个阶段执行make install操作,会在%_buildrootdir中建好目录结构,将需要打包到rpm中的文件从%_builddir复制到%_buildrootdir对应目录中,常见指令1 rm -rf $RPM_BUILD_ROOT 2 make install DESTDIR=$RPM_BUILD_ROOT
$RPM_BUILD_ROOT即是buildroot变量,可写成%{buildroot},需小写.如果有额外的配置文件,启动脚本,可手动用copy,install拷贝到%{buildroot}目录中.
-
%clean
编译完成后的清理工作,对%{buildroot}目录清空,make clean等 -
%files
说明%{buildroot}目录下的哪些文件和目录打包到rpm中1 %files 2 %defattr(-,root,root,-) 3 %doc 4 5 %defattr(文件权限,用户名,组名,目录权限)
如果没有定制特殊权限,则使用默认%defattr(-,root,root,-)设置缺省权限
%files
%{_bindir}/*
%{_libdir}/*
%config(noreplace) %{_sysconfdir}/*.conf
打包文件列表可以宏常量开头,也可以/开头,无区别,都表示从%{buildroot}中复制到rpm中,相对路径,表示复制的文件位于%{_builddir}目录,适用于在%install阶段没有复制到%{buildroot}目录中的文件,i.g. README,LICENSE
不想将%{buildroot}中的文件或目录打包,则使用%exclude file_name.
%{buildroot}所有文件都要显式指明是否打包到rpm中.
%doc宏,所有跟在这个宏后面的文件都来自%{_builddir}目录,安装rpm时,此宏所指的的文件都会安装到/usr/share/doc/name-version/中 - %changelog
记录日志变更* date +"%a %b %d %Y" author mailbox version - something that has changed
- %package
定义子包%package -n openstack-dashboard Summary: Openstack web user interface reference implementation Group: Applications/System Requires: httpd %description doc Documentation for the Django Horizon application for talking with Openstack
Group:
软件包所属类别,具体类别有:
- Amusements/Games (娱乐/游戏)
- Amusements/Graphics(娱乐/图形)
- Applications/Archiving (应用/文档)
- Applications/Communications(应用/通讯)
- Applications/Databases (应用/数据库)
- Applications/Editors (应用/编辑器)
- Applications/Emulators (应用/仿真器)
- Applications/Engineering (应用/工程)
- Applications/File (应用/文件)
- Applications/Internet (应用/因特网)
- Applications/Multimedia(应用/多媒体)
- Applications/Productivity (应用/产品)
- Applications/Publishing(应用/印刷)
- Applications/System(应用/系统)
- Applications/Text (应用/文本)
- Development/Debuggers (开发/调试器)
- Development/Languages (开发/语言)
- Development/Libraries (开发/函数库)
- Development/System (开发/系统)
- Development/Tools (开发/工具)
- Documentation (文档)
- System Environment/Base(系统环境/基础)
- System Environment/Daemons (系统环境/守护)
- System Environment/Kernel (系统环境/内核)
- System Environment/Libraries (系统环境/函数库)
- System Environment/Shells (系统环境/接口)
- User Interface/Desktops(用户界面/桌面)
- User Interface/X (用户界面/X窗口)
- User Interface/X Hardware Support (用户界面/X硬件支持)
practice
一.libmad-0.15.1b.tar.gz
http://downloads.sourceforge.net/mad/libmad-0.15.1b.tar.gz
- cd ~
- mkdir -pv rpmbuild/{BUILD,SOURCES,RPMS,SRPMS,SPECS}
-
cd rpmbuild && rpmdev-newspec -o SPECS/libmad.spec
-
libmad.spec
View Code1 Name: libmad 2 Version: 0.15.1b 3 Release: 1%{?dist} 4 Summary: MP3 Codec 5 6 Epoch: 1 7 Provides: libmad 8 Packager: occurence 9 Vendor: occurence 10 Group: System Environment/Base 11 License: GPL 12 Distribution: instrumentation 13 URL: http://downloads.sourceforge.net/mad/libmad-0.15.1b.tar.gz 14 BuildRoot: %{_topdir}/BUILDROOT 15 Source0: %{name}-%{version}.tar.gz 16 Source1: mere_doc 17 18 BuildRequires: gcc,gcc-c++ 19 Requires: gcc,gcc-c++ 20 #Conflicts: 21 BuildArch: x86_64 22 23 %description 24 libmad mp3 codec 25 26 %package devel 27 Summary: Development files for %{name} 28 Group: Development/Libraries 29 Requires: %{name}%{?_isa} = %{version}-%{release} 30 31 %description devel 32 The %{name}-devel package contains libraries and header files for 33 developing applications that use %{name}. 34 35 36 %prep 37 %setup -q 38 install -pm 777 %{SOURCE1} . 39 40 41 %build 42 sed -i '/-fforce/d' configure 43 sed -i '/-fforce-mem/d' configure 44 %configure --enable-shared 45 make %{?_smp_mflags} 46 47 48 %install 49 rm -rf $RPM_BUILD_ROOT 50 make install DESTDIR=$RPM_BUILD_ROOT 51 #%make_install 52 #find $RPM_BUILD_ROOT -name '*.la' -exec rm -f {} ';' 53 54 %clean 55 #rm -rf $RPM_BUILD_ROOT 56 57 %post -p /sbin/ldconfig 58 59 %postun -p /sbin/ldconfig 60 61 62 %files 63 %defattr(-,root,root,-) 64 %doc 65 %{_libdir}/ 66 %{_includedir}/* 67 68 %files devel 69 %doc mere_doc 70 %{_includedir}/* 71 %{_libdir}/*.so 72 73 74 %changelog 75 * Fri Jun 05 2020 margin <margin@margin.margin.com> 0.15.1b 76 - Initail version