菜单

配置过程

相关源文件

本页面介绍在构建 CPython 之前用于配置它的过程和工具。配置过程准备构建环境,检测系统功能,并生成编译 Python 所需的文件。它在类 Unix 系统和 Windows 之间存在显著差异。

有关配置后实际构建过程的信息,请参阅 构建系统

概述

CPython 中的配置过程服务于几个关键目的:

  1. 检测平台和编译器功能
  2. 设置适当的构建标志和选项
  3. 确定要包含哪些模块以及如何构建它们
  4. 生成特定于平台的配置文件
  5. 创建构建系统文件(Makefile 或项目文件)

CPython 根据目标平台使用不同的配置方法

来源: configure.ac1-28 PCbuild/pythoncore.vcxproj1-31 Makefile.pre.in1-20

Unix 配置系统

在类 Unix 系统(Linux、macOS 等)上,CPython 使用 GNU Autoconf 系统来生成一个配置脚本。

配置文件和工具

Unix 配置过程中涉及的关键文件是:

  1. configure.ac: Autoconf 的输入文件,包含配置测试和宏定义
  2. configure: 生成的 shell 脚本,执行实际的配置
  3. Makefile.pre.in: 最终 Makefile 的模板
  4. pyconfig.h.in: pyconfig.h 的模板,其中包含特定于平台的 C 预处理器定义

来源: configure.ac1-50 Makefile.pre.in1-15 pyconfig.h.in1-20

运行配置脚本

configure 脚本从命令行运行,并接受大量选项来自定义构建。

./configure [options]

运行后,它会生成多个文件,其中最重要的是:

  • Makefile: 从 Makefile.pre.in 生成
  • pyconfig.h: 包含用于特定平台功能的 C 预处理器定义

来源: configure1-114 Doc/using/configure.rst100-107

配置选项

configure 脚本支持许多自定义构建的选项。一些重要的类别包括:

类别示例选项目的
通用--enable-shared, --with-pydebug控制整体构建特性
模块选项--enable-loadable-sqlite-extensions启用/禁用特定模块
安装--prefix=/usr/local控制 Python 的安装位置
性能--enable-optimizations, --with-lto启用性能优化
扩展--with-openssl配置外部库依赖项

可以通过运行以下命令获取配置选项的完整列表:

./configure --help

来源: Doc/using/configure.rst99-524 configure.ac1084-1175

示例配置流程

来源: configure593-642 configure.ac312-384

Windows 配置系统

在 Windows 上,CPython 使用 Visual Studio 项目文件,而不是 autoconf 系统。

Visual Studio 项目结构

Windows 构建依赖于位于 PCbuild 目录中的 Visual Studio 项目文件 (.vcxproj)。

  1. PCbuild/pythoncore.vcxproj: 构建 Python 核心的主项目文件
  2. PCbuild/python.props: 公共属性定义
  3. PCbuild/pyproject.props: Python 特定的属性定义

来源: PCbuild/pythoncore.vcxproj1-97 PCbuild/_freeze_module.vcxproj1-102

Windows 构建配置

Visual Studio 项目支持多种配置和平台。

配置目的
调试带调试符号构建,不带优化
发布用于生产的优化构建
PGInstrument/PGUpdate概要文件引导的优化构建
平台目的
Win3232 位 x86 构建
x6464 位 x86-64 构建
ARM32 位 ARM 构建
ARM6464 位 ARM 构建

来源: PCbuild/pythoncore.vcxproj4-67 PCbuild/_freeze_module.vcxproj4-67

模块配置

CPython 配置的一个关键方面是确定要构建哪些模块以及如何构建它们。

Setup 文件

模块通过 Setup 文件进行配置。

  1. Modules/Setup: 主模块配置文件
  2. Modules/Setup.bootstrap.in: 引导所需模块
  3. Modules/Setup.local: (可选) 本地用户自定义项

来源: Modules/Setup1-41 Modules/Setup.bootstrap.in1-40

模块构建类型

Setup 文件定义了三种类型的模块构建:

类型标记描述
静态*static*直接编译到 Python 二进制文件中
共享*shared*构建为独立的共享库(.so/.pyd)
已禁用*disabled*根本不构建

来源: Modules/Setup13-21 Modules/Setup.bootstrap.in5-6

模块 Setup 文件格式

Setup 文件中的每一行都有以下结构:

<module> ... [<sourcefile> ...] [<cpparg> ...] [<library> ...]

其中

  • <module> 是模块名称
  • <sourcefile> 是一个以 .c 结尾的源文件
  • <cpparg> 是一个以 -I、-D、-U 或 -C 开头的预处理器标志
  • <library> 是一个以 .a 结尾或以 -l 或 -L 开头的库

来源: Modules/Setup23-35

平台检测和适配

配置过程会检测目标平台并据此调整构建。

configure.ac 中的平台检测

来源: configure.ac312-384 configure366-384

交叉编译支持

CPython 支持交叉编译,即在一种系统上进行构建,但目标是另一种系统。为此提供了特殊选项。

./configure --build=<build-system> --host=<target-system> --with-build-python=<path>

来源: configure.ac137-176 Doc/using/configure.rst137-176

生成的配置文件

配置过程会生成几个重要的文件

pyconfig.h

pyconfig.h 文件包含 C 预处理器定义,用于平台特定的功能。它被 Python.h 包含,以定义适当的平台设置。

主要部分包括

  • 功能可用性标志 (HAVE_*)
  • 特定于平台的定义
  • 内存模型信息
  • 特定于编译器的设置

来源: pyconfig.h.in1-100 configure.ac228-241

Makefile

生成的 Makefile 包含

  • 编译器和标志的变量定义
  • Python 和模块的构建目标
  • 安装目标
  • 要构建的模块列表
  • 组件之间的依赖关系

来源: Makefile.pre.in30-150 configure.ac98-111

结论

CPython 的配置过程复杂且高度适应不同的平台和用户需求。它创建了一个特定于环境的构建系统,该系统处理每个平台的独特特征,同时在它们之间保持一致的 Python 体验。

来源: configure.ac Makefile.pre.in PCbuild/pythoncore.vcxproj Modules/Setup Doc/using/configure.rst