1. 程式人生 > >rpm包製作之——nginx

rpm包製作之——nginx

環境:CentOS release 6.5

rpmbuild安裝

# yum install -y rpmdevtools rpm-build

建立一個RPM構建根目錄結構(預設將再當前使用者主目錄下),如果需要改變次預設位置,可以修改配置檔案:~/.rpmmacros中變數_topdir對應

# rpmdev-setuptree

檢視所有的巨集

# rpmbuild –showrc

目錄結構

--BUILD #編譯之前,如解壓包後存放的路徑
--BUILDROOT #編譯後存放的路徑
--RPMS #打包完成後rpm包存放的路徑
--SOURCES #源包所放置的路徑
--SPECS #spec文件放置的路徑 --SPRMS #原始碼rpm包放置的路徑自動配置命令建立一個RPM構建根目錄結構,並配置一些必要操作。

rpmbuild命令的用法:

1 從spec文件建立有以下選項:

-bp  #只執行spec的%pre 段(解開原始碼包並打補丁,即只做準備)
-bc  #執行spec的%pre和%build 段(準備並編譯)
-bi  #執行spec中%pre,%build與%install(準備,編譯並安裝)
-bl  #檢查spec中的%file段(檢視檔案是否齊全)
-ba  #建立原始碼與二進位制包(常用)
-bb  #只建立二進位制包(常用)
-bs #只建立原始碼包

2 從tarball包建立,與spec類似

-tp #對應-bp
-tc #對應-bc
-ti #對應-bi
-ta #對應-ba
-tb #對應-bb
-ts #對應-bs

3 從原始碼包建立

--rebuild  #建立二進位制包,通-bb
--recompile  #同-bi
* rpmbuild的其他引數
--buildroot=DIRECTORY   #確定以root目錄建立包
--clean  #完成打包後清除BUILD下的檔案目錄
--nobuild  #不進行%build的階段
--nodeps  #不檢查建立包時的關聯檔案
--nodirtokens --rmsource #完成打包後清除SOURCES --rmspec #完成打包後清除SPEC --short-cricuit --target=CPU-VENDOR-OS #確定包的最終使用平臺

軟體包所屬類別,具體類別有:

# less /usr/share/doc/rpm-4.8.0/GROUPS

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硬體支援)

其他

make %{?_smp_mflags}
它就自動將軟體安裝時的路徑自動設定成如下約定:
可執行程式/usr/bin
依賴的動態庫/usr/lib或者/usr/lib64視作業系統版本而定。
二次開發的標頭檔案/usr/include
文件及手冊/usr/share/man

%setup 不加任何選項,僅將軟體包開啟。
%setup -n newdir 將軟體包解壓在newdir目錄。
%setup -c 解壓縮之前先產生目錄。
%setup -b num 將第num個source檔案解壓縮。
%setup -T 不使用default的解壓縮操作。
%setup -T -b 0 將第0個原始碼檔案解壓縮。
%setup -c -n newdir 指定目錄名稱newdir,並在此目錄產生rpm套件。
%patch 最簡單的補丁方式,自動指定patch level。
%patch 0 使用第0個補丁檔案,相當於%patch ?p 0。
%patch -s 不顯示打補丁時的資訊。
%patch -T 將所有打補丁時產生的輸出檔案刪除。

/sbin/install-info –delete %{_infodir}/%{name}.info %{_infodir}/dir 2> /dev/null || :
These two scriptlets tell install-info to add entries for the info pages to the main index file on installation and remove them at erase time. The “|| :” in this case prevents failures that would typically affect systems that have been configured not to install any %doc files, or have read-only mounted, %_netsharedpath /usr/share.

Nginx rpm

# vim ~/rpmbuild/SPECS/httpd.spec

Name:   nginx   # 軟體包名稱
Version:    1.9.9   # 版本號,(不能使用-)
Release:    1%{?dist}   # release號,對應下面的changelog,如 nginx-1.9.9-1.el6.x86_64.rpm
Summary:    nginx_install   # 簡要描述資訊

Group:  System Environment/Daemons 
License:    GPLv2
URL:    http://nginx.org/download
Source0:    %{name}-%{version}.tar.gz   # source主要是引用一下自己定義好的指令碼,配置檔案之類的內容
Source1:    nginx_init
Source2:    nginx.conf
BuildRoot:  %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

BuildRequires:  gcc,gcc-c++,pcre-devel,zlib-devel,make,openssl-devel,gd-devel
Requires:   pcre-devel,zlib-devel,openssl-devel,gd-devel
#軟體包詳述
%description
Build nginx-1.9.9.tar.gz to nginx-1.9.9.rpm
#構建包前的處理
%prep
#靜默模式解壓並cd
%setup -q
#生成:這裡主要是構建二進位制包的的時候執行編譯生成二進位制檔案
%build export DESTDIR=%{buildroot}
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/a
ccess.log --pid-path=/var/run/nginx/nginx.pid  --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre --with-http_image_filter_module --with-file-aio
# 多處理器的話,可以加 -j 引數
make %{?_smp_mflags}
#構建的時候把當前檔案安裝到系統目錄$RPM_BUILD_ROOT/下,二進位制安裝的時候是安裝檔案到/根目錄下    
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
#%{__install}這個巨集代表install命令
%{__install} -p -D -m 0755 %{SOURCE1} %{buildroot}/etc/rc.d/init.d/nginx
%{__install} -p -D %{SOURCE2} %{buildroot}/etc/nginx/nginx.conf
#rpm安裝前執行的指令碼
#$1有3個值,代表動作,安裝型別,處理型別 1:表示安裝 2:表示升級 0:表示解除安裝
%pre
if [ $1 == 1 ];then
    /usr/sbin/groupadd nginx 2> /dev/null
    /usr/sbin/useradd -g nginx -M -s /sbin/nologin nginx 2> /dev/null
fi
#rpm安裝後執行的指令碼
%post
if [ $1 == 1 ];then
    /sbin/chkconfig --add nginx
    /sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir 2> /dev/null || :
    mkdir -p /var/log/nginx/
    touch /var/log/nginx/error.log /var/log/nginx/access.log
    mkdir -p /var/run/nginx/
    touch /var/run/nginx/nginx.pid
fi
#rpm解除安裝前執行的指令碼
%preun
if [ $1 == 0 ];then
    /usr/sbin/groupdel nginx 2> /dev/null
    /usr/sbin/userdel -r nginx 2> /dev/null
    /sbin/chkconfig --del nginx 2> /dev/null
    /etc/init.d/nginx stop > /dev/null 2>&1
    /sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir 2> /dev/null || :
fi
#rpm解除安裝後執行的指令碼
%postun
#清理段,clean的主要作用就是刪除BUILD
%clean
rm -rf %{buildroot}
#檔案列表段,這個階段是把前面已經編譯好的內容要打包了,其中exclude是指要排除什麼不打包進來
%files
#%%defattr (-,root,root) 指定包裝檔案的屬性,分別是(mode,owner,group),-表示預設值,對文字檔案是0644,可執行檔案是0755
%defattr(-,root,root,-)
/etc/nginx/
%attr(0755,root,root) /etc/rc.d/init.d/nginx
%config(noreplace) /etc/nginx/nginx.conf
#/usr/html/index.html
#/usr/html/50x.html
/usr/local/nginx/html/50x.html
/usr/local/nginx/html/index.html
/usr/sbin/nginx
%doc
#變更日誌
%changelog
*  Thu Dec 01 2016 tian <tangytchn@foxmail.com> - 1.9.9-1.el6
- Initial version