zoukankan      html  css  js  c++  java
  • 把mysql5.7源码包生成rpm包

    公司安装服务器 boos编译安装太慢

    需要把mysql5.7生成rpm包

    yum install rpm* rpm-build rpmdev*

    yum install -y gcc make gcc-c++ cmake bison-devel ncurses ncurses-devel bzip2-devel python-devel python-libs bzip2 libicu-devel

    1.建立一个普通用户,有普通用户来制作rpm,用root的可能会因为代码问题导致毁灭的后果
    useradd ibuler
    su - ibuler
    2.确定我们在哪个目录下制作RPM,通常这个目录我们topdir,这个需要在宏配置文件中指定,这个配置文件称为macrofiles,它们通常为 /usr/lib/rpm/macros:/usr/lib/rpm/macros.*:~/.rpmmacros,这个在rhel 5.8中可以通过rpmbuild --showrc | grep macrofiles 查看,6.3的我使用这个找不到,但使用是一样的。你可以通过rpmbuild --showrc | grep topdir 查看你系统默认的工作车间
    rpmbuild --showrc | grep topdir

    -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 %{getenv:HOME}/rpmbuild
    我们还是自定义工作目录(或车间)吧
    vi ~/.rpmmacros
    %_topdir /home/ibuler/rpmbuild ##目录可以自定义

    mkdir ~/rpmbuild
    3.在topdir下建立需要的目录
    cd ~/rpmbuild
    mkdir -pv {BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
    4.把收集的源码放到SOURCES下
    cp /export/boost_1_59_0.tar.gz SOURCES ##事先放好的

    cp /export/mysql-5.7.17.tar.gz SOURCES ##事先放好的

    5.在SPECS下建立重要的spec文件
    /home/ibuler/rpmbuild/SPECS
    vi mysql-5.7.17.spec ##内容见后讲解,rhel6.3会自动生成模板
    6.用rpmbuild命令制作rpm包,rpmbuild命令会根据spec文件来生成rpm包
    rpmbuild
    -ba 既生成src.rpm又生成二进制rpm
    -bs 只生成src的rpm
    -bb 只生二进制的rpm
    -bp 执行到pre
    -bc 执行到 build段
    -bi 执行install段
    -bl 检测有文件没包含
    我们可以一步步试,先rpmbuild -bp ,再-bc 再-bi 如果没问题,rpmbuild -ba 生成src包与二进制包吧

    rpmbuild -ba /home/ibuler/rpmbuild/SPECS/mysql-5.7.17.spec

    7.安装测试有没有问题,能否正常安装运行,能否正常升级,卸载有没有问题

    spec文件

    Name: mysql
    Version: 5.7.17
    Release: 1%{?dist}
    Summary: mysql_install

    Group: System Environment/Daemons
    License: GPLv2
    URL: http://www.boost.org/users/history/version_1_59_0.html&&http://dev.mysql.com/downloads/mysql/
    Source0: boost_1_59_0.tar.gz
    Source1: %{name}-%{version}.tar.gz
    Source2: my.cnf
    BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

    BuildRequires: gcc,make,gcc-c++,cmake,bison-devel,ncurses,ncurses-devel,bzip2-devel,python-devel,python-libs,bzip2,libicu-devel
    %description
    Build mysql-5.7.17.tar.gz to mysql-5.7.17.rpm

    %prep

    %setup -q -b 0 -b 1

    %build
    cd ../boost_1_59_0
    BOOST_ROOT=`pwd`
    export BOOST_ROOT
    ./bootstrap.sh --prefix=%{buildroot}/usr/ --with-toolset=gcc --with-icu
    install -d -m 755 %{buildroot}/usr/
    ./b2 install threading=multi link=shared

    cd ../mysql-5.7.17
    make -j3 %{?_smp_mflags}

    %install
    make install DESTDIR=%{buildroot}
    install -d -m 755 %{buildroot}/usr/
    %{__install} -p -D %{SOURCE2} %{buildroot}/export/servers/mysql/etc/my.cnf

    %pre
    if [ $1 == 1 ];then
    # /usr/sbin/useradd mysql -M -s /sbin/nologin 2>/dev/null
    useradd mysql
    mysqldir=(/export/data/mysql/tmp /export/data/mysql/data /export/servers/mysql/etc /export/data/mysql/dumps /export/data/mysql/log /home/mysql/scripts /home/mysql/logs)
    mkdir -p ${mysqldir[*]}
    chown mysql:mysql -R /export/data/mysql /home/mysql/
    serverid=$(ifconfig |grep Bcast|grep 'inet addr:' | awk '{print $2}' |awk -F. '{print $3$4}')
    sed -i 's/360360/'$serverid'/' /export/servers/mysql/etc/my.cnf
    if [ ! -z $pool ];then sed -i 's/innodb_buffer_pool_size = 20G/innodb_buffer_pool_size = '$pool'/' /export/servers/mysql/etc/my.cnf;echo -e "\033[;37;34m
    `cat /export/servers/mysql/etc/my.cnf|grep innodb_buffer_pool_size`\033[0m";fi
    echo -e "\033[;37;32mDONE\033[0m"
    fi

    %post
    if [ $1 == 1 ];then
    /export/servers/mysql/bin/mysqld --initialize --user=mysql --basedir=/export/servers/mysql/ --datadir=/export/data/mysql/data/ --initialize-insecure
    /sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir 2> /dev/null || :
    fi

    %preun
    if [ $1 == 0 ];then
    /usr/sbin/userdel -r mysql 2> /dev/null
    /etc/init.d/mysqld stop > /dev/null 2>&1
    /sbin/chkconfig --del mysqld 2> /dev/null
    /sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir 2> /dev/null || :
    fi

    %postun
    if [ $1 == 0 ];then
    rm -rf /usr/local/mysql 2> /dev/null
    rm -rf /usr/bin/mysql* 2> /dev/null
    rm -rf /etc/my.cnf 2> /dev/null
    rm -rf /etc/init.d/mysqld 2> /dev/null
    fi

    %clean
    rm -rf %{buildroot}
    %files
    %defattr(-,root,root,-)
    %doc
    /export/servers/mysql

    %changelog

    到此整个流程完毕。下面来说说其中最最重要的spec的格式,先说最简单的,最容易实现的

    1. vi tengine.spec 
    2.  
    3. ### 0.define section               #自定义宏段,这个不是必须的 
    4. ### %define nginx_user nginx       #这是我们自定义了一个宏,名字为nginx_user值为nginx,%{nginx_user}引用 
    5.  
    6. ### 1.The introduction section      #介绍区域段 
    7.  
    8. Name:           tengine            #名字为tar包的名字 
    9. Version:        1.4.2              #版本号,一定要与tar包的一致哦 
    10. Release:        1%{?dist}          #释出号,也就是第几次制作rpm 
    11. Summary:        tengine from TaoBao  #软件包简介,最好不要超过50字符 
    12.  
    13. Group:          System Environment/Daemons  #组名,可以通过less /usr/share/doc/rpm-4.8.0/GROUPS 选择合适组 
    14. License:        GPLv2                       #许可,GPL还是BSD等  
    15. URL:            http://laoguang.blog.51cto.com   #可以写一个网址 
    16. Packager:       Laoguang <ibuler@qq.com
    17. Vendor:         TaoBao.com 
    18. Source0:        %{name}-%{version}.tar.gz   
    19. #定义用到的source,也就是你收集的,可以用宏来表示,也可以直接写名字,上面定义的内容都可以像上面那样引用 
    20. #patch0:            a.patch                 #如果需要补丁,依次写 
    21. BuildRoot:      %_topdir/BUILDROOT         
    22. #这个是软件make install 的测试安装目录,也就是测试中的根,我们不用默认的,我们自定义,
    23. #我们可以来观察生成了哪此文件,方便写file区域 
    24. BuildRequires:  gcc,make                           #制作过程中用到的软件包 
    25. Requires:       pcre,pcre-devel,openssl,chkconfig  #软件运行需要的软件包,也可以指定最低版本如 bash >= 1.1.1 
    26. %description                                       #软件包描述,尽情的写吧 
    27. It is a Nginx from Taobao.                         #描述内容 
    28.  
    29. ###  2.The Prep section 准备阶段,主要目的解压source并cd进去 
    30.  
    31. %prep                                              #这个宏开始 
    32. %setup -q                                          #这个宏的作用静默模式解压并cd 
    33. #%patch0 -p1                                       #如果需要在这打补丁,依次写 
    34.  
    35. ###  3.The Build Section 编译制作阶段,主要目的就是编译 
    36. %build 
    37. ./configure \                                      #./configure 也可以用%configure来替换 
    38.   --prefix=/usr \                                  #下面的我想大家都很熟悉 
    39.   --sbin-path=/usr/sbin/nginx \ 
    40.   --conf-path=/etc/nginx/nginx.conf \ 
    41.   --error-log-path=/var/log/nginx/error.log \ 
    42.   --http-log-path=/var/log/nginx/access.log \ 
    43.   --pid-path=/var/run/nginx/nginx.pid  \ 
    44.   --lock-path=/var/lock/nginx.lock \ 
    45.   --user=nginx \ 
    46.   --group=nginx \ 
    47.   --with-http_ssl_module \ 
    48.   --with-http_flv_module \ 
    49.   --with-http_stub_status_module \ 
    50.   --with-http_gzip_static_module \ 
    51.   --http-client-body-temp-path=/var/tmp/nginx/client/ \ 
    52.   --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ 
    53.   --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ 
    54.   --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ 
    55.   --http-scgi-temp-path=/var/tmp/nginx/scgi \ 
    56.   --with-pcre 
    57. make %{?_smp_mflags}          #make后面的意思是:如果就多处理器的话make时并行编译 
    58.  
    59. ###  4.Install section  安装阶段 
    60. %install                                
    61. rm -rf %{buildroot}                #先删除原来的安装的,如果你不是第一次安装的话 
    62. make install DESTDIR=%{buildroot} 
    63. #DESTDIR指定安装的目录,而不是真实的安装目录,%{buildroot}你应该知道是指的什么了 
    64.  
    65. ###  4.1 scripts section #没必要可以不写 
    66. %pre        #rpm安装前制行的脚本 
    67. if [ $1 == 1 ];then    #$1==1 代表的是第一次安装,2代表是升级,0代表是卸载 
    68.         /usr/sbin/useradd -r nginx 2> /dev/null  ##其实这个脚本写的不完整
    69. fi 
    70. %post       #安装后执行的脚本 
    71.  
    72. %preun      #卸载前执行的脚本 
    73. if [ $1 == 0 ];then 
    74.         /usr/sbin/userdel -r nginx 2> /dev/null 
    75. fi 
    76. %postun     #卸载后执行的脚本 
    77.  
    78. ###  5.clean section 清理段,删除buildroot 
    79.  
    80. %clean 
    81. rm -rf %{buildroot} 
    82.      
    83. ###  6.file section 要包含的文件 
    84. %files  
    85. %defattr (-,root,root,0755)   #设定默认权限,如果下面没有指定权限,则继承默认 
    86. /etc/           #下面的内容要根据你在%{rootbuild}下生成的来写     
    87. /usr/ 
    88. /var/ 
    89.      
    90. ###  7.chagelog section  改变日志段 
    91. %changelog 
    92. *  Fri Dec 29 2012 laoguang <ibuler@qq.com> - 1.0.14-1 
    93. - Initial version 

    http://laoguang.blog.51cto.com/6013350/1103628

  • 相关阅读:
    STM32 ~ J-LINK V8 修复
    转移文件
    linux
    STM32 ~ MDK环境下调试程序 HardFault_Handler 相关
    HR_ROS 节点信息
    STM32 ~ 串口DMA通道查找
    CodeBackUP_node_find_serial
    Java问题排查工具箱[转载]
    JDK1.7 ConcurrentHashMap 源码浅析
    JDK1.7 HashMap 源码分析
  • 原文地址:https://www.cnblogs.com/Sunnynanbing/p/7127398.html
Copyright © 2011-2022 走看看