# 4.6 在 Windows 上编译 CPython

有两种方法可以从 Windows 编译 CPython 二进制文件和库。

第一种从命令行编译，这需要用到 Visual Studio 自带的 Microsoft Visual C++ 编译器。第二种是通过 Visual Studio 打开 `PCBuild/pcbuild.sln` 直接进行构建。

### 安装依赖项

不论使用命令行还是 Visual Studio 进行编译，你都需要安装一些外部工具、库和 C 头文件。

在 `PCBuild` 文件夹中有一个 `.bat` 文件，可以为你自动执行上述安装操作。

在 `PCBuild` 中打开命令行并执行 `get_externals.bat`：

```
> get_externals.bat
Using py -3.7 (found 3.7 with py.exe)
Fetching external libraries...
Fetching bzip2-1.0.6...
Fetching sqlite-3.28.0.0...
Fetching xz-5.2.2...
Fetching zlib-1.2.11...
Fetching external binaries...
Fetching openssl-bin-1.1.1d...
Fetching tcltk-8.6.9.0...
Finished.
```

现在你可以从命令行或 Visual Studio 进行编译了。

### 从命令行编译

从命令行进行编译时，需要选择要编译的 CPU 架构。默认值为 win32，但你可能需要 64 位 (amd64) 二进制文件。

如果你进行任何调试，调试版本提供了在源代码中添加断点的能力。要构建调试版本，请添加 `-c Debug` 以指定调试配置。

默认情况下，`build.bat` 将获取外部依赖项，但由于我们已经完成了该步骤，它会打印一条跳过下载的消息：

```
> build.bat -p x64 -c Debug
```

此命令将生成 Python 二进制文件 `PCbuild/amd64/python_d.exe`。该二进制文件可以直接从命令行启动：

```
> amd64\python_d.exe

Python 3.9.0b1 (tags/v3.9.0b1:97fe9cf, May 19 2020, 10:00:00)
[MSC v.1922 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

现在已经进入了你编译的 CPython 二进制文件的 REPL 中。

要编译二进制文件发行版：

```
> build.bat -p x64 -c Release
```

上述命令将生成二进制文件 `PCbuild/amd64/python.exe`。

{% hint style="info" %}
后缀 `_d` 表明 CPython 是基于 `Debug` 配置构建的。

python.org 上发布的二进制文件在基于 Profile-Guided-Optimization (PGO) 配置编译的。有关 PGO 的更多详细信息，请参阅本章末尾的 Profile-Guided-Optimization (PGO) 部分。
{% endhint %}

#### 参数

build.bat 支持以下参数：

| 标记 | 作用             | 可选值                                               |
| -- | -------------- | ------------------------------------------------- |
| -p | 指定构建平台的 CPU 架构 | `x64`，`Win32` (默认值)，`ARM`，`ARM64`                 |
| -c | 指定构建配置         | `Release` (默认值)，`Debug`，`PGInstrument`，`PGUpdate` |
| -t | 指定构建目标         | `Build` (默认值)，`Rebuild`，`Clean`，`CleanAll`        |

#### 标记

下面是一些可用于 `build.bat` 的可选标志。如需完整列表，请运行 `build.bat -h`。

| 标记      | 作用                         |
| ------- | -------------------------- |
| -v      | 详细模式。在构建期间显示信息性消息          |
| -vv     | 非常详细的模式。在构建期间显示详细消息        |
| -q      | 安静模式。仅在构建期间显示警告和错误         |
| -e      | 下载并安装外部依赖项（默认）             |
| -E      | **不**下载和安装外部依赖项            |
| --pgo   | 编译时开启 PGO                  |
| --regen | 当更新语言时，使用该选项重新生成新语法和 token |

### 从 Visual Studio 编译

`PCBuild` 文件夹中有一个 Visual Studio 解决方案文件 `PCBuild/pcbuild.sln`，其用于构建和探索 CPython 源代码。

加载解决方案文件时，它会提示将解决方案中的项目重定向到安装的 C/C++ 编译器版本。Visual Studio 也会定位已安装的 Windows SDK 的版本。

确保将 Windows SDK 版本更改为最新安装的版本，并将平台工具集更改为最新版本。如果错过了这个窗口，你可以在 Solutions and Projects 窗口中右键单击解决方案文件，然后单击 `Retarget Solution`。

导航到 `Build/Configuration Manager`，确保 Active solution configuration 设置为 Debug 且 Active Solution Platform 设置为 `x64`（64 位 CPU 架构）或 `win32`（32 位）。

接下来，通过按 `CTRL + SHIFT + B` 或选择 `Build/Build Solution` 来构建 CPython。若收到有关缺少 Windows SDK 的任何错误，请确保在 Retarget Solution 窗口中设置了正确的定位设置。在开始菜单中应该能看到 Windows Kits 文件夹，文件夹内有 Windows Software Development Kit（Windows 软件开发工具包）。

第一次构建可能需要 10 分钟或更长时间。构建完成后，可能会看到一些可以忽略的警告。

若需启动调试版本的 CPython，请按 `F5`，CPython 将以调试模式启动且直接进入 REPL：

图片不翻译。

你可以通过在顶部菜单栏上将构建配置从 Debug 更改为 Release 并重新运行 `Build/Build Solution`，来运行发布版本的构建。现在在目录 `PCbuild/amd64` 中同时拥有了 Python 二进制文件的调试和发布版本。

通过在顶部菜单中选择 `Tools/Python/Python Environments`，可以将 Visual Studio 设置为使用发布或调试版本打开 REPL。在 Python Environments 面板中，单击 `Add Environment`，然后可以选择调试或发布二进制文件作为目标。调试二进制文件以 `_d.exe` 结尾，例如 `python_d.exe` 或 `pythonw_d.exe`。

你或许更希望使用调试二进制文件，因为它在 Visual Studio 中提供调试支持，这在你通读本书时会很有用。

在 Add Environment 窗口中，分别将解释器路径和窗口解释器设置为 `PCbuild/amd64` 中的 `python_d.exe` 文件和 `pythonw\_d.exe` 文件：

图片不翻译。

在 Python Environments 窗口中单击 `Open Interactive Window` 来启动 REPL 会话，你将看到 Python 编译版本的 REPL：

图片不翻译。

本书中将有带有示例命令的 REPL 会话。如果你想在代码中设置任何断点，我鼓励使用调试二进制文件来运行这些 REPL 会话。

为了更轻松地浏览代码，在 Solution 视图中，单击 Home 图标旁边的切换按钮以切换到 Folder 视图：

图片不翻译。
