PYTHON-R1.ECLASS

章节: eclass-manpages (5)
更新: 2024年11月
索引 返回主目录

名称

python-r1.eclass - Python 软件包的通用简单 eclass。

描述

一个通用的 eclass,提供辅助函数来构建和安装支持为多个 Python 实现安装的软件包。

此 eclass 设置正确的 IUSE。REQUIRED_USE 的修改必须由 ebuild 的作者完成(但为了方便起见提供了 PYTHON_REQUIRED_USE,见下文)。python-r1 导出 PYTHON_DEPS 和 PYTHON_USEDEP,以便您可以轻松地为您的软件包创建正确的依赖关系。它还提供方法来轻松地为每个启用的 Python 实现运行命令并复制其源代码。

请注意,python-r1 将始终继承 python-utils-r1。因此,在那里定义的所有函数都可以在使用 python-r1 的软件包中使用,并且永远不需要同时继承两者。

有关更多信息,请参阅 Python 指南:https://projects.gentoo.org/python/guide/

支持的 EAPIS

7 8

传递提供的 ECLASES

python-utils-r1

函数

python_gen_useflags [<模式>...]
输出 Python 实现的 USE 标志列表,这些实现同时在 PYTHON_COMPAT 中并且与作为参数传递给函数的任何模式匹配。

有关模式语法的详细信息,请参阅 python-utils-r1.eclass 中的 _python_impl_matches。

示例

PYTHON_COMPAT=( python{2_7,3_4} )
REQUIRED_USE="doc? ( || ( $(python_gen_useflags python2*) ) )"

它将导致变量看起来像

REQUIRED_USE="doc? ( || ( python_targets_python2_7 ) )"
python_gen_cond_dep <依赖项> [<模式>...]
输出 <依赖项> 列表,这些依赖项有条件地取决于 Python 实现的 USE 标志,这些实现同时在 PYTHON_COMPAT 中并且与作为其余参数传递的任何模式匹配。

有关模式语法的详细信息,请参阅 python-utils-r1.eclass 中的 _python_impl_matches。

为了在软件包上强制执行 USE 约束,可以在依赖项规范中放置逐字的 '${PYTHON_USEDEP}'(带引号!)。它将在函数内扩展为正确的 USE 依赖项字符串。

示例

PYTHON_COMPAT=( python{2_7,3_{3,4}} pypy )
RDEPEND="$(python_gen_cond_dep \
  'dev-python/unittest2[${PYTHON_USEDEP}]' python2_7 pypy )"

它将导致变量看起来像

RDEPEND="python_targets_python2_7? (
    dev-python/unittest2[python_targets_python2_7?] )
        python_targets_pypy? (
    dev-python/unittest2[python_targets_pypy?] )"
python_gen_impl_dep [<请求的 use 标志> [<实现模式>...]]
输出对 Python 实现的依赖项,并附加指定的 USE 依赖项字符串,或者如果没有参数(或参数为空)则不输出 USE 依赖项字符串。如果传递了任何实现模式,则只会为与这些模式匹配的实现生成输出依赖项。

有关模式语法的详细信息,请参阅 python-utils-r1.eclass 中的 _python_impl_matches。

当您需要根据软件包的 USE 标志请求 Python 解释器的不同 USE 标志时,请使用此函数。如果您只需要一组解释器 USE 标志,只需设置 PYTHON_REQ_USE 并全局使用 ${PYTHON_DEPS}。

示例

PYTHON_COMPAT=( python{2_7,3_{3,4}} pypy )
RDEPEND="foo? ( $(python_gen_impl_dep 'xml(+)') )"

它将导致变量看起来像

RDEPEND="foo? (
  python_targets_python2_7? (
    dev-lang/python:2.7[xml(+)] )
        python_targets_pypy? (
    dev-python/pypy[xml(+)] ) )"
python_gen_any_dep [<依赖项块> [<实现模式>...]]
生成一个 any-of 依赖项,该依赖项强制 Python 解释器和 Python 软件包之间进行版本匹配。<依赖项块> 可以列出多个依赖项,并使用逐字的 '${PYTHON_USEDEP}' 或 '${PYTHON_SINGLE_USEDEP}' 引用(带引号!),这些引用将在函数内部扩展。如果 <依赖项块> 是一个空字符串(或没有传递参数),则将生成对任何 Python 解释器的纯依赖项。

可以选择指定模式以将依赖项限制在 ebuild 支持的 Python 实现子集中。有关模式语法的详细信息,请参阅 python-utils-r1.eclass 中的 _python_impl_matches。

