制作PHP的RPM包详解及实例
制作PHP的RPM包教程
有时候为了方便源码包的安装,我们需要自己订制软件包的需求,我们会把一些源码包按照我们的需求来做成rpm包,当有了源码包就可以直接编译得到二进制安装包和其他任意包。specfile是制作rpm包最核心的部分,rpm包的制作就是根据specfile来实现的。下面是我以制作php的rpm开始介绍其制作方法。以下操作在CentOS6.664位系统进行。
下面我们以制作php的rpm开始介绍其制作方法。以下操作在CentOS6.664位系统进行。
安装rpm-build
[root@linuxeye.comSOURCES]#yum-yinstallrpm-build
建立工作车间目录
[root@linuxeye.comSOURCES]#vim~/.rpmmacros %_topdir/root/rpmbuild
[root@linuxeye.comSOURCES]#mkdir-pv~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
在redhat下,rpm包的默认制作路径在/usr/src/redhat下,但CentOS并没有该目录,因此,我们不得不自定义工作目录,这其中包含了6个目录(要求全部大写)
BUILD:源代码解压以后放的位置
RPMS:制作完成后的rpm包存放目录,为特定平台指定子目录(x86_64)
SOURCES:收集的源文件,源材料,补丁文件等存放位置
SPECS:存放spec文件,作为制作rpm包的领岗文件,以rpm名.spec
SRPMS:src格式的rpm包位置,既然是src格式的包,就没有平台的概念了
BuiltRoot:假根,使用install临时安装到这个目录,把这个目录当作根来用的,所以在这个目录下的目录文件,才是真正的目录文件。当打包完成后,在清理阶段,这个目录将被删除
[root@linuxeye.comSOURCES]#rpmbuild--showrc|greptopdir#工作车间目录:_topdir/root/rpmbuild
-14:_builddir%{_topdir}/BUILD
-14:_buildrootdir%{_topdir}/BUILDROOT
-14:_rpmdir%{_topdir}/RPMS
-14:_sourcedir%{_topdir}/SOURCES
-14:_specdir%{_topdir}/SPECS
-14:_srcrpmdir%{_topdir}/SRPMS
-14:_topdir/root/rpmbuild
rpmbuild--showrc显示所有的宏,以下划线开头,一个下划线:定义环境的使用情况,二个下划线:通常定义的是命令,为什么要定义宏,因为不同的系统,命令的存放位置可能不同,所以通过宏的定义找到命令的真正存放位置
收集源码文件脚本文件
[root@linuxeye.comSOURCES]#pwd /root/rpmbuild/SOURCES [root@linuxeye.comSOURCES]#ls php-5.4.45.tar.gz
编写SPEC文件
[root@linuxeye.comSPEC]#pwd /root/rpmbuild/SOURCES [root@linuxeye.comSPEC]#vimphp.spec#内容如下:
%define_userwww
%define_groupwww
%define_prefix/usr/local/php
Name:php#软件包名称
Version:5.4.45#版本号(不能使用-)
Release:1%{?dist}#release号,对应下面的changelog,如php-5.4.45-1.el6.x86_64.rpm
Summary:PHPisaserver-sidescriptinglanguageforcreatingdynamicWebpages#简要描述信息,最好不要超过50个字符,如要详述,使用下面的%description
Group:Development/Languages#要全用这里面的一个组:less/usr/share/doc/rpm-version/GROUPS
License:GPLv2#软件授权方式
URL:http://www.php.net#源码相关网站
Packager:yeho<lj2007331@gmail.com>#打包人的信息
Vendor:OneinStack#发行商或打包组织的信息
Source0:%{name}-%{version}.tar.gz#源代码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用
BuildRoot:%_topdir/BUILDROOT#安装或编译时使用的“虚拟目录”
Requires:libmcrypt
Requires:mhash
Requires:mcrypt
Requires:libiconv#定义php依赖的包,需要yum安装(此处使用epel源)
%description#软件包详述
PHPisawidely-usedgeneral-purposescriptinglanguagethatisespeciallysuitedforWebdevelopmentandcanbeembeddedintoHTML.
%prep#软件编译之前的处理,如解压
%setup-q#这个宏的作用静默模式解压并cd
%build#开始编译软件
%configure--prefix=%{_prefix}--with-config-file-path=%{_prefix}/etc\
--with-fpm-user=%{_user}--with-fpm-group=%{_group}--enable-fpm--enable-fileinfo\
--with-mysql=mysqlnd--with-mysqli=mysqlnd--with-pdo-mysql=mysqlnd\
--with-iconv-dir=/usr/local--with-freetype-dir--with-jpeg-dir--with-png-dir--with-zlib\
--with-libxml-dir=/usr--enable-xml--disable-rpath--enable-bcmath--enable-shmop--enable-exif\
--enable-sysvsem--enable-inline-optimization--with-curl--enable-mbregex--enable-inline-optimization\
--enable-mbstring--with-mcrypt--with-gd--enable-gd-native-ttf--with-openssl\
--with-mhash--enable-pcntl--enable-sockets--with-xmlrpc--enable-ftp--enable-calendar\
--with-gettext--enable-zip--enable-soap--disable-ipv6--disable-debug
makeZEND_EXTRA_LIBS='-liconv'%{?_smp_mflags}#%{?_smp_mflags}的意思是:如果就多处理器的话make时并行编译
%install#开始安装软件,如makeinstall
rm-rf%{buildroot}
makeINSTALL_ROOT=%{buildroot}install
rm-rf%{buildroot}/{.channels,.depdb,.depdblock,.filemap,.lock,.registry}
%{__install}-p-D-m0755sapi/fpm/init.d.php-fpm%{buildroot}/etc/init.d/php-fpm
%{__install}-p-D-m0644php.ini-production%{buildroot}/%{_prefix}/etc/php.ini
#rpm安装前执行的脚本
%pre
echo'/usr/local/lib'>/etc/ld.so.conf.d/local.conf
/sbin/ldconfig
if[$1==1-a-z"`grep^%{_user}/etc/passwd`"];then#$1有3个值,代表动作,安装类型,处理类型
groupadd%{_group}-g10000#1:表示安装
useradd-u10000-g10000-m%{_user}#2:表示升级
fi#0:表示卸载
#rpm安装后执行的脚本
%post
if[$1==1];then
[-z"`grep^'exportPATH='/etc/profile`"]&&echo"exportPATH=%{_prefix}/bin:\$PATH">>/etc/profile
[-n"`grep^'exportPATH='/etc/profile`"-a-z"`grep'%{_prefix}'/etc/profile`"]&&sed-i"s@^exportPATH=\(.*\)@exportPATH=%{_prefix}/bin:\1@"/etc/profile
/sbin/chkconfig--addphp-fpm
/sbin/chkconfigphp-fpmon
Mem=`free-m|awk'/Mem:/{print$2}'`#下面主要是参数的优化
if[$Mem-le640];then
Mem_level=512M
Memory_limit=64
elif[$Mem-gt640-a$Mem-le1280];then
Mem_level=1G
Memory_limit=128
elif[$Mem-gt1280-a$Mem-le2500];then
Mem_level=2G
Memory_limit=192
elif[$Mem-gt2500-a$Mem-le3500];then
Mem_level=3G
Memory_limit=256
elif[$Mem-gt3500-a$Mem-le4500];then
Mem_level=4G
Memory_limit=320
elif[$Mem-gt4500-a$Mem-le8000];then
Mem_level=6G
Memory_limit=384
elif[$Mem-gt8000];then
Mem_level=8G
Memory_limit=448
fi
sed-i"s@^memory_limit.*@memory_limit=${Memory_limit}M@"%{_prefix}/etc/php.ini
sed-i's@^output_buffering=@output_buffering=On\noutput_buffering=@'%{_prefix}/etc/php.ini
sed-i's@^;cgi.fix_pathinfo.*@cgi.fix_pathinfo=0@'%{_prefix}/etc/php.ini
sed-i's@^short_open_tag=Off@short_open_tag=On@'%{_prefix}/etc/php.ini
sed-i's@^expose_php=On@expose_php=Off@'%{_prefix}/etc/php.ini
sed-i's@^request_order.*@request_order="CGP"@'%{_prefix}/etc/php.ini
sed-i's@^;date.timezone.*@date.timezone=Asia/Shanghai@'%{_prefix}/etc/php.ini
sed-i's@^post_max_size.*@post_max_size=50M@'%{_prefix}/etc/php.ini
sed-i's@^upload_max_filesize.*@upload_max_filesize=50M@'%{_prefix}/etc/php.ini
sed-i's@^;upload_tmp_dir.*@upload_tmp_dir=/tmp@'%{_prefix}/etc/php.ini
sed-i's@^max_execution_time.*@max_execution_time=5@'%{_prefix}/etc/php.ini
sed-i's@^disable_functions.*@disable_functions=passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,popen@'%{_prefix}/etc/php.ini
sed-i's@^session.cookie_httponly.*@session.cookie_httponly=1@'%{_prefix}/etc/php.ini
sed-i's@^mysqlnd.collect_memory_statistics.*@mysqlnd.collect_memory_statistics=On@'%{_prefix}/etc/php.ini
cat>%{_prefix}/etc/php-fpm.conf<<EOF
;;;;;;;;;;;;;;;;;;;;;
;FPMConfiguration;
;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;
;GlobalOptions;
;;;;;;;;;;;;;;;;;;
[global]
pid=run/php-fpm.pid
error_log=log/php-fpm.log
log_level=warning
emergency_restart_threshold=30
emergency_restart_interval=60s
process_control_timeout=10s
daemonize=yes
;;;;;;;;;;;;;;;;;;;;
;PoolDefinitions;
;;;;;;;;;;;;;;;;;;;;
[%{_user}]
;listen=/dev/shm/php-cgi.sock
listen=127.0.0.1:9000
listen.backlog=-1
listen.allowed_clients=127.0.0.1
listen.owner=%{_user}
listen.group=%{_group}
listen.mode=0666
user=%{_user}
group=%{_group}
pm=dynamic
pm.max_children=12
pm.start_servers=8
pm.min_spare_servers=6
pm.max_spare_servers=12
pm.max_requests=2048
pm.process_idle_timeout=10s
request_terminate_timeout=120
request_slowlog_timeout=0
slowlog=log/slow.log
rlimit_files=51200
rlimit_core=0
catch_workers_output=yes
;env[HOSTNAME]=$HOSTNAME
env[PATH]=/usr/local/bin:/usr/bin:/bin
env[TMP]=/tmp
env[TMPDIR]=/tmp
env[TEMP]=/tmp
EOF
if[$Mem-le3000];then
sed-i"s@^pm.max_children.*@pm.max_children=$(($Mem/2/20))@"%{_prefix}/etc/php-fpm.conf
sed-i"s@^pm.start_servers.*@pm.start_servers=$(($Mem/2/30))@"%{_prefix}/etc/php-fpm.conf
sed-i"s@^pm.min_spare_servers.*@pm.min_spare_servers=$(($Mem/2/40))@"%{_prefix}/etc/php-fpm.conf
sed-i"s@^pm.max_spare_servers.*@pm.max_spare_servers=$(($Mem/2/20))@"%{_prefix}/etc/php-fpm.conf
elif[$Mem-gt3000-a$Mem-le4500];then
sed-i"s@^pm.max_children.*@pm.max_children=80@"%{_prefix}/etc/php-fpm.conf
sed-i"s@^pm.start_servers.*@pm.start_servers=50@"%{_prefix}/etc/php-fpm.conf
sed-i"s@^pm.min_spare_servers.*@pm.min_spare_servers=40@"%{_prefix}/etc/php-fpm.conf
sed-i"s@^pm.max_spare_servers.*@pm.max_spare_servers=80@"%{_prefix}/etc/php-fpm.conf
elif[$Mem-gt4500-a$Mem-le6500];then
sed-i"s@^pm.max_children.*@pm.max_children=90@"%{_prefix}/etc/php-fpm.conf
sed-i"s@^pm.start_servers.*@pm.start_servers=60@"%{_prefix}/etc/php-fpm.conf
sed-i"s@^pm.min_spare_servers.*@pm.min_spare_servers=50@"%{_prefix}/etc/php-fpm.conf
sed-i"s@^pm.max_spare_servers.*@pm.max_spare_servers=90@"%{_prefix}/etc/php-fpm.conf
elif[$Mem-gt6500-a$Mem-le8500];then
sed-i"s@^pm.max_children.*@pm.max_children=100@"%{_prefix}/etc/php-fpm.conf
sed-i"s@^pm.start_servers.*@pm.start_servers=70@"%{_prefix}/etc/php-fpm.conf
sed-i"s@^pm.min_spare_servers.*@pm.min_spare_servers=60@"%{_prefix}/etc/php-fpm.conf
sed-i"s@^pm.max_spare_servers.*@pm.max_spare_servers=100@"%{_prefix}/etc/php-fpm.conf
elif[$Mem-gt8500];then
sed-i"s@^pm.max_children.*@pm.max_children=120@"%{_prefix}/etc/php-fpm.conf
sed-i"s@^pm.start_servers.*@pm.start_servers=80@"%{_prefix}/etc/php-fpm.conf
sed-i"s@^pm.min_spare_servers.*@pm.min_spare_servers=70@"%{_prefix}/etc/php-fpm.conf
sed-i"s@^pm.max_spare_servers.*@pm.max_spare_servers=120@"%{_prefix}/etc/php-fpm.conf
fi
fi
#rpm卸载前执行的脚本
%preun
if[$1==0];then
/etc/init.d/php-fpmstop>/dev/null2>&1
/sbin/chkconfig--delphp-fpm
if[-e'/etc/profile.d/custom_profile_new.sh'];then
sed-i's@%{_prefix}/bin:@@'/etc/profile.d/custom_profile_new.sh
else
sed-i's@%{_prefix}/bin:@@'/etc/profile
fi
fi
#%postunrpm卸载后执行的脚本
%clean#clean的主要作用就是删除BUILD
rm-rf%{buildroot}
%files#指定哪些文件需要被打包,如/usr/local/php
%defattr(-,root,root,-)
%{_prefix}
%attr(0755,root,root)/etc/init.d/php-fpm
%changelog#日志改变段,这一段主要描述软件的开发记录
*SatOct242015yeho<lj2007331@gmail.com>5.4.45-1
-Initialversion
下面是php-redis.spec
[root@linuxeye.comSOURCES]#pwd
/root/rpmbuild/SOURCES
[root@linuxeye.comSOURCES]#ls
redis-2.2.7.tgz
[root@linuxeye.comSOURCES]#cd../SPEC
[root@linuxeye.comSPEC]#vimphp-redis.spec
%globalphp_extdir%(/usr/local/php/bin/php-config--extension-dir2>/dev/null||echo"undefined")
Name:php-redis
Version:2.2.7
Release:1%{?dist}
Summary:ThephpredisextensionprovidesanAPIforcommunicatingwiththeRediskey-valuestore.
Group:Development/Languages
License:PHP
URL:http://pecl.php.net/package/redis
Source0:redis-%{version}.tgz
BuildRoot:%_topdir/BUILDROOT
Requires:php
BuildRequires:php>=5.4.40
%description
ThephpredisextensionprovidesanAPIforcommunicatingwiththeRediskey-valuestore.
%prep
%setup-q-nredis-%{version}
%build
/usr/local/php/bin/phpize
%configure
make%{?_smp_mflags}
%install
rm-rf%{buildroot}
mkdir-p%{buildroot}%{php_extdir}
makeinstallINSTALL_ROOT=%{buildroot}
find%{buildroot}-nameredis.so-exec/bin/mv{}%{buildroot}%{php_extdir}\;
#rpm安装后执行的脚本
%post
if[$1==1];then
[-z"`grep'^extension_dir'/usr/local/php/etc/php.ini`"]&&echo"extension_dir=\"%{php_extdir}\"">>/usr/local/php/etc/php.ini
sed-i's@^extension_dir\(.*\)@extension_dir\1\nextension="redis.so"@'/usr/local/php/etc/php.ini
fi
#rpm卸载前执行的脚本
%preun
if[$1==0];then
/etc/init.d/php-fpmstop>/dev/null2>&1
sed-i'/redis.so/d'/usr/local/php/etc/php.ini
fi
#%postunrpm卸载后执行的脚本
if[$1==0];then
/etc/init.d/php-fpmstart>/dev/null2>&1
fi
%clean
rm-rf%{buildroot}
%files
%defattr(-,root,root,-)
%{php_extdir}/redis.so
%changelog
*SatOct242015yeho<lj2007331@gmail.com>2.2.7-1
-Initialversion
编译rpm包
[root@linuxeye.comSPEC]#rpmbuild-bbphp.spec制作phprpm二进制包 [root@linuxeye.comSPEC]#rpmbuild-bbphp-redis.spec制作php-redisrpm二进制包
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!