rpmbuild學習總結html
版本V1.0nginx
時間2013-05-09web
版權GPLsql
做者itnihaoapp
郵箱 itnihao@qq.comdom
博客 http://itnihao.blog.51cto.comide
如需從新發行,請註明以上信息,謝謝合做post
rpmbuild的原理,意義,在此不介紹了,本文主要是一個思路,具體參考官方文檔學習
http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/index.html
ui
一,rpmbuild的步驟
1.Set up the directory structure
2.Place the sources in the right directory
3.Create a spec file that tells the rpmbuild command what to do
4.Build the source andbinary RPMs
二,rpmbuild各目錄的做用
BUILD | The rpmbuild command builds software in this directory |
RPMS | The rpmbuild command stores binary RPMs it reates in this irectory |
SOURCES | You should put the sources for the application in this directory |
SPECS | You should place the spec file for each RPM you plan to make in this directory |
SRPMS | The rpmbuild command places source RPMs in this directory |
三,rpmbuild系統內置變量
rpmbuild --showrc
useradd admin
su - admin
mkdir -pv rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
echo "% _topdir /home/admin/rpmbuild" >~/.rpmmacros
rpmbuild --showrc|grep _topdir
默認的spec格式以下
Name: Version: Release: 1%{?dist} Summary: Group: License: URL: Source0: BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) BuildRequires: Requires: %description %prep %setup -q %build %configure make %{?_smp_mflags} %install rm -rf %{buildroot} make install DESTDIR=%{buildroot} %clean rm -rf %{buildroot} %files %defattr(-,root,root,-) %doc %changelog
四,實例說明
#定義變量
%define nginx_home %{_localstatedir}/cache/nginx %define nginx_user nginx %define nginx_group nginx
# 軟件包的內容概要
Summary: high performance web server
#軟件包的名稱
Name: nginx
#軟件包的版本
Version: 1.2.6
#軟件包的發佈實際版本號
Release: 1%{?dist}.ngx
#發行商或者打包組織的信息
Vendor: nginx inc.
#軟件的主頁
URL: http://nginx.org/
#源代碼包,能夠帶多個source0,source1等源,後面能夠用%{SOURCE0},%{SOURCE1}引用
Source0: http://nginx.org/download/%{name}-%{version}.tar.gz Source1: logrotate Source2: nginx.init Source3: nginx.sysconf Source4: nginx.conf Source5: nginx.vh.default.conf Source6: nginx.vh.example_ssl.conf Source7: nginx.suse.init Source8: nginx.vh.example.conf
#軟件受權方式
License: 2-clause BSD-like license %if 0%{?suse_version}
#軟件分組
Group: Productivity/Networking/Web/Servers %else Group: System Environment/Daemons %endif
#安裝或者編譯時使用的「虛擬目錄」
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
#須要依賴的軟件包
BuildRequires: zlib-devel BuildRequires: pcre-devel BuildRequires: perl %if 0%{?suse_version} BuildRequires: libopenssl-devel Requires(pre): pwdutils %else BuildRequires: openssl-devel Requires: initscripts >= 8.36 Requires(pre): shadow-utils Requires(post): chkconfig %endif
#指明本軟件一些特定的功能,以便與其餘rpm識別
Provides: webserver
#軟件的詳細說明
%description nginx [engine x] is a HTTP and reverse proxy server, as well as a mail proxy server %package debug Summary: debug version of nginx Group: System Environment/Daemons Requires: nginx %description debug not stripped version of nginx build with the debugging log support %prep
#預處理腳本
# 該段內容爲安裝前腳本程序。它在軟件包安裝以前執行,一般是檢測操做環境,創建有關目錄,清理多餘文件等等,爲軟件包的順利安裝作準備。本段不多使用 ,其段名格式爲: %pre [子包選項]
%setup -q
#此爲預處理階段,其內容爲預處理腳本程序,該程序完成如下任務:
1.創建軟件編譯用目錄
2.將源程序解壓縮
3.經過打補丁,升級源程序
4.執行其餘一些操做,使源程序隨時可進行編譯
在此腳本程序中,能夠使用以下兩個宏命令:
%setup
這個宏利用系統中的gzip與tar等命令,來解壓源程序包。RPM會自動探測源程序是否壓縮,若是壓縮,它會用gzip將其解壓縮,不然直接使用
tar命令展開包中文件,其格式爲
%setup [-n name] [-c] [-D] [-T] [-b N] [-a N]
注意:[]所括爲可選項。
(1)當沒有任何選項時
這個宏用來解壓默認的源程序包(由頭文件Source或Source0域指定).注意:源程序包中的文件應用「軟件名-版本號」做爲其上層目錄,這樣%setup宏就能夠正常工做。若是不以「軟件名-版本號」做爲其上層目錄。則%setup宏工做時有一個指令「cd 軟件包-版本號」(轉目錄)
會由於系統中沒有此目錄而出錯退出(除非在此宏上面加上創建此目錄的命令)
(2)-n name引用目錄
(3)-c: 此選項的做用是建立上層目錄(「軟件名-版本號」目錄)並轉到這個目錄。
(4)-D 解壓源程序以前不要刪除軟件的上層目錄(軟件名-版本號)
(5)-T 本選項的做用是不解壓默認的源程序包(由文件頭的Source或者Source0域所定義)
(6)-b -N 本選項指示RPM在轉到上層目錄前解壓第N個源程序包(由文件頭SourceN域定義),這適用於含上層目錄的源程序包
(7) -a N 本選項指示RPM在轉到上層目錄後再解壓第N個源程序包
%patch
此宏利用系統中的patch命令,來給指定的源程序包打補丁,從而將程序升級。其使用格式爲:
%patch [-P N] [-p N] [-b name] [-E]
注: []所括爲可選項
(1) 當沒有任何選項時: 沒有任何選項時,該宏使用的是默認的補丁文件(第0個補丁文件),即由文件頭Patch或Patch0域所定義的文件 patch命令用了兩個選項:(有關patch命令用法,詳見其用戶手冊) * -p :這個選項用於肯定patch所要操做的文件。它針對補丁文件頭部的文件名,刪除名字中指定數目個 斜槓(/)前面的全部字符,從而獲得要操做的文件名。 * -s :這個選項指示patch在打補丁過程當中不輸出任何信息,即便有錯誤發生。 (2) -P N : 使用此選項以指示RPM使用第N個補丁文件(由文件頭PatchN域定義)。 (3) -p N : 此選項與其參數是由%patch宏直接傳給patch命令的。請參見上面patch命令所用的-p選項的介紹。 (4) -b name : 當有多個patch命令操做同一個文件時,patch會將原文件換名保存(其後綴變做.orig) (5) -E : 此選項直接傳給patch命令,其做用是:若是一個文件打完補丁後內容爲空(字節數爲0),則刪除這個文件。
#開始構建包
%build
此爲編譯段,其內容爲編譯腳本程序。該程序完成源程序的編譯和鏈接。一個最簡單的例子就是程序中僅有一個make命令。這適用於大部分狀況 ,由於多數軟件均有本身的makefile,這樣經過make命令就可實現編譯與鏈接。若是沒有makefile的話,須要軟件包製做者本身在編譯段書寫上一系列的編譯鏈接命令。
./configure \ --prefix=%{_sysconfdir}/nginx/ \ --sbin-path=%{_sbindir}/nginx \ --conf-path=%{_sysconfdir}/nginx/nginx.conf \ --error-log-path=%{_localstatedir}/log/nginx/error.log \ --http-log-path=%{_localstatedir}/log/nginx/access.log \ --pid-path=%{_localstatedir}/run/nginx.pid \ --lock-path=%{_localstatedir}/run/nginx.lock \ --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp \ --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp \ --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp \ --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp \ --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp \ --user=%{nginx_user} \ --group=%{nginx_group} \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_sub_module \ --with-http_dav_module \ --with-http_gzip_static_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_stub_status_module \ --with-mail \ --with-mail_ssl_module \ --with-file-aio \ --with-ipv6 \ --with-debug \ --with-cc-opt="%{optflags} $(pcre-config --cflags)" \ $* make %{?_smp_mflags} %{__mv} %{_builddir}/%{name}-%{version}/objs/nginx \ %{_builddir}/%{name}-%{version}/objs/nginx.debug ./configure \ --prefix=%{_sysconfdir}/nginx/ \ --sbin-path=%{_sbindir}/nginx \ --conf-path=%{_sysconfdir}/nginx/nginx.conf \ --error-log-path=%{_localstatedir}/log/nginx/error.log \ --http-log-path=%{_localstatedir}/log/nginx/access.log \ --pid-path=%{_localstatedir}/run/nginx.pid \ --lock-path=%{_localstatedir}/run/nginx.lock \ --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp \ --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp \ --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp \ --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp \ --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp \ --user=%{nginx_user} \ --group=%{nginx_group} \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_sub_module \ --with-http_gzip_static_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_stub_status_module \ --with-file-aio \ --with-ipv6 \ --with-cc-opt="%{optflags} $(pcre-config --cflags)" \ $* make %{?_smp_mflags}
#把軟件安裝到虛擬的根目錄中
%install
此爲安裝段,其內容是安裝腳本程序。該程序將已編譯鏈接好的執行程序或其它文件存放到指定目錄下,這些程序或文件供RPM打包時使用。一個最簡單的例子就是程序中僅用一個make install命令,從而完成安裝。這也須要相應的軟件有makefile維護文件。沒有的話,軟件包製做者也得本身寫指令。
%{__rm} -rf $RPM_BUILD_ROOT %{__make} DESTDIR=$RPM_BUILD_ROOT install %{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/nginx %{__mv} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/html $RPM_BUILD_ROOT%{_datadir}/nginx/ %{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/*.default %{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/fastcgi.conf %{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/log/nginx %{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/run/nginx %{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/cache/nginx %{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d %{__rm} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf %{__install} -m 644 -p %{SOURCE4} \ $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf %{__install} -m 644 -p %{SOURCE5} \ $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d/example.txt %{__install} -m 644 -p %{SOURCE6} \ $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d/example_ssl.conf %{__install} -m 644 -p %{SOURCE8} \ $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d/example.conf %{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig %{__install} -m 644 -p %{SOURCE3} \ $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx # install SYSV init stuff %{__mkdir} -p $RPM_BUILD_ROOT%{_initrddir} %if 0%{?suse_version} %{__install} -m755 %{SOURCE7} \ $RPM_BUILD_ROOT%{_initrddir}/nginx %else %{__install} -m755 %{SOURCE2} \ $RPM_BUILD_ROOT%{_initrddir}/nginx %endif # install log rotation stuff %{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d %{__install} -m 644 -p %{SOURCE1} \ $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx %{__install} -m644 %{_builddir}/%{name}-%{version}/objs/nginx.debug \ $RPM_BUILD_ROOT%{_sbindir}/nginx.debug
#清理臨時文件
%clean %{__rm} -rf $RPM_BUILD_ROOT
#定義哪些文件或者目錄會放入rpm中
%files %defattr(-,root,root) %{_sbindir}/nginx %dir %{_sysconfdir}/nginx %dir %{_sysconfdir}/nginx/conf.d %config(noreplace) %{_sysconfdir}/nginx/nginx.conf #%config(noreplace) %{_sysconfdir}/nginx/conf.d/default.conf %config(noreplace) %{_sysconfdir}/nginx/conf.d/example.conf %config(noreplace) %{_sysconfdir}/nginx/conf.d/example_ssl.conf %config(noreplace) %{_sysconfdir}/nginx/conf.d/example.txt %config(noreplace) %{_sysconfdir}/nginx/mime.types %config(noreplace) %{_sysconfdir}/nginx/fastcgi_params %config(noreplace) %{_sysconfdir}/nginx/scgi_params %config(noreplace) %{_sysconfdir}/nginx/uwsgi_params %config(noreplace) %{_sysconfdir}/nginx/koi-utf %config(noreplace) %{_sysconfdir}/nginx/koi-win %config(noreplace) %{_sysconfdir}/nginx/win-utf %config(noreplace) %{_sysconfdir}/logrotate.d/nginx %config(noreplace) %{_sysconfdir}/sysconfig/nginx %{_initrddir}/nginx %dir %{_datadir}/nginx %dir %{_datadir}/nginx/html %{_datadir}/nginx/html/* %attr(0755,root,root) %dir %{_localstatedir}/cache/nginx %attr(0755,root,root) %dir %{_localstatedir}/log/nginx %files debug
#%attr(權限,屬主,屬組)
%attr(0755,root,root) %{_sbindir}/nginx.debug
#rpm安裝前執行的腳本
%pre # Add the "nginx" user getent group %{nginx_group} >/dev/null || groupadd -r %{nginx_group} getent passwd %{nginx_user} >/dev/null || \ useradd -r -g %{nginx_group} -s /sbin/nologin \ -d %{nginx_home} -c "nginx user" %{nginx_user} exit 0
#rpm安裝後執行的腳本
%post
該段內容爲安裝後腳本程序。它在軟件包安裝完成以後執行,經常使用來創建符號鏈接,修改系統配置文件,運行ldconfig程序等,以利軟件的正常運
[ -d "/opt/web/www" ] [ "$?" != "0" ] && mkdir -p /opt/web/www # Register the nginx service if [ $1 -eq 1 ]; then /sbin/chkconfig nginx on /sbin/service nginx start #ngpassword is a tool for nginx to create password cat >/usr/sbin/ngpassword <<EOF #!/usr/bin/perl use strict; my \$pw=\$ARGV[0] ; print crypt(\$pw,\$pw)."\n"; EOF chmod 755 /usr/sbin/ngpassword fi
#preun rpm卸載前執行的腳本
%preun
#$1 表明動做
0表明卸載
1表明安裝
2表明升級
if [ $1 -eq 0 ]; then /sbin/service nginx stop > /dev/null 2>&1 /sbin/chkconfig --del nginx fi #postrun rpm卸載後執行的腳本 %postun if [ $1 -ge 1 ]; then /sbin/service nginx upgrade &>/dev/null || : fi
#變動日誌
%changelog * Thu Jan 31 2013 change config file<itnihao@qq.com> - 1.2.6
以上內容見附件
記錄一個相關內容http://blog.sina.com.cn/s/blog_5d867af101019b7i.html