这应与相应的 python_check_deps() 一起使用,该函数检查匹配了哪些 any-of 块,以及启用匹配实现使用的 python_setup 调用。

使用示例

BDEPEND="$(python_gen_any_dep '
        dev-python/foo[${PYTHON_SINGLE_USEDEP}]
        || ( dev-python/bar[${PYTHON_USEDEP}]
                dev-python/baz[${PYTHON_USEDEP}] )' -2)"

python_check_deps() {
        python_has_version "dev-python/foo[${PYTHON_SINGLE_USEDEP}]" &&
                { python_has_version "dev-python/bar[${PYTHON_USEDEP}]" ||
                        python_has_version "dev-python/baz[${PYTHON_USEDEP}]"; }
}

src_compile() {
        python_foreach_impl usual_code

        # some common post-build task that requires Python 2
        python_setup -2
        emake frobnicate
}

示例值

|| (
        (
                dev-lang/python:3.7
                dev-python/foo[python_single_target_python3_7(-)]
                || ( dev-python/bar[python_targets_python3_7(-),-python_single_target_python3_7(-)]
                        dev-python/baz[python_targets_python3_7(-),-python_single_target_python3_7(-)] )
        )
        (
                dev-lang/python:3.8
                dev-python/foo[python_single_target_python3_8(-)]
                || ( dev-python/bar[python_targets_python3_8(-)]
                        dev-python/baz[python_targets_python3_8(-)] )
        )
)
python_copy_sources
为每个启用的 Python 实现创建软件包源代码的单个副本。

源代码始终从初始 BUILD_DIR(如果未设置则为 S)复制到与 python_foreach_abi() 使用的 BUILD_DIR 匹配的特定于实现的构建目录。

python_foreach_impl <命令> [<参数>...]
为每个启用的 Python 实现运行给定的命令。如果传递了其他参数,它们将传递给命令。

如果所有调用都成功,则该函数将返回 0 状态。否则,将返回第一个失败调用的返回代码。

对于正在运行的每个命令,EPYTHON、PYTHON 和 BUILD_DIR 在本地设置,前两个导出到命令环境。

python_setup [<实现模式>...]
查找最适合运行通用 Python 代码的最佳(最优选)Python 实现。为该实现设置 Python 构建环境。此函数有两种操作模式:纯模式和 any-of 依赖模式。

如果未声明 python_check_deps() 函数,则使用纯模式。在这种情况下,如果实现受支持(在 PYTHON_COMPAT 中)、已启用(通过 USE 标志)并且至少与传递的一个模式匹配(如果未传递任何模式则为 '*'),则该实现被认为是合适的。

纯模式中的实现限制需要伴随着适当的 REQUIRED_USE 约束。否则,eclass 可能会因未满足的依赖项而在构建时失败。

如果声明了 python_check_deps(),则使用 any-of 依赖模式。在此模式下,如果实现受支持、至少与一个模式匹配并且 python_check_deps() 返回代码成功,则该实现被认为是合适的。不考虑 USE 标志。

any-of 模式中的 python_check_deps() 函数需要伴随着适当的 any-of 依赖项。

有关模式语法的详细信息,请参阅 python-utils-r1.eclass 中的 _python_impl_matches。

当 Python 在 python_foreach_impl 调用之外被调用时(例如,对于共享进程,如文档构建),需要使用此函数。python_foreach_impl 本身设置构建环境。

纯模式示例

BDEPEND="doc? ( dev-python/epydoc[$(python_gen_usedep 'python2*')] )"
REQUIRED_USE="doc? ( $(python_gen_useflags 'python2*') )"

src_compile() {
  #...
  if use doc; then
    python_setup 'python2*'
    make doc
  fi
}

Any-of 模式示例

BDEPEND="doc? (
        $(python_gen_any_dep 'dev-python/epydoc[${PYTHON_USEDEP}]' 'python2*') )"

python_check_deps() {
        ! use doc && return 0
        python_has_version "dev-python/epydoc[${PYTHON_USEDEP}]"
}

src_compile() {
  #...
  if use doc; then
    python_setup 'python2*'
    make doc
  fi
}
python_replicate_script <路径>...
将给定的脚本复制到所有启用的 Python 实现的变体中,然后将其替换为指向包装器的符号链接。

所有指定的文件必须以 'python' shebang 开头。没有匹配 shebang 的文件将被拒绝。

ECLASS 变量

