美文网首页
FROG-02-Portage软件管理

FROG-02-Portage软件管理

作者: A红豆爸爸 | 来源:发表于2023-04-24 20:22 被阅读0次

    FROG项目培训文档系列之02

    Portage软件管理


    本章内容包括:

    1.Portage简介

    2.Portage tree

    3.Overlay

    4.emerge 操作

    5.equery

    6.ebuild 文件

    7.Eclass

    8.ebuild 中软件包依赖

    上一章节我们提到了gentoo软件管理的一些基本概念,本章我们来详细介绍。

    1.Portage简介

    Portage是Gentoo Linux的软件管理方案。Portage也是Gentoo在软件包管理方面最瞩目的创新。它所具有的高度灵活性以及其他大量的特性,使其经常被认为是Linux中最好用的软件包管理工具。Portage system完全用Python和Bash写成。由于它们均为脚本语言,所以Portage对于用户而言也就是完全可见的。

    为获得Gentoo Linux的最新软件,只需要输入一个命令:

            emerge --sync

    这个命令告诉Portage到因特网更新本地的Portage树。

    Portage也是一套软件包编译和安装系统。输入

           emerge packagename

    Portage将自动会为你编译出一个满足你需要的这个软件包,并根据你的硬件进行优化和确认你想要和不想要的特性。

    Portage也可以保持你的系统保持最新。只需要输入一个命令,

            emerge -uDN world

    你将会使你想要的软件都自动更新一次。

    大多数在Portage中的程式都是以源码形式存在,用户可以通过emerge命令来进行程序的安装。从程序的下载、编译、到安装、更新完成。Portage有不同的ebuild,超过10,000个,ebuild包含了用来描述如何编译、安装和设定程式的解释资料。用Portage最大的好处就是Portage会按照ebuid的描述,会一手包办从下载至安装的所有程序,用户也可以透过设定档 make.conf 对编译作优化设定,编译到已优化的程式。

    与portage相关的几个目录:

    /usr/lib/portage:        portage程序所在位置,各种portage的行为,皆可通过阅读程序来获知

    /usr/portage:            portage tree 官方数据库本地同步目录

    /usr/portage/distfiles:包文件下载目录,可在当前没有emerge操作进行中时删除

    /var/lib/portage:        某个系统信息记录位置,例如world列表文件

    /var/db/pkg:              系统中安装的软件包信息

    /var/cache/edb:        主要临时存放依赖关系信息,可以删除

    2.Portage tree

    当我们谈到软件包的时候,我们通常指的是Portage树为Gentoo用户提供的包的名称。Portage树是ebuilds文件的集合,这些文件包含了Portage管理工具维护软件(安装,搜索,查询, ...)时所需要的所有信息,并被默认的放置在/usr/portage目录中。

    我们在安装 Gentoo 时,一个必须的步骤是下载一个 Portage 树的镜像包,解包后通常安置于 /usr 目录(即 /usr/portage),之后每次执行 emerge --sync 时,便会根据官方远程网站上的 Portage 树来更新你本地的 Portage 树。

    Portage 树有四层结点:

    第1层根结点便是 /usr/portage 目录

    第2层结点是软件包所属分类目录

    第3层结点是软件包的名称目录

    第4层叶子结点则是 ebuild 文件以及其他辅助性文件或目录

    以 gnome-shell-3.12.2.ebuild 文件为例,它在 Portage 树中的完整路径是:

     /usr/portage/gnome-base/gnome-shell/gnome-shell-3.12.2.ebuild

    对于我们期望的软件包,如果 Portage 树没有提供针对它的 ebuild 文件,那么我们需要自己动手丰衣足食。一般是不建议将我们所写的 ebuild 文件放在 Portage 树中的,因为它们可能会在 emerge --sync 期间被冲刷(比如被官方的同名文件替换)。每当您要求Portage对系统中的软件包执行一些操作的时候,它会以系统中的ebuilds文件作为基础。

    3.Overlay

    Portage 树支持一种被称为 Overlay 的技术。简单来说,就是我们可以另行建立一棵新的 Portage 树,这棵树的规模虽然比官方的 Portage 树小很多,但是 Portage 树的管理系统可以将这棵新的 Portage 树与官方 Portage 树『合并』。如果新的 Portage 树中某些结点与官方的 Portage 树存在重叠,那么 Portage 树的管理系统会以前者覆盖后者,因此我们新建的 Portage 树通常被直呼为『Overlay』

    建立自己的 Overlay

    假设在 /usr/local 目录中创建自己的 Overlay,约定俗成的方式是:

    mkdir -p /usr/local/portage

    需要将 Overlay 路径告知 Portage 管理系统,即在 /etc/make.conf 文件中添加以下代码:

    PORTDIR_OVERLAY="/usr/local/portage"

    比如当前海思平台的overlay设置如下

    为了让我们的 Overlay 能够被 Portage 管理系统所接受,需要在 /usr/local/portage 中创建 metadata 子目录,并在该目录内添加内容为 masters = gentoo 的 layout.conf 文件即:

    mkdir  /usr/local/portage/metadata

    echo "masters = gentoo" > /usr/local/portage/metadata/layout.conf

    最后,还需要在 `/usr/local/portage 中创建 profiles 子目录,并在该目录内添加 repo_name 文件。我们可以在这份文件中设置 Overlay 名称,只需将 Overlay 名称写入该文件即可。例如,我将我的 Overlay 命名为 garfileo:

    echo "garfileo" > /usr/local/portage/profiles/repo_name

    今后就在这个 Overlay 中学习 ebuild 文件的编写。

    4.emerge 操作

    emerge是Portage系统的命令行接口,主要用于软件包的安装、升级、卸载。emerge可以自动处理依赖关系、更新portage树、更新已安装的软件包。

        语法:  emerge [选项] [动作] [ebuild | tbz2file | file | @set | atom] ...

    "ebuild"

      必须是一个有效的Portage包目录名(可以不带类别与版本信息),比如:"portage"或"python"

      当然也可以带上类别与版本信息,例如:"sys-apps/portage"或"=python-2.2.1-r2"

      还可以是一个实际的文件名,例如:/usr/portage/app-admin/python/python-2.2.1-r2.ebuild

    "set"

        是一组特定软件包集合的代称。目前有三个set总是可用:selected, system, world 。

        selected 包含用户手动安装的软件包集合(/var/lib/portage/world)

                        及其依赖的软件包集合(/var/lib/portage/world_sets)。

        system 表示系统正常运行所必须的一组软件包(基本系统/最小系统)。

        world 表示 selected 与 system 的合集

    "atom"

      描述了你要安装的软件包的一个限定范围,比如

      “>=dev-lang/python-2.2-1-r2”  大于等于2.2-1-r2的最新可用版本

      "tbz2file"

    一个有效的tbz2文件,创建于ebuild-.ebuild 或者emerge --buildpkg

    1).更新Portage树

    通常我们使用rsync命令来更新Portage树,它是一个快速的增量性的文件传输工具。另外emerge命令为rsync命令提供了一个相当简单的前端。

    emerge --sync

    emerge-webrsync命令会自动将最新的Portage快照下载并安装到您的系统中

    2).软件的查询

    例如要查找<软件包名称>的软件:

    emerge --search <软件包名称>

    而如果要通过软件的描述来查找相应的软件,您可以使用--searchdesc (或者简写为 -S) 开关:

    emerge --searchdesc <软件包名称>

    emerge --S <软件包名称>

    3).软件的安装

    要安装<软件包名称>:

    emerge <软件包名称>

    因为许多应用程序互相依赖,试图安装其中任何一个,可能将会要求同时安装其所依赖的其他相关软件。无需担心,Portage可以很好地处理软件包间的依赖问题。当您安装某个软件的时候,您可以加上--pretend开关,以便观察Portage将会同时安装哪些软件。例如:

    emerge --pretend <软件包名称>

    当您要求Portage安装一个软件,必要时它会自动从internet下载相应的源代码包并默认将其保存在/usr/portage/distfiles目录中,然后将源代码包解压缩,编译并安装软件。

    如果您仅仅希望Portage将源代码包下载到本地而不安装它们,在emerge命令后加上--fetchonly的选项:

    emerge --fetchonly <软件包名称>

    4).查找已安装软件的文档

    许多软件包中包含有自己的文档,有些时候doc的USE标记决定了软件包中的自带文档是否会被安装到本地。您可以通过

    emerge -vp <软件包名称>

    命令来检查是否存在doc USE标记。

    emerge -vp alsa-lib

          [ebuild  N    ] media-libs/alsa-lib-1.0.14_rc1  -debug +doc 698 kB

    软件包安装结束后文档通常会存放在/usr/share/doc目录下以软件包名命名的子目录中

    5).软件的移除

    当您想把一个软件包从系统中移除的时候,使用

    emerge --unmerge <软件包名称>

    命令执行完成后,除了那些在安装软件包后您修改过的配置文件,Portage将会移除此软件包安装到您系统中的所有文件。保留这些修改过的配置文件是为了便于您今后再次使用同一个软件包.

    Portage将不会检查您要删除的包是否仍被其他的包依赖。但是当您要删除一个可能破坏您系统的重要的软件包时,它还是会给予警告。

    当您从系统中移除一个软件包时,之前那些为了满足其依赖关系而自动被一并安装的软件包将会被保留。如果想让Portage移除现在可以移除的相关软件包,可以使用

    emerge --depclean

    6).更新您的系统

    要保持您系统在最佳状态您需要定期的更新您的系统。由于Portage只能检查本地Portage树中已有的ebuilds文件,因此您首先应该更新您的Portage树。

    emerge --sync

    当您的Portage树更新后,您可以用

    emerge --update world

    命令来更新系统。

    我们还会使用--ask开关来控制Portage显示它要更新的软件包列表,并让您决定是否继续更新。

    emerge --update --ask world

    Portage接下来会查找您已经安装的软件包是否有更新版本,但它只会核对那些您已经明确地安装过的软件包(也就是在/var/lib/portage/world文件中列出的包),并不会完整去的检查与这些软件产生依赖关系的包是否也需要更新。

    如果您想更新系统中的每个软件包(包括依赖包),那就加上--deep参数:

    emerge --update --deep world

    5.equery

    equery是Gentoo linux系统软件包相关信息查询工具,它可查看系统已安装包的信息。是一个查询Gentoo系统中的软件包,文件和USE标签状态信息的工具

    使用equery命令之前需要安装此工具: emerge gentoolkit

    详细请参考官方网站: https://wiki.gentoo.org/wiki/Equery

    1. 列出所有已安装包:

    equery list package_name

    equery l package_name

    2. 查看已安装包装了哪些内容:

    equery files package_name

    equery f package_name

    3. 查看一个程序foo隶属于哪个包:

    equery belongs foo

    equery b foo

    4. 查看哪些包直接依赖于package_name:

    equery depends package_name

    equery d package_name

    5. 查看已安装包用了哪些USE:

    equery uses package_name

    equery u package_name 

    USE:

    一个软件不只包含软件本身,还包括其组件,如文档,插件,GUI支持等。

    USE就是用来标记是否要安装软件的同时安装这些组件。

    临时USE :

    USE="-Java" emerge seamonkey

    USE="python" LINGUAS="en zh_CN" emerge postgresql-server  

    6.ebuild 文件

    An ebuild is a specialized bash script which automates compilation and installation procedures for software packages. The format was created by the Gentoo Linux project for use in its Portage software management system.Each version of an application or package in the Portage repository has a specific ebuild script written for it. The script is used by the emerge tool, also created by the Gentoo Linux project, to calculate any dependencies of the desired software installation, download the required files (and patch them, if necessary), configure the package (based on "USE flag" settings), compile, and perform a sandboxed installation (in /var/tmp/portage/[ebuild name]/image/ by default). Upon successful completion of these steps, the installed files are merged into the live system, outside the sandbox.

    若要在 Gentoo 中安装一个软件包,通常要定义如何进行软件源代码包的下载、解包、打补丁、编译、安装以及合并。为了实现对软件包进行细微的定制,还需要定义一些有用的元数据(即 USE 旗标)、补丁文件以及一些操控软件包编译与安装的过程。

    Gentoo 是通过 GNU Bash shell 脚本来定义这一切,这种脚本就是所谓的 ebuild 文件。

    emerge 与 ebuild 联系

    简单的说就是 emerge 这个 Python 脚本会调用 ebuild.sh 这个 Bash 脚本,让后者去执行 ebuild 文件定义的软件包的下载、编译及安装过程

    ebuild.sh 所操控的软件包安装过程是在一个沙箱(Sandbox)中进行的。这一过程结束后,emerge 脚本需要将沙箱中的成果转移到真实世界,即 / 目录。

    写一个非常简单的 ebuild 文件

    假设在 app-misc 这个分类中有一个名为 hello-world 的软件包,现在我们要为这个软件包的 1.0 版的安装写一份 ebuild 文件。

    注意:软件包的分类名并不是随意的,它必须要与 /usr/portage 中的某个子目录名一致。

    1).首先在 Overlay 中建立软件包所在的分支:

      mkdir -p /usr/local/portage/app-misc/hello-world

    可从 /usr/portage/header.txt 文件中复制一份 ebuild 文件默认的文件头,即:

    # Copyright 1999-2014 Gentoo Foundation# Distributed under the terms of the GNU General Public License v2# $Header: $

    只不过是一些 Bash 脚本注释形式的文件描述信息而已,但它们是必须的。可以直接将 /usr/portage/header.txt 文件复制为 hello-world-1.0.ebuild 文件,这样便可获得一个含有上述内容的空 ebuild 文件。

    ebuild 文件的名称必须符合 Portage 所认可的格式,即:

    软件包名称-版本号.ebuild

    cp /usr/portage/header.txt /usr/local/portage/app-misc/hello-world/hello-world-1.0.ebuild

    2).为这份 ebuild 文件增加以下内容:

    SLOT="0"

    有关SLOT:

    通过使用Portage,一个软件的不同版本可以共存于一个系统中。Gentoo的Portage使用一种我们称之为SLOT的技术来实现这种并存。一个ebuild为它自身的版本声明了一个确切的SLOT。具有不同SLOT的同一软件的ebuild可以共存于同一个系统中。软件包可以拥有不同的ebuilds,里面分别有SLOT="1"和SLOT="2"的标志。

    这样,我们便建立了一份最为简单的 ebuild 文件。

    3).接下来生成一份签名文件

    cd /usr/local/portage/app-misc/hello-world

    ebuild ./hello-world-1.0.ebuild manifest

    若签名成功,会在 ebuild 文件同一目录中生成一份名为 Manifest 的文件。将来发布这份 ebuild 文件时,需要将数字签名文件一起发出,这样他人便可以验证这份 ebuild 是不是我们做的。因为非常有可能我们在向朋友们发送 ebuild 文件的过程中会被坏人拦截,然后篡改 ebuild 文件。由于 ebuild 是可被系统执行的脚本,因此很有可能变成『病毒』。因此,ebuild 文件的数字签名非常有必要。不过,这里为了简单起见,没有涉及如何用自己的密钥实现对 ebuild 的签名,所得 Manifest 文件仅仅是为了让 ebuild 能够被 Portage 管理系统所认可。

    4).继续向这份 ebuild 加入一些内容:

    # Copyright 1999-2014 Gentoo Foundation# Distributed under the terms of the GNU General Public License v2# $Header: $ EAPI="5"SLOT="0"DESCRIPTION="A classical example to use when starting on something new."HOMEPAGE="http://wiki.gentoo.org/index.php?title=Basic_guide_to_write_Gentoo_Ebuilds" LICENSE="MIT"KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86"

    基本上就是在原来那份最简单的 ebuild 文件的基础上增加了几个变量:

    EAPI:Portage 系统已经为我们编写了许多有用的 Bash 函数,将 EAPI 的值设为 5 表示我们要用目前最新的 Bash 函数。这个变量必须要在 ebuild 文件头之后进行设定。

    DESCRIPTION:这个变量存储了软件包的简介信息。

    HOMEPAGE:定义了软件包的项目主页。

    LICENSE:定义了 软件包所使用的许可证,例如 LGPL,GPL V2,GPL V3,MIT 等。

    KEYWORDS:如果你期望软件包能够安装在你的机器上,那么 KEYWORDS 变量的值必须要包含你在 /etc/make.conf 中所设定的 ACCEPT_KEYWORDS 值。

    一旦改动了 ebuild 文件内容,那么必须重新生成 Manifest 文件:

    ebuild ./hello-world-1.0.ebuild manifest

    现在便可以使用 emerge 命令安装这个软件包

    5). ebuild 加入SRC_URI

    在一个遥远的地方,真的存在着 hello-world 的源码包。我们只要通过 ebuild 文件将这个源码包的位置告诉 ebuild.sh 脚本,ebuild.sh 便会不远万里将其擒来。所以,我们需要在 hello-world-1.0.ebuild 文件中添加以下内容:

    SRC_URI="http://dev.gentoo.org/~tomwij/files/wiki/hello-world-1.0.tar.gz"

    SRC_URI 这个变量便是存储源码包的下载地址的

    在重新生成 Manifest 时,ebuild.sh 便会自动将源码包下载到 /usr/portage/distfiles 目录,并为这个源码包也生成一个数字签名存储在 Manifest 文件中。

    6). ebuild 加入源码编译安装过程

    既然有了 hello-world 的源码包,那么下一步就该思考如何在 ebuild 文件中定义这个源码包的编译过程了。不过,解开刚才下载的hello-world-1.0.tar.gz 包看一下,发现包里只有一份 Bash 脚本 hello-world,其内容为:

    #!/bin/shecho "Hello world!"

    所以,这个源码包就没必要编译了,直接安装到系统中即可。

    我们在 ebuild 文件中获得了第一次编写 ebuild 函数的机会。在现有的 hello-world-1.0.ebuile 的文件中继续添加以下内容:

    src_install() {

        dobin hello-world

    }

    src_install 是 ebuild.sh 脚本能够识别并执行的函数名。也就是说,从 ebuild.sh 脚本的角度来看,你若想让我替你将软件包安装至系统中,那么你必须得按照我的习惯来。我的习惯就是在你提供给我的 ebuild 文件中寻找 src_install 这个函数,如果有这个函数,我就执行它,否则我就什么也不做。这就是 ebuild.sh 与 ebuild 文件之间达成的一个约定。

    现在我们在 ebuild 文件中向 ebuild.sh 提供了 src_install 这个函数。这个函数只包含一条命令:dobin hello-world 。这个命令的意思是为 hello-world 这个脚本设置可执行权限,然后将其安装至系统默认的可执行文件目录中,即 /usr/bin 目录。

    src_install 只是 ebuild.sh 与 ebuild 文件之间众多约定函数中的一个而已,并且这些约定函数是顺次被 ebuild.sh 执行的,如下图所示:

    这里存在一个问题,hello-world 这个 Bash 脚本是包含在 hello-world-1.0.tar.gz 这个包内的,而我们只在 hello-world-1.0.ebuild 文件中定义了 src_install 函数,那么 hello-world-1.0.tar.gz 何时被解包的呢?

    这个问题的答案是,Portage 管理系统中已经为这些约定的函数定义了默认行为。比如,用于为源码包解包的 src_unpack 函数,其默认的定义是:

    src_unpack() {

        if [ "${A}" != "" ]; then        unpack ${A}    fi}

    如果在 ebuild 文件中没有重新定义 src_unpack 函数,那么 ebuild.sh 便会按照上面图示的管线调用默认的 src_unpack 函数。所以 hello-world 脚本得以从 hello-world-1.0.tar.gz 中解出。

    7.Eclass

    Eclass 是通过 Bash 脚本对主流的项目构建工具进行封装,便于在 ebuild 文件中调用项目构建工具。只有懂得如何应用这些项目构建工具,方能具备 ebuild 来控制它们。

    以安装oce软件包为例

    获取 GIT 仓库中的源代码

    上文谈到只需在 ebuild 文件中定义 SRC_URI 变量,ebuild.sh 脚本便可以根据 SRC_URI 的值自动下载源码包。现在我们面临的问题是如何从 Git 仓库的服务器端迁出软件包源码,这时 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=5inherit git-2DESCRIPTION="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 编译环境的配置

    ebuild.sh 可以通过 /usr/portage/eclass/cmake-utils.elcass 中定义的一些函数来调用 CMake 完成源码的编译与安装,但是必须事先使用 inherit 载入 cmake-utils.eclass

    由于 inherit 函数支持多个参数,因此可将上文中的 inherit 行修改为:

    inherit git-2 cmake-utils

    这样便使得 ebuild.sh 具备了操控 CMake 的能力。

    默认的 CMake 构建环境是将 /usr/local 作为源码编译结果的安装目录的前缀。如果是手动编译安装 oce,那么 /usr/local 这个目录前缀似乎并不坏。但是现在我们是要让 Portage 来管理 oce的安装与卸载,如果不使用 /usr 作为目录前缀,给人的感觉是太不严肃了。因此,必须要将 oce安装到 /usr 目录中。要做到这一点,需要修改 oce的 CMake 默认的安装目录前缀。

    cmake-utils.eclass 的参考文档中给出了修改 CMake 默认构建环境的标准做法,即:

    src_configure() {

            local mycmakeargs=(

                -DOCE_INSTALL_PREFIX=/usr

            )

            cmake-utils_src_configure

    }

    在 mycmakeargs 这个 Bash 数组中给出我们期望的编译选项即可。由于我们的目的仅仅是想修改 oce默认的安装目录前缀,因此只需在 mycmakeargs 中给出 OCE_INSTALL_PREFIX 变量的定义,至于 OCE_INSTALL_PREFIX 这个变量的来历,需要懂得一些 CMake 的知识。

    安装oce

    首先需要创建 /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 文件的指示下进行的。

    8.ebuild 中软件包依赖

    如何在 ebuild 文件中设定软件包的几种常规性依赖:

    隐性的系统依赖

    在 Gentoo 中,所有的软件包在编译及运行时期都会存在一种隐性的依赖,被依赖的软件包都居于 system 这个软件包集中。这个软件包集在安装 Gentoo 期间便落地生根,与 Gentoo 系统共存亡,所以它们就变成了 Gentoo 软件包的隐性依赖。

    若想看一下这些幕后的英雄,下面这条命令可使之浮出水面:

    emerge --pretend @system

    软件包构建期依赖

    在 ebuild 文件中,可以通过 DEPEND 这个变量来指定在解包、打补丁、编译以及安装软件包过程中的依赖。大部分软件包在构建期间均需要一些程序库的头文件与库文件,如果系统中没有安装相应的程序库,那么就无法在系统中构建这些软件包。

    软件包运行时依赖

    将软件源码包的编译结果安装到系统中后,可以将此刻的状态视为软件已经安装至系统中,但是在运行软件的期间,可能还是需要其他软件包的支持,这就是软件包运行时依赖。这种依赖,也是大部分 Linux 发行版都致力解决的问题。

    在 ebuild 文件中,RDEPEND 这个变量用于指定软件包运行时依赖。

    如果确定软件包的运行时依赖与构建期依赖相同,那么直接将 DEPEND 的值赋于 RDEPEND 变量即可。

    9999.ebuild 文件中。现在,完整的 oce-9999.ebuild 内容如下:

    # Copyright 1999-2014 Gentoo Foundation# Distributed under the terms of the GNU General Public License v2# $Header: $EAPI=5

    inherit git-2 cmake-utils

    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"DEPEND="media-libs/ftgl

            virtual/glu

            virtual/opengl

            x11-libs/libXmu"RDEPEND="${DEPEND}"src_configure() {

        local mycmakeargs=(

              -DOCE_INSTALL_PREFIX=/usr

        )

        cmake-utils_src_configure

    }

    Gentoo 升级系统的标准步骤

    #emerge --sync      //升级整个portage目录

    #emerge portage     //如果不是最新的portage,需要按提示执行此操作

    #emerge python     //如果不是最新的python,需要按提示执行此操作

    #/usr/sbin/update-python     //执行完emerge python后执行此操作

    #emerge -avuDN world      //按照 /var/lib/portage/world 文件下的包,重新构建整个系统

     参数说明:  --ask (-a)  控制Portage显示它要更新的软件包列表,并让您决定是否继续更新

                    --verbose (-v) 在屏幕上输出完整的文件列表

                    --update (-u) 更新包的最佳版本

                    --deep (-D)  更新系统中的每个软件包

                    --newuse (-N) USE标记变更后,要使Portage检查USE标记的变动是否导致

                                需要安装新的软件包或者将现有的包重新编译

    #emerge -av --depclean     //清除不需要(孤立)的软件包

    #revdep-rebuild     //gentoolkit包里面的一个软件,用来检查系统的依赖关系是否都满足,

                                自动安装没有满足关系的包

    #dispatch-conf     //更新系统的配置文件

    #emerge -e world     //本地重新编译整个系统,USE标记变化不大时不需执行

     参数说明: --emptytree (-e)  

    相关文章

      网友评论

          本文标题:FROG-02-Portage软件管理

          本文链接:https://www.haomeiwen.com/subject/uaxpjdtx.html