本文分为两个部分,第一部分是制作一个简单的自己的rpm包,并安装运行它。第二部分是为其制作一个patch包,并通过spec配置文件去打补丁,安装、运行打补丁后的程序。

一、安装工具

  [yh@localhost ~]$ sudo yum install rpm

  [yh@localhost ~]$ sudo yum install rpm-build

  [yh@localhost ~]$ sudo yum install autoconf

  因为我们最后成功制作出rpm包后,如果你要安装它,就需要rpm命令,所以我们要安装rpm。而要使用rpmbuild命令就要安装rpm-build。而在制作过程中我们需要给我们自己的项目生成configure配置文件,用它来生成Makefile,所以要安装autoconf。

  还有,因为要制作patch包,所以要用到diff命令。

二、命令介绍

  2.1、rpm命令

    rpm -ivh package_name

      -i :install

      -v :查看详细的安装信息

      -h :以安装信息列显示安装进度

    rpm -Uvh package_name    <--后面跟的软件没有被安装过,则直接安装,有安装过旧版,则更新旧版。

  2.2、rpmbuild命令

    rpmbuild -ba spec_name.spec    <--编译,同时生成RPM文件与SRPM文件

    rpmbuild -bb spec_name.spec    <--编译,仅生成RPM文件

  2.3、diff命令

    diff -Nur old new > xxx.patch   <--制作patch包,old和new可以是文件或者目录。

三、开始制作RPM包

  3.1、写一个hello.c源码

    我们在用户家目录下(/home/yh)创建一个文件夹(对文件夹的命名,我个人命名为hello-1.0,即包名-版本号的格式),并在文件夹内创建一个hello.c文件(此步应该很简单吧)

  

1 #include <stdio.h>
2
3 int main()
4 {
5 printf("Hello World!\n");
6 return 0;
7 }

  3.2、在上一步创建的文件夹下生成configure文件

    此步可参照如下链接:使用autoconf生成Makefile并编译工程的步骤_Linux_脚本之家 (jb51.net)

  3.3、正式开始制作

    1、我们回到用户家目录下,我们将hello-1.0打包为.tar.gz压缩包:

    [yh@localhost ~]$ tar -zcvf hello-1.0.tar.gz hello-1.0

      hello-1.0.tar.gz 是你要生成的压缩包。

      hello-1.0 是你要压缩的文件夹。

    2、在用户家目录下使用如下命令创建制作RPM包需要的工作目录:

    [yh@localhost ~]$ rpmdev-setuptree

    会生成一个rpmbuild文件夹,其下包括:

                      BUILD

                      RPMS

                      SOURCES

                      SPECS

                      SRPMS

    3、将第一步生成的压缩包拷贝到rpmbuild目录下的SOURCES目录,然后进入到rpmbuild目录下的SPECS目录。

    4、编写spec配置文件:

    [yh@localhost SPECS]$ vim hello.spec

    spec配置文件内容如下:

 1 Name:hello      包名
2 Version:1.0     版本号
3 Release:1%{?dist} 在此版本上build过的次数
4 Summary:A test program 摘要,简单的对此包的介绍
5
6
7 License:GPL 软件的授权模式,GPL为自由软件的意思
8
9 Source0:%{name}-%{version}.tar.gz 你的源码包
10
11
12
13
14 %description 详细的对此包的介绍
15 A test program
16
17 %prep 准备阶段,主要做的工作是解压缩包,打补丁包,将SOURCES目录下的压缩包解压到BUILD目录下,并cd到BUILD目录下的子目录
18 %setup -q
19
20
21 %build 编译阶段,在BUILD目录下的子目录内,进行编译,生成可执行的文件
22 ./configure
23 make %{?_smp_mflags}
24
25
26 %install 安装阶段,将BUILD目录下的子目录内要安装的内容安装到BUILDROOT下,BUILDROOT目录是虚拟根安装目录,在此阶段生成。
 27 rm -rf %{buildroot}  清除BUILDROOT目录,假设你之前制作过RPM包的话,需要这一步。