PYTHON_COMPAT (必填)
此变量包含软件包支持的 Python 实现列表。它必须在 `inherit` 调用之前设置。它必须是一个数组。

示例

PYTHON_COMPAT=( python2_7 python3_3 python3_4 )

请注意,如果您愿意,也可以使用 bash 花括号扩展。

PYTHON_COMPAT=( python2_7 python3_{3,4} )
PYTHON_COMPAT_OVERRIDE (用户变量)
在处理 ebuild 时,可以使用此变量覆盖 ebuild 中的 PYTHON_COMPAT。它是一个字符串,列出了软件包将为其构建的所有实现。它需要在调用环境中指定,而不是在 ebuild 中指定。

需要注意的是,为了保持元数据不变性,PYTHON_COMPAT_OVERRIDE 不会影响 IUSE 也不影响依赖项。PYTHON_TARGETS 的状态被忽略,并且构建 PYTHON_COMPAT_OVERRIDE 中的所有实现。需要手动满足依赖项。

示例

PYTHON_COMPAT_OVERRIDE='pypy python3_3' emerge -1v dev-python/foo
PYTHON_REQ_USE
在所选 Python 实现上需要启用的 USE 标志列表,形成为 USE 依赖项字符串。它应该对 PYTHON_COMPAT 中的所有实现有效,因此可能需要使用 USE 默认值。

这应该在调用 `inherit` 之前设置。

示例

PYTHON_REQ_USE="gdbm,ncurses(-)?"

它将导致 Python 依赖项看起来像

python_targets_pythonX_Y? ( dev-lang/python:X.Y[gdbm,ncurses(-)?] )
PYTHON_DEPS (由 ECLASS 生成)
这是 PYTHON_COMPAT 中列出的所有实现的 eclass 生成的 Python 依赖项字符串。

使用示例

RDEPEND="${PYTHON_DEPS}
        dev-foo/mydep"
BDEPEND="${PYTHON_DEPS}"

示例值

python_targets_python2_7? ( dev-lang/python:2.7[gdbm] )
python_targets_pypy? ( dev-python/pypy[gdbm] )
PYTHON_USEDEP (由 ECLASS 生成)
这是一个 eclass 生成的 USE 依赖项字符串,可用于依赖于为相同 Python 实现构建的另一个 Python 软件包。

使用示例

RDEPEND="dev-python/foo[${PYTHON_USEDEP}]"

示例值

python_targets_python2_7(-)?,python_targets_python3_4(-)?
PYTHON_SINGLE_USEDEP (由 ECLASS 生成)
当前测试实现的 eclass 生成的 USE 依赖项字符串。它在 python_check_deps() 调用中本地设置。

生成的 USE 标志列表与使用 python-single-r1 eclass 的软件包兼容。对于 python-r1 依赖项,请使用 PYTHON_USEDEP。

使用示例

python_check_deps() {
        python_has_version "dev-python/bar[${PYTHON_SINGLE_USEDEP}]"
}

示例值

python_single_target_python3_7(-)
PYTHON_REQUIRED_USE (由 ECLASS 生成)
这是一个 eclass 生成的 required-use 表达式,它确保至少启用了一个 Python 实现。

此表达式应通过将其包含在 REQUIRED_USE 中(可选地在 use 标志后面)来在 ebuild 中使用。

使用示例

REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )"

示例值

|| ( python_targets_python2_7 python_targets_python3_4 )
BUILD_DIR (由 ECLASS 生成)
当前构建目录。在全局范围内,它应该包含一个初始构建目录;如果未设置,则默认为 ${S}。

在 python_foreach_impl() 运行的函数中,BUILD_DIR 在本地设置为特定于实现的构建目录。该路径是通过将连字符和实现名称附加到初始 BUILD_DIR 的最后一个组件来创建的。

示例值

${WORKDIR}/foo-1.3-python2_7

作者

作者:Michał Górny <[email protected]>
基于以下人员的工作:Krzysztof Pawlik <[email protected]>

维护者

Python 团队 <[email protected]>

报告错误

请通过 https://bugs.gentoo.org/ 报告错误

文件

python-r1.eclass

另请参阅

ebuild(5)
https://gitweb.gentoo.org/repo/gentoo.git/log/eclass/python-r1.eclass


索引

名称
描述
支持的 EAPIS
传递提供的 ECLASES
函数
ECLASS 变量
作者
维护者
报告错误
文件
另请参阅

本文档由 man2html 使用手册页创建。
时间:2024年11月12日,格林威治标准时间03:27:01