Home> php教程> PHP开发> body text

Detailed explanation and examples of making PHP RPM package

高洛峰
Release: 2017-01-07 14:08:46
Original
3116 people have browsed it

制作PHP的RPM包教程

有时候为了方便源码包的安装,我们需要自己订制软件包的需求,我们会把一些源码包按照我们的需求来做成rpm包,当有了源码包就可以直接编译得到二进制安装包和其他任意包。spec file是制作rpm包最核心的部分,rpm包的制作就是根据spec file来实现的。下面是我以制作php的rpm开始介绍其制作方法。以下操作在CentOS6.6 64位系统进行。

下面我们以制作php的rpm开始介绍其制作方法。以下操作在CentOS6.6 64位系统进行。

安装rpm-build

[root@linuxeye.com SOURCES]# yum -y install rpm-build
Copy after login

建立工作车间目录

[root@linuxeye.com SOURCES]# vim ~/.rpmmacros %_topdir /root/rpmbuild
Copy after login

[root@linuxeye.com SOURCES]# mkdir -pv ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
Copy after login

在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.com SOURCES]# rpmbuild --showrc | grep topdir #工作车间目录:_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
Copy after login

rpmbuild --showrc显示所有的宏,以下划线开头,一个下划线:定义环境的使用情况,二个下划线:通常定义的是命令,为什么要定义宏,因为不同的系统,命令的存放位置可能不同,所以通过宏的定义找到命令的真正存放位置

收集源码文件脚本文件

[root@linuxeye.com SOURCES]# pwd /root/rpmbuild/SOURCES [root@linuxeye.com SOURCES]# ls php-5.4.45.tar.gz
Copy after login

编写SPEC文件

[root@linuxeye.com SPEC]# pwd /root/rpmbuild/SOURCES [root@linuxeye.com SPEC]# vim php.spec #内容如下:
Copy after login
%define _user www %define _group www %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: PHP is a server-side scripting language for creating dynamic Web pages #简要描述信息,最好不要超过50个字符,如要详述,使用下面的%description Group: Development/Languages #要全用这里面的一个组:less /usr/share/doc/rpm-version/GROUPS License: GPLv2 #软件授权方式 URL: http://www.php.net #源码相关网站 Packager: yeho  #打包人的信息 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 #软件包详述 PHP is a widely-used general-purpose scripting language that is especially suited for Web development and can be embedded into HTML. %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 make ZEND_EXTRA_LIBS='-liconv' %{?_smp_mflags} #%{?_smp_mflags} 的意思是:如果就多处理器的话make时并行编译 %install #开始安装软件,如make install rm -rf %{buildroot} make INSTALL_ROOT=%{buildroot} install rm -rf %{buildroot}/{.channels,.depdb,.depdblock,.filemap,.lock,.registry} %{__install} -p -D -m 0755 sapi/fpm/init.d.php-fpm %{buildroot}/etc/init.d/php-fpm %{__install} -p -D -m 0644 php.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} -g 10000 # 1:表示安装 useradd -u 10000 -g 10000 -m %{_user} # 2:表示升级 fi # 0:表示卸载 #rpm安装后执行的脚本 %post if [ $1 == 1 ];then [ -z "`grep ^'export PATH=' /etc/profile`" ] && echo "export PATH=%{_prefix}/bin:\$PATH" >> /etc/profile [ -n "`grep ^'export PATH=' /etc/profile`" -a -z "`grep '%{_prefix}' /etc/profile`" ] && sed -i "s@^export PATH=\(.*\)@export PATH=%{_prefix}/bin:\1@" /etc/profile /sbin/chkconfig --add php-fpm /sbin/chkconfig php-fpm on Mem=`free -m | awk '/Mem:/{print $2}'` #下面主要是参数的优化 if [ $Mem -le 640 ];then Mem_level=512M Memory_limit=64 elif [ $Mem -gt 640 -a $Mem -le 1280 ];then Mem_level=1G Memory_limit=128 elif [ $Mem -gt 1280 -a $Mem -le 2500 ];then Mem_level=2G Memory_limit=192 elif [ $Mem -gt 2500 -a $Mem -le 3500 ];then Mem_level=3G Memory_limit=256 elif [ $Mem -gt 3500 -a $Mem -le 4500 ];then Mem_level=4G Memory_limit=320 elif [ $Mem -gt 4500 -a $Mem -le 8000 ];then Mem_level=6G Memory_limit=384 elif [ $Mem -gt 8000 ];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 < /dev/null 2>&1 /sbin/chkconfig --del php-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 #%postun rpm卸载后执行的脚本 %clean #clean的主要作用就是删除BUILD rm -rf %{buildroot} %files #指定哪些文件需要被打包,如/usr/local/php %defattr(-,root,root,-) %{_prefix} %attr(0755,root,root) /etc/init.d/php-fpm %changelog #日志改变段, 这一段主要描述软件的开发记录 * Sat Oct 24 2015 yeho  5.4.45-1 - Initial version
Copy after login

下面是php-redis.spec

[root@linuxeye.com SOURCES]# pwd /root/rpmbuild/SOURCES [root@linuxeye.com SOURCES]# ls redis-2.2.7.tgz [root@linuxeye.com SOURCES]# cd ../SPEC [root@linuxeye.com SPEC]# vim php-redis.spec %global php_extdir %(/usr/local/php/bin/php-config --extension-dir 2>/dev/null || echo "undefined") Name: php-redis Version: 2.2.7 Release: 1%{?dist} Summary: The phpredis extension provides an API for communicating with the Redis key-value store. 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 The phpredis extension provides an API for communicating with the Redis key-value store. %prep %setup -q -n redis-%{version} %build /usr/local/php/bin/phpize %configure make %{?_smp_mflags} %install rm -rf %{buildroot} mkdir -p %{buildroot}%{php_extdir} make install INSTALL_ROOT=%{buildroot} find %{buildroot} -name redis.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-fpm stop > /dev/null 2>&1 sed -i '/redis.so/d' /usr/local/php/etc/php.ini fi #%postun rpm卸载后执行的脚本 if [ $1 == 0 ];then /etc/init.d/php-fpm start > /dev/null 2>&1 fi %clean rm -rf %{buildroot} %files %defattr(-,root,root,-) %{php_extdir}/redis.so %changelog * Sat Oct 24 2015 yeho  2.2.7-1 - Initial version
Copy after login

编译rpm包

[root@linuxeye.com SPEC]# rpmbuild -bb php.spec 制作php rpm二进制包 [root@linuxeye.com SPEC]# rpmbuild -bb php-redis.spec 制作php-redis rpm二进制包
Copy after login

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多制作PHP的RPM包详解及实例相关文章请关注PHP中文网!


Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
    Latest Downloads
    More>
    Web Effects
    Website Source Code
    Website Materials
    Front End Template
    About us Disclaimer Sitemap
    php.cn:Public welfare online PHP training,Help PHP learners grow quickly!