在『初探 ebuild』文中講述了 Portage 樹與 ebuild 文件的基本知識。這一篇利用這些基本知識來爲一個真實的軟件包寫一份 ebuild 文件,經過這一實例能夠大體瞭解如何使用 Eclass 中的函數。html
要安裝的軟件包是 OCE,它是 Open CASCADE 項目的社區版本。Open CASCADE 是一個開源的三維幾何建模引擎。OCE 是一些非 Open CASCADE 官方的開發者在 Open Cascade 項目的基礎上改進並及時歸入新補丁的項目。能夠認爲 OCE 項目是 Open CASCADE 項目的激進版。之因此要安裝 OCE,是由於須要將其做爲 FreeCAD 的幾何核心。之後我會再寫一個安裝 FreeCAD 的 ebuild。git
在『初探 ebuild』文中談到,只需在 ebuild 文件中定義 SRC_URI
變量,ebuild.sh
腳本即可以根據 SRC_URI
的值自動下載源碼包。如今咱們面臨的問題是如何從 Git 倉庫的服務器端遷出 OCE 源碼,這時 SRC_URI
便無效了,需定義 EGIT_REPO_URI
這個變量,其值爲 git 倉庫地址。github
即便在 ebuild 中定義了 EGIT_REPO_URI
,ebuild.sh
也不知道應該如何處理這個變量。由於根據 EGIT_REPO_URI
的值從 git 倉庫遷出源碼的函數是在 /usr/portage/eclass/git-2.eclass
中定義的,所以爲了可以讓 ebuild.sh
調用這個函數,須要使用 inherit
函數。inherit
就相似於 C 語言的 #include
,能夠載入 /usr/portage/eclass
中的 Eclass 文件。web
下面這個 ebuild 文件足以從 github 服務器上遷出 OCE 源碼了。segmentfault
# Copyright 1999-2014 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: $ EAPI=5 inherit git-2 DESCRIPTION="This project aims at gathering patches/changes/improvements from the OCC community over the latest release" HOMEPAGE="https://github.com/tpaviot/oce" EGIT_REPO_URI="git://github.com/tpaviot/oce.git" LICENSE="LGPL" SLOT="0" KEYWORDS="~amd64"
OCE 的構建環境支持 Autotools,也支持 CMake,可是推薦使用後者。ebuild.sh
能夠經過 /usr/portage/eclass/cmake-utils.elcass
中定義的一些函數來調用 CMake 完成 OCE 源碼的編譯與安裝,可是必須事先使用 inherit
載入 cmake-utils.eclass
。數組
因爲 inherit
函數支持多個參數,所以可將上文中的 inherit
行修改成:服務器
inherit git-2 cmake-utils
這樣便使得 ebuild.sh
具有了操控 CMake 的能力。函數
OCE 項目默認的 CMake 構建環境是將 /usr/local
做爲源碼編譯結果的安裝目錄的前綴。若是是手動編譯安裝 OCE,那麼 /usr/local
這個目錄前綴彷佛並不壞。可是如今咱們是要讓 Portage 來管理 OCE 的安裝與卸載,若是不使用 /usr
做爲目錄前綴,給人的感受是太不嚴肅了。所以,必需要將 OCE 安裝到 /usr
目錄中。要作到這一點,須要修改 OCE 的 CMake 默認的安裝目錄前綴。工具
cmake-utils.eclass
的參考文檔中給出了修改 CMake 默認構建環境的標準作法,即:ui
src_configure() { local mycmakeargs=( ) cmake-utils_src_configure }
咱們只需在 mycmakeargs
這個 Bash 數組中給出咱們指望的編譯選項便可。因爲咱們的目的僅僅是想修改 OCE 默認的安裝目錄前綴,所以只需在 mycmakeargs
中給出 OCE_INSTALL_PREFIX
變量的定義,即:
src_configure() { local mycmakeargs=( -DOCE_INSTALL_PREFIX=/usr ) cmake-utils_src_configure }
至於 OCE_INSTALL_PREFIX
這個變量的來歷,須要懂得一些 CMake 的知識。
也就是說,Eclass 只是經過 Bash 腳本對主流的項目構建工具進行封裝,便於在 ebuild 文件中調用項目構建工具。只有懂得如何應用這些項目構建工具,方能具有 ebuild 來控制它們。
首先須要建立 /usr/local/portage/sci-libs/oce
這個分類目錄,而後在該目錄中添加 oce-9999.ebuile
文件,內容如上一節所述。
之因此使用 9999
這個版本號,並非出於中國對數字 9
的迷戀,而是用它來表示一個最新的版本號。也就是說,gentoo 開發者認爲正常的軟件版本號不多會大於這個數字,所以你安裝的 9999
版本便不會被小於這個版本號的同一軟件包覆蓋。
而後使用生成 oce-9999.ebuild
的簽名文件:
# cd /usr/local/portage/sci-libs.oce # ebuild ./oce-9999.ebuild manifest
剩下的事情就是編譯安裝 OCE 的源碼包了,即:
# emerge -avt oce
上面這個命令作了不少工做:
從 github 服務器遷出 OCE 源代碼;
在 /var/tmp/portage
目錄開闢 OCE 的編譯環境,即沙盒(Sandbox);
在沙盒中編譯 OCE 源碼,並將編譯結果複製到沙盒中指定的安裝目錄;
將沙盒中的安裝目錄中的文件按照目錄結構複製到 /
目錄。
這一切的工做,都是在 ebuild 文件的指示下進行的。不管是 gentoo 的官方開發者仍是咱們這些業餘 hackers,ebuild 文件是咱們與 Gentoo 系統對話的媒介。
編譯安裝 OCE,不只構建過程當中須要依賴一些軟件包, OCE 庫在運行時也須要依賴一些軟件包。普通用戶只是但願可以儘快的安裝 OCE 並讓它可以正常運行,他們對 OCE 依賴哪些軟件包並不關心,由於這是開發者的事。因此,OCE 的 ebuild 做者須要在身體力行的編譯與使用 OCE 時瞭解它的全部依賴包,而後在 ebuild 文件中經過 DEPEND
與 RDEPEND
這兩個變量告訴 Portage 系統:『要編譯安裝 OCE,你必須先安裝 xxx、yyy……』
有關 OCE 的依賴包問題,留待往後再解決。