Bash 例項:探討 ebuild 系統(轉)
Bash 例項:探討 ebuild 系統(轉)[@more@]進入 ebuild 系統
我真是一直期待著這第三篇、也是最後一篇 Bash 例項文章,因為既然已經在 第 1 篇和 第 2 篇中講述了 bash 程式設計基礎,就可以集中講述象 bash 應用開發和程式設計這樣更高階的主題。在本文中,將透過我花了許多時間來編碼和細化的專案,Gentoo Linux ebuild 系統,來給您大量實際的、現實世界的 bash 開發經驗。
我是 Gentoo Linux(目前還是 beta 版的下一代 Linux OS)的首席設計師。我的主要責任之一就是確保所有二進位制包(類似於 RPM)都正確建立並一起使用。正如您可能知道的,標準 Linux 系統不是由一棵統一的源樹組成(象 BSD),而實際上是由超過 25 個協同工作的核心包組成。這其中包括:
包 描述
linux 實際核心
util-linux 與 Linux 相關的雜項程式集合
e2fsprogs 與 ext2 檔案系統相關的實用程式集合
glibc GNU C 庫
每個包都位於各自的 tar 壓縮包中,並由不同的獨立開發人員或開發小組維護。要建立一個發行版,必須對每個包分別進行下載、編譯和打包處理。每次要修復、升級或改進包時,都必須重複編譯和打包步驟(並且,包確實更新得很快)。為了幫助消除建立和更新包所涉及的重複步驟,我建立了 ebuild 系統,該系統幾乎全用 bash 編寫。為了增加您的 bash 知識,我將循序漸進地為您演示如何實現該 ebuild 系統的解包和編譯部分。在解釋每一步時,還將討論為什麼要作出某些設計決定。在本文末尾,您不僅將極好地掌握大型 bash 程式設計專案,還實現了完整自動構建系統的很大一部分。
為什麼選擇 bash?
Bash 是 Gentoo Linux ebuild 系統的基本元件。選擇它做為 ebuild 的主要語言有幾個原因。首先,其語法不復雜,並且為人們所熟悉,這特別適合於呼叫外部程式。自動構建系統是自動呼叫外部程式的“膠合程式碼”,而 bash 非常適合於這種型別的應用。第二,Bash 對函式的支援允許 ebuild 系統使用模組化、易於理解的程式碼。第三,ebuild 系統利用了 bash 對環境變數的支援,允許包維護人員和開發人員在執行時對其進行方便的線上配置。
構建過程回顧
在討論 ebuild 系統之前,讓我們回顧一下編譯和安裝包都牽涉些什麼。例如,讓我們看一下 "sed" 包,這個作為所有 Linux 版本一部分的標準 GNU 文字流編輯實用程式。首先,下載原始碼 tar 壓縮包 (sed-3.02.tar.gz)(請參閱參考資料)。我們將把這個檔案儲存在 /usr/src/distfiles 中,將使用環境變數 "$DISTDIR" 來引用該目錄。"$DISTDIR" 是所有原始原始碼 tar 壓縮包所在的目錄,它是一個大型原始碼庫。
下一步是建立名為 "work" 的臨時目錄,該目錄存放已經解壓的原始碼。以後將使用 "$WORKDIR" 環境變數引用該目錄。要做到這點,進入有寫許可權的目錄,然後輸入:
將 sed 解壓縮到臨時目錄
$ mkdir work$ cd work$ tar xzf /usr/src/distfiles/sed-3.02.tar.gz
然後,解壓縮 tar 壓縮包,建立一個包含所有原始碼、名為 sed-3.02 的目錄。以後將使用環境變數 "$SRCDIR" 引用 sed-3.02 目錄。要編譯程式,輸入:
將 sed 解壓縮到臨時目錄
$ cd sed-3.02$ ./configure --prefix=/usr(autoconf 生成適當的 make 檔案,這要花一些時間)$ make(從原始碼編譯包,也要花一點時間)
因為在本文中只講述解包和編譯步驟,所以將略過 "make install" 步驟。如果要編寫 bash 指令碼來執行所有這些步驟,則程式碼可能類似於:
要執行解包/編譯過程的樣本 bash 指令碼
#!/usr/bin/env bashif [ -d work ]then # remove old work directory if it exists rm -rf workfimkdir workcd worktar xzf /usr/src/distfiles/sed-3.02.tar.gzcd sed-3.02./configure --prefix=/usrmake
我真是一直期待著這第三篇、也是最後一篇 Bash 例項文章,因為既然已經在 第 1 篇和 第 2 篇中講述了 bash 程式設計基礎,就可以集中講述象 bash 應用開發和程式設計這樣更高階的主題。在本文中,將透過我花了許多時間來編碼和細化的專案,Gentoo Linux ebuild 系統,來給您大量實際的、現實世界的 bash 開發經驗。
我是 Gentoo Linux(目前還是 beta 版的下一代 Linux OS)的首席設計師。我的主要責任之一就是確保所有二進位制包(類似於 RPM)都正確建立並一起使用。正如您可能知道的,標準 Linux 系統不是由一棵統一的源樹組成(象 BSD),而實際上是由超過 25 個協同工作的核心包組成。這其中包括:
包 描述
linux 實際核心
util-linux 與 Linux 相關的雜項程式集合
e2fsprogs 與 ext2 檔案系統相關的實用程式集合
glibc GNU C 庫
每個包都位於各自的 tar 壓縮包中,並由不同的獨立開發人員或開發小組維護。要建立一個發行版,必須對每個包分別進行下載、編譯和打包處理。每次要修復、升級或改進包時,都必須重複編譯和打包步驟(並且,包確實更新得很快)。為了幫助消除建立和更新包所涉及的重複步驟,我建立了 ebuild 系統,該系統幾乎全用 bash 編寫。為了增加您的 bash 知識,我將循序漸進地為您演示如何實現該 ebuild 系統的解包和編譯部分。在解釋每一步時,還將討論為什麼要作出某些設計決定。在本文末尾,您不僅將極好地掌握大型 bash 程式設計專案,還實現了完整自動構建系統的很大一部分。
為什麼選擇 bash?
Bash 是 Gentoo Linux ebuild 系統的基本元件。選擇它做為 ebuild 的主要語言有幾個原因。首先,其語法不復雜,並且為人們所熟悉,這特別適合於呼叫外部程式。自動構建系統是自動呼叫外部程式的“膠合程式碼”,而 bash 非常適合於這種型別的應用。第二,Bash 對函式的支援允許 ebuild 系統使用模組化、易於理解的程式碼。第三,ebuild 系統利用了 bash 對環境變數的支援,允許包維護人員和開發人員在執行時對其進行方便的線上配置。
構建過程回顧
在討論 ebuild 系統之前,讓我們回顧一下編譯和安裝包都牽涉些什麼。例如,讓我們看一下 "sed" 包,這個作為所有 Linux 版本一部分的標準 GNU 文字流編輯實用程式。首先,下載原始碼 tar 壓縮包 (sed-3.02.tar.gz)(請參閱參考資料)。我們將把這個檔案儲存在 /usr/src/distfiles 中,將使用環境變數 "$DISTDIR" 來引用該目錄。"$DISTDIR" 是所有原始原始碼 tar 壓縮包所在的目錄,它是一個大型原始碼庫。
下一步是建立名為 "work" 的臨時目錄,該目錄存放已經解壓的原始碼。以後將使用 "$WORKDIR" 環境變數引用該目錄。要做到這點,進入有寫許可權的目錄,然後輸入:
將 sed 解壓縮到臨時目錄
$ mkdir work$ cd work$ tar xzf /usr/src/distfiles/sed-3.02.tar.gz
然後,解壓縮 tar 壓縮包,建立一個包含所有原始碼、名為 sed-3.02 的目錄。以後將使用環境變數 "$SRCDIR" 引用 sed-3.02 目錄。要編譯程式,輸入:
將 sed 解壓縮到臨時目錄
$ cd sed-3.02$ ./configure --prefix=/usr(autoconf 生成適當的 make 檔案,這要花一些時間)$ make(從原始碼編譯包,也要花一點時間)
因為在本文中只講述解包和編譯步驟,所以將略過 "make install" 步驟。如果要編寫 bash 指令碼來執行所有這些步驟,則程式碼可能類似於:
要執行解包/編譯過程的樣本 bash 指令碼
#!/usr/bin/env bashif [ -d work ]then # remove old work directory if it exists rm -rf workfimkdir workcd worktar xzf /usr/src/distfiles/sed-3.02.tar.gzcd sed-3.02./configure --prefix=/usrmake
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-962886/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深入探討單例模式單例模式
- 探討分散式ID生成系統分散式
- 探討PostgreSQL例項中資料庫之間的關係SQL資料庫
- F5解決方案如何?結合創新例項來探討
- 探討系統中?錢的精度問題
- Windows平臺RTMP多例項推送探討Windows
- 如何用一個例項來探討嵌入式軟體架構設計架構
- 關於 Xmind 用例線上管理的探討
- OpenGL Shader例項,OpenGL 粒子系統
- Linux系統中head命令例項Linux
- 探討丨傳統行業必須數字化轉型嗎?行業
- Promise探討Promise
- Bash Shell指令碼中的陣列使用例項指令碼陣列
- 深入探討 UndefinedUndefined
- 深入探討HBASE
- OPCUA 探討(一)
- 【穩定性】從專案風險管理角度探討系統穩定性
- Android Input子系統-含例項原始碼Android原始碼
- Linux系統中的basename命令使用例項Linux
- Vue原始碼探祕(四)(例項掛載$mount)Vue原始碼
- 如何將獨立例項轉換成叢集例項EU
- Springboot 加密方案探討Spring Boot加密
- px em rem 探討REM
- 模板與例項在系統中的應用
- 關於 js 物件 轉 字串 和 深拷貝 的 探討JS物件字串
- 戰鬥通行證?戰令? 深度探討這肝氪齊下的系統
- CSS 例項之翻轉圖片CSS
- Bash 指令碼例項:獲取符號連結的目標位置指令碼符號
- Netty URL路由方案探討Netty路由
- JavaScript原型鏈汙染探討JavaScript原型
- Oracle Freelist和HWM原理探討及相關效能優化(轉)Oracle優化
- 影片直播系統原始碼,例項原始碼系列-設定系統時間原始碼
- 探討一下Linux系統中使用者ID的五種分類!Linux
- 系統高可用之容災應急切換演練探討活動總結
- 商家如何利用短影片全民探店系統引流轉化?
- Android系統服務編寫例項-Binder(Java層AIDL)AndroidJavaAI
- Linux系統中的lsmod、lsof、lspci、lsscsi命令及例項Linux
- 大型監控網路系統規劃ip地址例項
- 面向系統管理員的 Bash 指南