PEP 229 – 使用 Distutils 构建 Python
- 作者:
- A.M. Kuchling <amk at amk.ca>
- 状态:
- 最终
- 类型:
- 标准跟踪
- 创建:
- 2000年11月16日
- Python 版本:
- 2.1
- 发布历史:
简介
Modules/Setup
机制存在一些缺陷
- 人们必须记住取消
Modules/Setup
中某些部分的注释才能获得所有可能的模块。 - 将
Setup
迁移到 Python 的新版本很繁琐;添加了新模块,因此您不能只复制旧版本,而必须协调这两个版本。 - 用户必须弄清楚所需的库(例如
zlib
)安装在哪里。
提案
使用 Distutils 构建随 Python 附带的模块。
这些更改可以分解成几个部分
- Distutils 需要一些 Python 模块才能构建模块。目前我相信最少列表是
posix
、_sre
和string
。这些模块必须在可以使用 Distutils 之前构建,因此它们将简单地硬编码到
Modules/Makefile
中并自动构建。 - 将编写一个顶级 setup.py 脚本,该脚本检查系统上安装的库并编译尽可能多的模块。
Modules/Setup
将被保留,其中的设置将覆盖setup.py
的常规行为,因此您可以禁用已知存在错误的模块,或指定特定的编译或链接器标志。但是,在setup.py
正确工作的常见情况下,Setup
中的所有内容都将保持注释状态。其他Setup.*
变得不必要,因为没有任何东西会自动生成Setup
。
该补丁已在 Python 2.1 中签入,并且随后进行了修改。
实现
SourceForge 上的补丁 #102588 包含提议的补丁。目前,该补丁试图保持谨慎并尽可能少地更改文件,以便简化撤消补丁的过程。例如,没有尝试删除现有的构建机制。此类简化可以在测试版周期后期等待,届时我们确定补丁将保留在内,或者可以等待 Python 2.2。
该补丁进行以下更改
- 对 distutils/sysconfig 进行了一些必要的更改(这些更改将单独签入)
- 在顶级
Makefile.in
中,“sharedmods”目标仅运行"./python setup.py build"
,“sharedinstall”运行"./python setup.py install"
。“clobber”目标还会删除 Distutils 将其输出放置在其中的build/
子目录。 Modules/Setup.config.in
仅包含gc
和thread
模块的条目;readline
、curses
和db
模块已删除,因为现在由setup.py
负责处理它们。Modules/Setup.dist
现在仅包含 3 个模块的条目——_sre
、posix
和strop
。configure
脚本从setup.cfg.in
构建setup.cfg
。这有两个原因:使在子目录中构建工作,以及获取配置的安装前缀。- 将
setup.py
添加到源代码树的顶级目录。setup.py
是拼图中最大的一块,尽管不是最复杂的一块。setup.py
包含BuildExt
类的子类,并使用detect_modules()
方法扩展它,该方法负责确定何时可以编译模块并将它们添加到“exts”列表中。
未解决的问题
我们需要使能够禁用 3 个硬编码模块而无需手动修改 Makefile 吗?[答案:否。]
Distutils 始终将模块编译为共享库。我们如何支持将它们静态编译到生成的 Python 二进制文件中?
[答案:使用 Distutils 构建 Python 二进制文件应该是可行的,尽管还没有人实现它。这应该在将来某个时候完成,但这不是一个紧迫的优先事项,因为修改顶级 Makefile.pre.in
就足够了。]
版权
本文档已进入公有领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0229.rst