为一个真实的软件包制做 ebuild

在『初探 ebuild』文中讲述了 Portage 树与 ebuild 文件的基本知识。这一篇利用这些基本知识来为一个真实的软件包写一份 ebuild 文件,经过这一实例能够大体了解如何使用 Eclass 中的函数。html

OCE

要安装的软件包是 OCE,它是 Open CASCADE 项目的社区版本。Open CASCADE 是一个开源的三维几何建模引擎。OCE 是一些非 Open CASCADE 官方的开发者在 Open Cascade 项目的基础上改进并及时归入新补丁的项目。能够认为 OCE 项目是 Open CASCADE 项目的激进版。之因此要安装 OCE,是由于须要将其做为 FreeCAD 的几何核心。之后我会再写一个安装 FreeCAD 的 ebuild。git

获取 GIT 仓库中的源代码

在『初探 ebuild』文中谈到,只需在 ebuild 文件中定义 SRC_URI 变量,ebuild.sh 脚本即可以根据 SRC_URI 的值自动下载源码包。如今咱们面临的问题是如何从 Git 仓库的服务器端迁出 OCE 源码,这时 SRC_URI 便无效了,需定义 EGIT_REPO_URI 这个变量,其值为 git 仓库地址。github

即便在 ebuild 中定义了 EGIT_REPO_URIebuild.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"

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 默认构建环境的标准作法,即: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 文件中经过 DEPENDRDEPEND 这两个变量告诉 Portage 系统:『要编译安装 OCE,你必须先安装 xxx、yyy……』

有关 OCE 的依赖包问题,留待往后再解决。

相关文章
相关标签/搜索