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

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

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

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

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

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

生成 Makefile 的來龍去脈

首先進入 project 目錄,在該目錄下運行一系列命令,創建和修改幾個文件,就可以生成符合該平臺的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 看出產生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目錄下,可執行文件將會安裝到${prefix}/bin

2. 源碼安裝工具 checkInstall

用 GNU Autoconf 安裝程序

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

./configure && make && make install

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

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

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

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

用Checkinstall安裝程序

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

./configure && make && checkinstall

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

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

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

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

CheckInstall 也有自己的侷限之處。它不能處理靜態連接的程序,因爲這樣 Installwatch 就不能監測到安裝過程中修改過文件了。總體說來,有兩類連接庫:動態的和靜態的。這些連接庫通過 include 指令整合到程序中。靜態連接過的程序已經包含了所有需要的庫文件,運行時也就不需要再將這些庫載入內存中。這種程序與安裝在系統中的連接庫無關,因爲所謂的連接器(Linker)已經在編譯時把這些庫內置到可執行程序裏了。

checkinstall的配置

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

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

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

3.相關目錄介紹

/usr和/usr/local目錄

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

對於Linux發行版,如 RedHat, Debian 等等,一個可能的規定是:/usr目錄只能由發行版的軟件包管理工具負責管理,而對/usr/local卻沒有這樣做。正是因爲採用這種方式,軟件包管理工具的數據庫才能知道在/usr目錄內的每一個文件。

比如上面的從源碼編譯的程序默認安裝路徑就是/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 目錄

首先區別下/sbin和/bin:
從命令功能來看, /sbin 下的命令屬於基本的系統命令,如shutdown,reboot,用於啓動系統,修復系統,/bin下存放一些普通的基本命令,如ls,chmod等,這些命令在Linux系統裏的配置文件腳本里經常用到。

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

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

/bin,/sbin目錄是在系統啓動後掛載到根文件系統中的,所以/sbin,/bin目錄必須和根文件系統在同一分區。

/usr/bin,usr/sbin可以和根文件系統不在一個分區。

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

補充:

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

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

/usr/bin 是你在後期安裝的一些軟件的運行腳本。主要放置一些應用軟體工具的必備執行檔例如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 放置一些用戶安裝的系統管理的必備程式例如: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目錄有何區別

來自於我的簡書:faner - 簡書

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章