制作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二进制包
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!