Linux軟件編譯安裝和相關目錄介紹

主要介紹: configure、make、make install、/usr、/usr/bin、/opt 等

1.使用configure、make、make install來編譯安裝軟件

無論是在Linux還是在Unix環(huán)境中,make都是一個非常重要的編譯命令。不管是自己進行項目開發(fā)還是安裝應用軟件,我們都經(jīng)常要用到make或 make install。利用make工具, 我們可以將大型的開發(fā)項目分解成為多個更易于管理的模塊,對于一個包括幾百個源文件的應用程序,使用make和makefile工具就可以輕而易舉的理順各個源文件之間紛繁復雜的相互關系。

但是如果通過查閱make的幫助文檔來手工編寫Makefile,對任何程序員都是一場挑戰(zhàn)。幸而有GNU 提供的Autoconf及Automake這兩套工具使得編寫makefile不再是一個難題。

本文將介紹如何利用 GNU Autoconf 及 Automake 這兩套工具來協(xié)助我們自動產(chǎn)生 Makefile 文件, 并且讓開發(fā)出來的軟件可以像大多數(shù)源碼包那樣,只需"./configure", "make","make install" 就可以把程序安裝到系統(tǒng)中。

生成 Makefile 的來龍去脈

首先進入 project 目錄,在該目錄下運行一系列命令,創(chuàng)建和修改幾個文件,就可以生成符合該平臺的Makefile文件,操作過程如下:

  1. 運行autoscan命令
  2. 將configure.scan 文件重命名為configure.in,并修改configure.in文件
  3. 在project目錄下新建Makefile.am文件,并在core和shell目錄下也新建makefile.am文件
  4. 在project目錄下新建NEWS、 README、 ChangeLog 、AUTHORS文件
  5. 將/usr/share/automake-1.X/目錄下的depcomp和complie文件拷貝到本目錄下
  6. 運行aclocal命令
  7. 運行autoconf命令
  8. 運行automake -a命令
  9. 運行./confiugre腳本

可以通過圖1 看出產(chǎn)生Makefile的流程,如圖所示:

生成Makefile流程圖
生成Makefile流程圖

圖1. 生成Makefile流程圖

如果他人的項目中存在 autogen.sh , 則可以直接運行該文件而不需要一步步運行上面的命令。

安裝路徑

automake設置了默認的安裝路徑:

  1. 標準安裝路徑
    默認安裝路徑為:$(prefix) = /usr/local,可以通過./configure --prefix=<new_path>的方法來覆蓋。
    其它的預定義目錄還包括:bindir = $(prefix)/bin, libdir = $(prefix)/lib, datadir = $(prefix)/share, sysconfdir = $(prefix)/etc等等。

對于安裝的情況,庫將會安裝到$(prefix)/lib目錄下,可執(zhí)行文件將會安裝到${prefix}/bin。

2. 源碼安裝工具 checkInstall

用 GNU Autoconf 安裝程序

一般說來,我們編譯安裝一個由 GNU Autoconf 配置的程序是采用如下的步驟:

./configure && make && make install

這個 configure 腳本文件是用來“猜”出一系列系統(tǒng)相關的變量,這些變量是在后面的編譯過程要用到的。它將檢查系統(tǒng)變量值是否滿足編譯要求,然后使用這些變量在程序包內(nèi)每個文件夾下生成 Makefile。此外,configure 腳本還會生成其它文件:

  • 每個文件夾/子文件夾下的一個或多個 Makefile(s)
  • 一個名叫 config.status 的腳本
  • 一個文本文件 config.log

Configure 腳本文件成功運行之后, 你會輸入 make 來編譯程序,得到你需要的可執(zhí)行文件。如果 make 成功的完成,你可以使用 make install 來安裝這個程序。

然而,當你想刪除它的時候呢?
Makefile 文件只包括了很少情況下的卸載例程。當然,你可以把程序安裝到臨時文件夾,然后記下所有由程序生成或修改的文件,最后刪除他們。但是如果這個程序要經(jīng)常重新編譯,這樣做是非常痛苦的,工作量也相當大。Felipe Eduardo 所寫的 CheckInstall 就是用來解決這個問題的。

用Checkinstall安裝程序

它采用自己的指令 checkinstall 來代替 make install。其他兩個指令保留下來跟以前一樣,因此,現(xiàn)在這個指令序列使用 CheckInstall 變成:

./configure && make && checkinstall

指令 checkinstall 不僅默認運行了 make install,而且還監(jiān)測所有安裝過程中的寫操作。為此,CheckInstall 使用了 Pancrazio de Mauro 所寫的程序 Installwatch。如果添加了相應選項還可,在 make install 成功完成之后,CheckInstall 會產(chǎn)生一個 Slackware-,Debian- (添加-D選項) 或RPM- 安裝包,然后按照軟件包的默認配置來安裝程序,并在當前目錄(或標準安裝包存儲目錄)留下一個生成的安裝包。你可以通過修改變量 PAK_DIR 來修改這個保存目錄。

運行命令“checkinstall –h”顯示所有可用的子參數(shù)
這些子參數(shù)大致分為:

  • 安裝選項(Install options)
  • 腳本處理選項(Scripting options)
  • 信息顯示選項(Info display options)
  • 安裝包選項(Package tuning options)
  • 清除選項(Cleanup options)
  • 關于 CheckInstall (About CheckInstall)。

