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”列表的工作。
未解决的问题
我们是否需要能够在不手动修改 Makefile 的情况下禁用 3 个硬编码模块?[回答:不需要。]
Distutils 总是将模块编译为共享库。我们如何支持将它们静态编译到生成的 Python 二进制文件中?
[回答:使用 Distutils 构建 Python 二进制文件应该是可行的,尽管还没有人实现它。这应该有一天完成,但并不是当务之急,因为修改顶级 Makefile.pre.in 已经足够了。]
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0229.rst