使用CheckInstall從原始碼製作RPM安裝包
一、下載並安裝CheckInstall
- RPM安裝包
目前最新的包為1.62版,CentOS 6.X的RPM安裝包可以下載checkinstall-1.6.2-1.cnt6.x86_64.rpm
然後:
sudo rpm -ivh checkinstall-1.6.2-1.cnt6.x86_64.rpm
sudo ln -s /usr/lib64/checkinstall/installwatch.so /usr/lib64/installwatch.so
sudo ln -s /usr/lib64/checkinstall/checkinstallrc /etc/checkinstallrc
- 原始碼包
從官網下載原始碼checkinstall-1.6.2.tar.gz
解壓:
tar xvf checkinstall-1.6.2.tar.gz
編譯會報錯:
installwatch.c:2942:5: 錯誤:與‘readlink’型別衝突
int readlink(const char *path,char *buf,size_t bufsiz) {
^
In file included from installwatch.c:41:0:
/usr/include/unistd.h:828:16: 附註:‘readlink’的上一個宣告在此
extern ssize_t readlink (__const char *__restrict __path,
^
installwatch.c:3080:5: 錯誤:與‘scandir’型別衝突
int scandir( const char *dir,struct dirent ***namelist,
^
In file included from installwatch.c:49:0:
/usr/include/dirent.h:252:12: 附註:‘scandir’的上一個宣告在此
extern int scandir (__const char *__restrict __dir,
^
installwatch.c:3692:5: 錯誤:與‘scandir64’型別衝突
int scandir64( const char *dir,struct dirent64 ***namelist,
^
In file included from installwatch.c:49:0:
/usr/include/dirent.h:275:12: 附註:‘scandir64’的上一個宣告在此
extern int scandir64 (__const char *__restrict __dir,
修改原始檔installwatch.c:
101行:
static int (*true_scandir)( const char *,struct dirent ***,
int (*)(const struct dirent *),
int (*)(const void *,const void *));
改為:
static int (*true_scandir)( const char *,struct dirent ***,
int (*)(const struct dirent *),
int (*)(const struct dirent **,const struct dirent **));
121行:
static int (*true_scandir64)( const char *,struct dirent64 ***,
int (*)(const struct dirent64 *),
int (*)(const void *,const void *));
改為:
static int (*true_scandir64)( const char *,struct dirent64 ***,
int (*)(const struct dirent64 *),
int (*)(const struct dirent64 **,const struct dirent64 **));
2529行:
FILE *fopen(const char *pathname, const char *mode) {
FILE *result;
改為:
FILE *fopen(const char *pathname, const char *mode) {
FILE *result=0;
2941行:
#if (GLIBC_MINOR <= 4)
int readlink(const char *path,char *buf,size_t bufsiz) {
int result;
#else
ssize_t readlink(const char *path,char *buf,size_t bufsiz) {
ssize_t result;
#endif
改為:
#if 0
int readlink(const char *path,char *buf,size_t bufsiz) {
int result;
#else
ssize_t readlink(const char *path,char *buf,size_t bufsiz) {
ssize_t result;
#endif
3080行:
int scandir( const char *dir,struct dirent ***namelist,
int (*select)(const struct dirent *),
int (*compar)(const void *,const void *) ) {
改為:
int scandir( const char *dir,struct dirent ***namelist,
int (*select)(const struct dirent *),
int (*compar)(const struct dirent **,const struct dirent **) ) {
3692行:
int scandir64( const char *dir,struct dirent64 ***namelist,
int (*select)(const struct dirent64 *),
int (*compar)(const void *,const void *) ) {
改為:
int scandir64( const char *dir,struct dirent64 ***namelist,
int (*select)(const struct dirent64 *),
int (*compar)(const struct dirent64 **,const struct dirent64 **) ) {
來一個直觀的修改對比:
修改完成後再重新編譯。
二、使用CheckInstall
這裡使用的CheckInstall的RPM安裝包進行安裝的。
在使用checkinstall之前需要做一點小修改,以免在執行的過程中報錯:
error: File not found: /root/rpmbuild/BUILDROOT/
編輯/usr/bin/checkinstall
sudo vim /usr/bin/checkinstall
搜尋關鍵詞-bb,筆者的是在2451行,將:
$RPMBUILD -bb ${RPM_TARGET_FLAG}${ARCHITECTURE} "$SPEC_PATH" &> ${TMP_DIR}/rpmbuild.log
改為:
$RPMBUILD -bb ${RPM_TARGET_FLAG}${ARCHITECTURE} --buildroot=$BUILD_DIR "$SPEC_PATH" &> ${TMP_DIR}/rpmbuild.log
下面以製作GCC 9.2的安裝包為例,在make完成後,使用checkinstall:
sudo checkinstall
中途可能會出現:
======================== Installation successful ==========================
Copying files to the temporary directory...OK
Stripping ELF binaries...OK
Compressing man pages...OK
Building file list...OK
/root/rpmbuild has no SOURCES directory. Please write the path to
the RPM source directory tree:
可以安裝rpmdevtools:
sudo yum install rpmdevtools
sudo rpmdev-setuptree
可以看到/root/rpmbuild目錄了
再重新執行前面的checkinstall命令,可以看到成功生成RPM安裝包,路徑在/root/rpmbuild/RPMS/x86_64目錄中,並且已經執行了一次RPM安裝包的安裝,通過
rpm -qa | grep gcc
可以看到,如圖所示。
從上圖中可以看到
Install RPM package... OK
以及
Writing backup package... OK
可以在執行sudo checkinstall的時候新增引數不執行這兩個操作,改為:
sudo checkinstall --install=no --backup=no
這樣就不會在製作RPM完成後自動安裝和備份。
PS:本文所用系統為Centos 6.10
相關文章
- RPM 包是如何從源 RPM 製作的
- Greenplum_原始碼編譯安裝和RPM包安裝原始碼編譯
- Linux自己製作rpm包Linux
- CentOS下使用rpm包安裝MySQLCentOSMySql
- Centos 7 製作MySQL 5.7 RPM包CentOSMySql
- 製作PHP的RPM包例項PHP
- OpenSSH9.6p1的EL7版本rpm安裝包製作
- Linux下使用makeself製作一鍵安裝包Linux
- yum如何解除安裝已安裝的rpm並安裝本地rpm包
- rpm包安裝升級與解除安裝
- RPM包安裝與介紹
- 原始碼包和rpm包的區別原始碼
- 徹底解除安裝rpm軟體包的指令碼指令碼
- RPM包的安裝與升級
- DMG Canvas 4.0.7 DMG安裝包製作Canvas
- Debian安裝包的簡單製作
- centos(linux): rpm -V 驗證rpm包安裝程式的安全CentOSLinux
- 原始碼包安裝過程原始碼
- rpm 與 原始碼安裝的一些差異原始碼
- mysql8.0.30的RPM包安裝方法MySql
- Linux RPM包安裝、解除安裝、升級命令講解Linux
- Linux - openssh透過原始碼build rpm包Linux原始碼UI
- yum/dnf/rpm 等 檢視rpm 包安裝路徑 (fedora 中 pygtk 包內容安裝到哪裡了)
- yum安裝軟體之後如何儲存rpm安裝包
- centos以RPM包方式安裝redis的方法CentOSRedis
- 在 Fedora 中安裝替代版本的 RPM 包
- rpm:虛擬包:空白包:欺騙包:do nothing包:滿足現有rpm包安裝依賴的要求
- 基於Linux的MySQL5.7RPM包安裝LinuxMySql
- Mysql 5.7在OL 6上以RPM包安裝MySql
- Yum命令之僅下載rpm安裝包且不安裝
- mysql安裝(rpm)MySql
- 從原始碼安裝GDB-8.1原始碼
- Linux rpm -e --nodeps rpm解除安裝Linux
- Installshield製作更新安裝包
- Linux 筆記分享十五:原始碼包安裝Linux筆記原始碼
- oracle linux使用安裝盤製作本地yumOracleLinux
- 【DB寶3】在Docker中使用rpm包的方式安裝Oracle 19cDockerOracle
- 搭建本地yum源,使用安裝光碟的rpm作為yum源的檔案