如果 CheckInstall 帶著這些參數(shù)運行,它會使用這些參數(shù)值來代替配置文件 checkinstallrc 中相應的值。

CheckInstall 也有自己的局限之處。它不能處理靜態(tài)連接的程序,因為這樣 Installwatch 就不能監(jiān)測到安裝過程中修改過文件了??傮w說來,有兩類連接庫:動態(tài)的和靜態(tài)的。這些連接庫通過 include 指令整合到程序中。靜態(tài)連接過的程序已經(jīng)包含了所有需要的庫文件,運行時也就不需要再將這些庫載入內(nèi)存中。這種程序與安裝在系統(tǒng)中的連接庫無關,因為所謂的連接器(Linker)已經(jīng)在編譯時把這些庫內(nèi)置到可執(zhí)行程序里了。

checkinstall的配置

你可以通過修改配置文件 /usr/local/lib/checkinstall/checkinstallrc 來改變 checkInstall 的默認配置。
文件值得注意的變量有 INSTYPE,INSTALL 和 PAK_DIR。

  • INSTYPE 變量決定生成何種類型安裝包
  • PAK_DIR 變量決定安裝包的存儲目錄。
  • INSTALL 變量決定是只生成安裝包還是一起將這個包馬上安裝。
    0-只生成安裝包
    1-不僅生成安裝包,還將包立即安裝
# 創(chuàng)建deb包而不安裝,使用sudo猜測是要先記錄要安裝的路徑
./configure && make && sudo checkinstall -D --install=no 
# 查看生成的deb包中包含了哪些文件
dpkg --contents ***.deb

運行checkinstall制作安裝包,生成 rpm(或dep) 包期間會出現(xiàn)一些選項,選擇默認的即可。

3.相關目錄介紹

/usr和/usr/local目錄

在傳統(tǒng)的unix系統(tǒng)中,/usr通常只包含系統(tǒng)發(fā)行時自帶的程序,而/usr/local則是本地系統(tǒng)管理員用來自由添加程序的目錄。(這樣可能在升級新版系統(tǒng)或新distribution時無須重新安裝全部程序. )

對于Linux發(fā)行版,如 RedHat, Debian 等等,一個可能的規(guī)定是:/usr目錄只能由發(fā)行版的軟件包管理工具負責管理,而對/usr/local卻沒有這樣做。正是因為采用這種方式,軟件包管理工具的數(shù)據(jù)庫才能知道在/usr目錄內(nèi)的每一個文件。

比如上面的從源碼編譯的程序默認安裝路徑就是/usr/local

/usr/local
This is where most manually installed(ie. outside of your package manager) software goes.It has the same structure as /usr. It is a good idea to leave /usr to your package manager and put any custom scripts and things into /usr/local, since nothing important normally lives in /usr/local.

/bin,/sbin,/usr/sbin,/usr/bin 目錄

首先區(qū)別下/sbin和/bin:
從命令功能來看, /sbin 下的命令屬于基本的系統(tǒng)命令,如shutdown,reboot,用于啟動系統(tǒng),修復系統(tǒng),/bin下存放一些普通的基本命令,如ls,chmod等,這些命令在Linux系統(tǒng)里的配置文件腳本里經(jīng)常用到。

從用戶權限的角度看, /sbin目錄下的命令通常只有管理員才可以運行,/bin下的命令管理員和一般的用戶都可以使用。

從可運行時間角度看, /sbin,/bin能夠在掛載其他文件系統(tǒng)前就可以使用。

/bin,/sbin目錄是在系統(tǒng)啟動后掛載到根文件系統(tǒng)中的,所以/sbin,/bin目錄必須和根文件系統(tǒng)在同一分區(qū)。

/usr/bin,usr/sbin可以和根文件系統(tǒng)不在一個分區(qū)。

/usr/sbin存放的一些非必須的系統(tǒng)命令;/usr/bin存放一些用戶命令,如led(控制LED燈的)。

補充:

/bin 是系統(tǒng)的一些指令。bin為binary的簡寫主要放置一些系統(tǒng)的必備執(zhí)行檔例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等。

/sbin 一般是指超級用戶指令。主要放置一些系統(tǒng)管理的必備程式例如:cfdisk、dhcpcd、dump、e2fsck、fdisk、halt、ifconfig、ifup、 ifdown、init、insmod、lilo、lsmod、mke2fs、modprobe、quotacheck、reboot、rmmod、 runlevel、shutdown等。

/usr/bin 是你在后期安裝的一些軟件的運行腳本。主要放置一些應用軟體工具的必備執(zhí)行檔例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 gzip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等。

/usr/sbin 放置一些用戶安裝的系統(tǒng)管理的必備程式例如:dhcpd、httpd、imap、in.*d、inetd、lpd、named、netconfig、nmbd、samba、sendmail、squid、swap、tcpd、tcpdump等。

opt目錄

/opt這個目錄是一些大型軟件的安裝目錄,或者是一些服務程序的安裝目錄

參考

例解 autoconf 和 automake 生成 Makefile 文件
Linux 的源碼安裝工具 CheckInstall
關于 /usr 和 /usr/local 的討論
/bin,/sbin,/usr/sbin,/usr/bin 目錄
linux下面/usr/local和opt目錄有何區(qū)別

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容