28 make DESTDIR=%{buildroot} install 安装
29
30 %files 要打进RPM包的文件都写在这里,此时在BUILDROOT目录下,用相对路径写。
31 /usr/local/bin 我这里是在BUILDROOT目录下的/usr/local/bin下有我要安装的hello可执行文件,所以我这样写,你写的时候可能会有不同。
32
33
34 %changelog 记录软件曾经的更新记录,可以不写,但是最好写。

    5、编译:

    [yh@localhost SPECS]$ rpmbuild -ba hello.spec

    我在这里报错了,如下:

    RPM 构建错误:

        空 %file 文件 /home/yh/rpmbuild/BUILD/hello-1.0/debugsourcefiles.list

    参考如下连接error: Empty %files file /xxxx/rpmbuild/BUILD/xxxx/debugsourcefiles.list_liurizhou的博客-CSDN博客_debugsourcefiles.list

    再次编译:

    [yh@localhost SPECS]$ rpmbuild -ba --nodebuginfo hello.spec

    成功,可以在RPMS/x86_64目录下看到.rpm包,在SRPMS目录下看到.src.rpm包。

    6、安装:

    使用rpm -ivh 包名来安装你的.rpm包。

    7、查询:

    使用rpm -qi hello查看该软件的基本信息

    

    8、运行:

    [yh@localhost SRPMS]$ /usr/local/bin/hello

    Hello World!

    这里你如果没有将hello添加到PATH,需要按照上面的内容在命令行写入,才会正确执行hello。如果你要想让hello和ls一样,在命令行只写入hello就能运行的话,可以参考如下链接,将hello加入PATH:

    linux-设置path,将程序加入环境变量_我是菜鸟-CSDN博客

    添加完之后,如下:

    [yh@localhost SRPMS]$ hello

    Hello World!

四、为上面的hello程序制作patch包

  4.1、修改源文件hello.c,并制作patch包

    1、现在我们的SOURCES目录下应该有hello-1.0.tar.gz包,我们将其解压:

    [yh@localhost SOURCES]$ tar -zxvf hello-1.0.tar.gz

    得到hello-1.0的目录,将其拷贝一份,命名为hello-2.0,修改hello-2.0下的hello.c,如下:

    

1 #include <stdio.h>
2
3 int main()
4 {
5 printf("Hello World!\n");
6 printf("This is 2.0\n");
7 return 0;
8 }

    2、然后再当前目录下(SOURCES)使用diff命令来制作patch包:

    [yh@localhost SOURCES]$ diff -Nur hello-1.0 hello-2.0 > hello.patch

    3、将hello-2.0目录和hllo-1.0.tar.gz删除,将hello-1.0改名为hello-2.0,然后压缩hello-2.0:

    [yh@localhost SOURCES]$ tar -zcvf hello-2.0.tar.gz hello-2.0

    4、最后SOURCES目录下只保留hello-2.0.tar.gz和hello.patch两个文件。

  4.2、修改spec文件,将patch包打进修改前的hello.c中

    1、进入SPECS目录下,修改再制作rpm包时的hello.spec文件,修改如下(红色部分):

 1 Name:hello
2 Version:2.0
3 Release: 1%{?dist}
4 Summary:A test program
5
6
7 License:GPL
8
9 Source0:hello-2.0.tar.gz
10 Patch0:hello.patch
11
12
13
14 %description
15 A test program
16
17 %prep
18 %setup -q
19 %patch0 -p1
20
21
22 %build
23 ./configure
24 make %{?_smp_mflags}
25
26
27 %install
28 rm -rf %{buildroot}
29 make DESTDIR=%{buildroot} install
30
31 %files
32 /usr/local/bin
33
34 %changelog

    2、编译hello.spec文件:

    [yh@localhost SPECS]$ rpmbuild -ba --nodebuginfo hello.spec

    成功就会在RPMS/x86_64/下看到hello-2.0-1.el8.x86_64.rpm,在SRPMS目录下看到hello-2.0-1.el8.src.rpm包。

    3、安装hello-2.0-1.el8.x86_64.rpm:

    因为我们之前已经安装过hello了,这次相当于升级,所以这样写:

    rpm -Uvh package_name

    更新成功。

    4、运行:

    [yh@localhost ~]$ hello
    Hello World!
    This is 2.0

    

  至此,我们的所有步骤就都完成了!

