為一個真實的軟件包制作 ebuild

jopen 9年前發布 | 13K 次閱讀 ebuild


在『初探 ebuild』文中講述了 Portage 樹與 ebuild 文件的基本知識。這一篇利用這些基本知識來為一個真實的軟件包寫一份 ebuild 文件,通過這一實例可以大致了解如何使用 Eclass 中的函數。

OCE

要安裝的軟件包是 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 倉庫地址。

即使在 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 文件。

下面這個 ebuild 文件足以從 github 服務器上遷出 OCE 源碼了。

# 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"

CMake 編譯環境的配置

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 默認構建環境的標準做法,即:

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 的依賴包問題,留待日后再解決。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!