rpmbuild學習總結

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. 1.Set up the directory structure  

  2. 2.Place the sources in the right directory  

  3. 3.Create a spec file that tells the rpmbuild command what to do  

  4. 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

132351574.jpg

默認的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/

#源代碼包,能夠帶多個source0source1等源,後面能夠用%{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

  這個宏利用系統中的gziptar等命令,來解壓源程序包。RPM會自動探測源程序是否壓縮,若是壓縮,它會用gzip將其解壓縮,不然直接使用

tar命令展開包中文件,其格式爲

%setup  [-n name] [-c] [-D] [-T] [-b N] [-a N]

注意:[]所括爲可選項。

1)當沒有任何選項時

   這個宏用來解壓默認的源程序包(由頭文件SourceSource0域指定).注意:源程序包中的文件應用軟件名-版本號做爲其上層目錄,這樣%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

相關文章
相關標籤/搜索