制作自己的rpm包,并为其制作patch包。的更多相关文章

  1. 二十三.Subversion基本操作、使用Subversion协同工作、制作nginx的RPM包

    1.Subversion基本操作 web1 1.1 安装Subversion服务器 ]# yum -y install subversion 1.1.1 创建版本库 ]# mkdir /var/svn ...

  2. 高级运维(七):Subversion基本操作、使用Subversion协同工作、制作nginx的RPM包

    一.Subversion基本操作 目标: 本案例要求先快速搭建好一台Subversion服务器,并测试该版本控制软件: 1> 创建版本库    2> 导入初始化数据    3> 检出 ...

  3. python的egg包的安装和制作]

    Defining Python Source Code Encodings Python egg 的安装 egg文件制作与安装 2011-06-10 14:22:50|  分类: python |   ...

  4. 利用checkinstall制作deb或rpm工具包

    1. 概述 有时候我们向用户提供软件时,并不希望提供源码(虽然这挺狗的...),而是只希望提供一些可执行文件.小程序还好说,可以轻易地提取有用的信息出来. 但对于一些比较庞大的程序,尤其是需要配置文件 ...

  5. FPM制作Nginx的RPM软件包

    FPM制作Nginx的rpm软件包 FPM相关参数-s:指定源类型-t:指定目标类型,即想要制作为什么包-n:指定包的名字-v:指定包的版本号-C:指定打包的相对路径-d:指定依赖于哪些包-f:第二次 ...

  6. python3全栈开发-什么是粘包、粘包现象、如何解决粘包

    一.粘包现象 让我们基于tcp先制作一个远程执行命令的程序(1:执行错误命令 2:执行ls 3:执行ifconfig) 注意注意注意: res=subprocess.Popen(cmd.decode( ...

  7. 为什么项目的jar包会和tomcat的jar包冲突?

    为什么项目的jar包会和tomcat的jar包冲突? 碰到这个问题,猜测tomcat启动时会将自己的lib和项目的lib在逻辑上归并为一个大的lib,但是并没有做版本区分以及去重,这样相同的包可能就有 ...

  8. 内核移植和文件系统制作(4):UBIFS根文件系统制作总结

    UBIFS文件系统简介: 无排序区块图像文件系统(UnsortedBlock Image File System, UBIFS)是用于固态硬盘存储设备上,并与LogFS相互竞争,作为JFFS2的后继文 ...

  9. Ant build.xml 批量打渠道包回顾!打第三方jar包总结

    配置: eclipse3.9 + ADT22 + sdk 4.0 eclipse带自动混淆的,不过只有在我们手动创建包的时候,才去打签名,去混淆! 开启混淆这样做吧! 必备文件3个: 当然进行ant打 ...

随机推荐

  1. JVM学习十二 - (复习)JVM内存结构

    JVM 内存结构 Java 虚拟机的内存空间分为 5 个部分: 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 JDK 1.8 同 JDK 1.7 比,最大的差别就是:元数据区取代了永久代.元 ...

  2. python日志装饰器实现

    问题出自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143184355 ...

  3. 解决"Uncaught (in promise) Error: Navigation cancelled from "/" to "/login" with a new navigation"报错处理

    Uncaught (in promise) Error: Navigation cancelled from "/" to "/login" with a ne ...

  4. GitHub page创建

      这是我的博客,才刚刚建成请多多指教 https://henryztong.github.io/ 以下地址都是关于创建GitHub 博客的: 地址 说明 https://pages.github.c ...

  5. 基于SSM风格的Java源代码生成器

    一.序言 UCode Cms 是一款Maven版的Java源代码生成器,是快速构建项目的利器.代码生成器模块属于可拆卸模块,即按需引入.代码生成器生成SSM(Spring.SpringBoot.Myb ...

  6. Solution -「CEOI 2017」「洛谷 P4654」Mousetrap

    \(\mathscr{Description}\)   Link.   在一个含 \(n\) 个结点的树形迷宫中,迷宫管理者菈米莉丝和一只老鼠博弈.老鼠初始时在结点 \(y\),有且仅有结点 \(x\ ...

  7. Solution -「CF 623E」Transforming Sequence

    题目 题意简述   link.   有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...

  8. Solution -「NOI 2018」「洛谷 P4768」归程

    \(\mathcal{Description}\)   Link.   给定一个 \(n\) 个点 \(m\) 条边的无向连通图,边形如 \((u,v,l,a)\).每次询问给出 \(u,p\),回答 ...

  9. UVM中重要函数

    1.get_full_name() 获取这个节点的完整层次,这函数在object中就有定义,但是在component类中进行了重载,实现输出从uvm_test_top到当前节点的路径(是通过执行m_s ...

  10. 大厂晋升指南:材料准备,PPT 写作和现场答辩

    大部分公司在年初,都是绩效回顾.晋升答辩的时期,对于阿里.美团等不少互联网企业,财年是从前一年的 4 月到第二年的 3 月底,春节回来以后,就是一年一度的述职晋升环节. 这里我结合自己述职以及辅导其他 ...