zoukankan      html  css  js  c++  java
  • RPM 打包指南系列 一

    RPM 打包指南

    简介

    这个指南包括以下三个部分

    如何准备用于 RPM 打包的源码包

    这是给没有软件开发背景的人准备的,参见 Preparing Software for Packaging

    如何把源码包打包进 RPM 包

    这适用于需要将源码包打包到 RPM 中的开发人员,参见 Packaging Software

    高级打包技巧

    这是处理高级 RPM 打包方案的参考资料,参阅 Advanced Topics

    准备

    完成这个教程需要准备以下的包

    $ yum install gcc rpm-build rpm-devel rpmlint make python bash coreutils diffutils patch rpmdevtools
    

    为什么需要 RPM 来打包呢

    RPM 是运行在 Redhat CentOSFedora 上的包管理系统。RPM 帮助你更简单的分发,管理和更新软件。很多软件供应商通过传统的压缩包来分发软件。但是,将软件打包到 RPM 中有几个优点,这些优点概述如下

    安装,重新安装,删除,升级和验证包

    用户可以使用标准的包管理工具(例如 Yum 或者 PackageKit)来安装,重新安装,移除升级和验证你的 RPM 包

    使用已安装软件包的数据库来查询和验证已安装软件包

    因为 RPM 维护已安装软件包及其文件的数据库,因此用户可以轻松查询和验证其系统上的软件包

    使用元数据来描述包,安装说明等

    每个 RPM 软件包都包含描述软件包组件,版本,发行版,大小,项目 url,安装说明等的元数据

    将原始软件打包为源包和二进制包

    RPM允许您获取原始软件源并将其打包为用户的源和二进制包。 在源包中,您拥有原始源以及所使用的任何修补程序以及完整的构建说明。 随着软件的新版本发布,此设计可以简化软件包的维护。

    将包添加到 Yum 仓库

    你可以将软件包添加到 yum 仓库,是客户端可以轻松查找和部署软件

    对包进行数字签名

    使用 GPG 签名秘钥,你可以对包进行数字签名,以便用户能够验证包的真实性

    你的第一个 RPM 包

    创建一个 RPM 包可能是很复杂的。这里有一个略过了一些步骤的完整的,简化的 RPM 的 spec 文件。

    Name:       hello-world
    Version:    1
    Release:    1
    Summary:    Most simple RPM package
    License:    FIXME
    
    %description
    This is my first RPM package, which does nothing.
    
    %prep
    # we have no source, so nothing here
    
    %build
    cat > hello-world.sh <<EOF
    #!/usr/bin/bash
    echo Hello world
    EOF
    
    %install
    mkdir -p %{buildroot}/usr/bin/
    install -m 755 hello-world.sh %{buildroot}/usr/bin/hello-world.sh
    
    %files
    /usr/bin/hello-world.sh
    
    %changelog
    # let skip this for now
    

    保存这个文件到 hello-world.spec

    现在运行下面的命令

    $ rpmdev-setuptree
    $ rpmbuild -ba hello-world.spec
    

    rpmdev-setuptree 创建了一些工作目录,由于这些目录永久存储在 $HOME 中,因此不需要再次使用此命令。

    rpmbuild 创建了一个实际的 RPM 包,这个命令的输出可能如下

    ... [SNIP]
    Wrote: /home/mirek/rpmbuild/SRPMS/hello-world-1-1.src.rpm
    Wrote: /home/mirek/rpmbuild/RPMS/x86_64/hello-world-1-1.x86_64.rpm
    Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.wgaJzv
    + umask 022
    + cd /home/mirek/rpmbuild/BUILD
    + /usr/bin/rm -rf /home/mirek/rpmbuild/BUILDROOT/hello-world-1-1.x86_64
    + exit 0
    

    /home/mirek/rpmbuild/RPMS/x86_64/hello-world-1-1.x86_64.rpm 是你的第一个 RPM 包,他可以被系统安装和测试。

    准备打包的的软件

    本章介绍源代码和创建软件,它们是 RPM 包管理的必备步骤

    什么是源码?

    Source code 是指计算机的人类可读指令,描述了如何执行计算。源代码用编程语言表示。

    以下使用三个版本的 Hello world 程序,每个版本都使用不同的编程语言编写。用这三种不同语言编写的程序以不同的方式打包,涵盖 RPM 打包程序的三个主要用例。

    首先是用 bash 编写:

    bello

    #!/bin/bash
    
    printf "Hello World
    "
    

    python 编写:

    pello.py

    #!/usr/bin/env python
    
    print("Hello World")
    

    C 编写:

    cello.c

    #include <stdio.h>
    
    int main(void) {
        printf("Hello World
    ");
        return 0;
    }
    

    三个程序的唯一目的都是在命令行输出 Hello World

    了解怎么编程对打包不是必须的,但是很有帮助

    本地编译代码

    Natively compiled 本地编译是把编程语言编译成机器代码,生成二进制可执行文件。这种软件可以独立运行。

    以这种方式构建的 RPM 包是适用于特定体系结构的。这意味着您在使用 64 位(x86_64)AMD 或 Intel 处理器的计算机上编译此类软件,则无法在 32 位(x86)AMD 或 Intel 处理器上执行。生成的包将在其名称中指定体系结构。

    解释语言代码

    某些编程语言(如 bash 或 python)无法编译为机器代码。相反,它们程序的源代码是由语言解释器或语言虚拟机逐步执行的,无需事先转换。

    完全用解释型语言编写的软件不是特定于体系结构的。因此,生成的 RPM 包名称中将包含字符串 noarch

    解释型语言是可以 byte-compiled 或者 raw-interpreted (字节编译或者原始解释)。这两种类型在程序构建过程和包装过程中有所不同。

    Raw-interpreted programs

    Raw-interpreted 原始解释语言完全不需要编译,它们由解释器直接执行

    Byte-compiled programs

    Byte-compiled programs 字节编译语言需要编译成字节代码,然后由语言虚拟机执行

  • 相关阅读:
    linux grep (转)
    移除NDK方法
    Android Studio 中 FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':compileDebugAidl'.的问题解答
    [Android] 环境配置之基础开发环境(SDK/Android Studio)(转)
    Rendering Problems: No Android SDK found. Please configure an Android SDK. 怎解决?
    Android Xutils 框架(转)
    Android Studio 简单设置
    Android笔记——Windows环境下Android Studio v1.0安装教程
    Android Studio使用教程(二)
    Android Studio使用教程(一)(转)
  • 原文地址:https://www.cnblogs.com/andy-linux/p/10007929.html
Copyright © 2011-2022 走看看