在『初探 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 的依赖包问题,留待往后再解决。