本文分为两个部分,第一部分是制作一个简单的自己的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
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的博客_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,将程序加入环境变量_我是菜鸟
添加完之后,如下:
[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两个文件。
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
至此,我们的所有步骤就都完成了!