linux下基於原始碼軟體安裝的那些事
基於原始碼的軟體安裝本質就是程式的原始碼製作二進位制程式的過程,這個過程中就會依賴一些基礎軟體和函式庫來完成程式製作。這些依賴包括但不僅限於:
- gcc或者cc等C語言編譯器;
- make、autoconfig等軟體;
- 需要核心提供的Library以及相關的include檔案;
通常情況下,基於原始碼的軟體安裝都會有固定以下的幾個步驟,本篇部落格將針對每個步驟中涉及到的知識點進行講解:
- 去XX官網下載軟體的Tarball檔案;
- 上傳到linux伺服器,並解壓縮;
- 檢查軟體安裝依賴的軟體或工具是否已安裝;
- 檢測操作環境、建立Makefile檔案;
- 編譯程式;
- 安裝程式;
需要注意的是基於原始碼的安裝是順序執行的,簡而言之就是一旦某一步沒有執行成功,那麼後續步驟是不會執行的。
可以大膽地說,只要吃透了這篇部落格,linux作業系統下所有軟體的安裝都不是問題!
1、去XX官網下載軟體的Tarball檔案;
首先搞明白一點,基於原始碼的安裝指的是利用廠商釋出的Tarball檔案來進行軟體的安裝,如下圖所示的nginx和redis為例:
Tarball檔案指的是將軟體所有的原始碼以tar打包,然後再以壓縮技術來壓縮(最為常見的以gzip來壓縮而形成的檔案,所以Tarball檔案一般的副檔名就是*.tar.gz或者直接簡寫為*.tgz。近來由於bzip2與xz的壓縮率表現較好,所以Tarball漸漸地以這兩者來壓縮,因此檔案的副檔名也會是*.tar.bz2、*.tar.xz之類的;
Tarball檔案通常包含以下內容:
- 原始碼檔案。毫無疑問編譯程式用;
- 檢測程式檔案(可能是configure或config等檔案)。這個檔案一般有兩個作用:檢測操作環境是否滿足編譯安裝軟體的要求、建立Makefile檔案;
- 軟體的簡易說明(README)或者安裝文件(INSTALL);
2、上傳到linux伺服器,並解壓縮;
預設情況下,使用者自行安裝的軟體建議放置到/usr/local裡面。而下載的Tarball檔案建議放置到/usr/local/src下,在這個目錄下進行解壓縮;本次以nginx為例,涉及命令如下:
tar -zxvf nginx-1.20.1.tar.gz
在這一步驟中需要注意這兩個放置目錄;
3、檢查軟體安裝依賴的軟體或工具是否已安裝;
這一步不是必須的,可根據步驟4中的檢測內容進行確認!
4、檢測操作環境、建立Makefile檔案;
一般在軟體開發商提供的Tarball檔案中都會有一個檢測程式,以nginx的Tarball檔案為例,configure就是這個檢測程式(二進位制程式):
這個檢測程式的檢測內容大致如下:
- 是否有合適的編譯器可以編譯本軟體的程式程式碼;比如gcc或cc等C語言編譯器。
- 是否已經存在本軟體所依賴的函式庫或其它軟體;比如make和autoconfig等軟體。
- 作業系統平臺是否適合本軟體,包括Linux的核心版本;
- 核心的標頭檔案(header include)是否存在(驅動程式必須要的檢測);
不同的軟體這個檢測程式可能會有不同,但一般都會提供這麼一個程式,大傢俱體問題具體分析即可;
那麼我們可以通過執行以下程式進行檢測。如果以上內容通過檢測,那麼會生成Makefile檔案,這個檔案將被步驟5的make程式用到;
# 執行檢測程式,通過檢測後建立Makefile
./configure --prefix=/usr/local/nginx
下面先來一個簡單Makefile檔案瞭解下,以下Makefile檔案中包含兩個目標(main和clean)。每個目標的第一行由英文冒號分隔,冒號左邊是目標名稱,冒號右邊是依賴檔案(非必要),即具有相關性的目標檔案。第二行則為命令列,需要注意的是命令列必須以Tab鍵作為開頭才可以:
main: main.o targetFile.o targetFile2.o targetFile3.o
gcc -o main main.o targetFile.o targetFile2.o targetFile3.o -lm
clean:
rm -f main main.o targetFile.o targetFile2.o targetFile3.o
經上述,可以大致歸納Makefile語法如下:
目標(target):目標檔案1 目標檔案2 ... 目標檔案n
<tab> 命令1
<tab> 命令2
...
上述例項Makefile藉助變數可以優化成如下所示,這個變數可以是shell的環境變數,可以是Makefile指定的環境變數,也可以是make命令列後面加的變數。稍微有些程式設計基礎的應該對變數很熟悉,本次不做講解:
LIBS = -lm
OBJS = main.o targetFile.o targetFile2.o targetFile3.o
CFLAGS = -WALL
main: ${OBJS}
gcc -o [email protected] ${OBJS} ${LIBS}
clean:
rm -f [email protected] ${OBJS}
另外附上nginx的通過configure程式生成的Makefile檔案內容,加深下語法瞭解;另外以下內容中出現了兩行以.PHONY開頭的內容,.PHONY 後面跟的目標都被稱為偽目標,也就是說我們 make 命令後面跟的引數如果出現在.PHONY 定義的偽目標中,那就直接在Makefile中就執行偽目標的依賴和命令。不管Makefile同級目錄下是否有該偽目標同名的檔案,即使有也不會產生衝突。另一個就是提高執行makefile時的效率。
default: build
clean:
rm -rf Makefile objs
.PHONY: default clean
build:
$(MAKE) -f objs/Makefile
install:
$(MAKE) -f objs/Makefile install
modules:
$(MAKE) -f objs/Makefile modules
upgrade:
/usr/local/nginx/sbin/nginx -t
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
sleep 1
test -f /usr/local/nginx/logs/nginx.pid.oldbin
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
.PHONY: build install modules upgrade
5、編譯程式;
用make這個程式,並使用當前目錄下的Makefile作為它的引數配置檔案,來進行make(編譯或其它)操作;使用命令如下:
make
其實make低層還是利用了gcc進行編譯的操作,即原始碼->目標檔案->執行檔案。但它的好處是:
簡化編譯時所需要執行的命令;
若在編譯完成之後,修改了某個原始碼檔案,那麼make只會針對被修改了的檔案進行編譯,其它的目標檔案不會被修改;
可以依照依賴性來更新執行檔案
6、安裝程式;
通過執行以下命令來完成程式的安裝;
make install
其本質就是會執行Makefile檔案中的install目標中包含的命令選項,一般為將步驟5中編譯完成的內容安裝到預定的目錄中。預定的目錄可以在步驟4時設定,不設定時為預設安裝到/usr/local中;