本文分為兩個部分,第一部分是制作一個簡單的自己的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
再次編譯:
[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
至此,我們的所有步驟就都完成了!