在 Windows 上进行翻译

RPython 从 Windows 2000 开始支持 Windows 平台。以下文本提供了一些关于如何使用 PyPy 作为示例来翻译用 RPython 编写的解释器的提示。

要构建 pypy-c,您需要一个可用的 python 环境和一个 C 编译器。可以使用 CPython 2.6 或 2.7 进行翻译,但这并不是首选方法,因为它需要更长的时间来运行——根据您的架构,运行时间会增加两到三倍。因此,请前往 我们的下载页面 并获取最新的稳定版本。

Microsoft Visual Studio 是首选编译器,但也有报道称 gcc 的 mingw32 移植版本成功。

使用哪个编译器以及如何找到它?

在 Windows 上为 Python 构建某些东西时,第一个障碍是如何发现编译器、头文件和库的路径。可以安装多个版本的 MSVC 编译器工具,从独立的构建工具到完整的 Visual Studio IDE 安装。这些用例中的每一个都将编译器放在不同的位置,并且布局会随着时间的推移而发生变化。

The distutils 包位于 stdlib 中,是放置此发现代码的自然位置,但它被 python 版本冻结了。可通过 pip 安装的 setuptools 可以更快地适应新工具。因此,在构建 PyPy 之后,首先会发生的事情是它将安装 pip 并下载 setuptools,然后它将构建 stdlib 中使用的 cffi 模块。PyPy 存在一个“先有鸡还是先有蛋”的问题:为了编译某些东西,我们需要 setuptools,但为了获得 setuptools,我们需要 pip,而 pip 需要 _ssl,而 _ssl 必须进行编译。因此,PyPy 在 rpython/tools/setuptools_msvc.py 中提供了一个 msvc.py 的副本。

PyPy 倾向于使用它能找到的最新 MSVC 编译器进行编译,这与 CPython 希望使用用于编译正在使用的 exe 的编译器进行编译的做法不同。

使用 Visual Studio 翻译 PyPy

我们定期测试使用 Visual Studio 2019、MSVC160 翻译 PyPy。其他配置也可能有效。您必须使用至少 Visual Studio 2012。

翻译脚本将为编译器设置适当的环境变量,因此您无需在翻译之前运行 vcvars。它们将选择它们能找到的最新 Visual Studio 编译器。此外,目标架构(32 位、64 位)会自动选择。32 位构建只能使用 32 位 Python 构建,反之亦然。默认情况下,解释器使用多线程 DLL (/MD) 运行时环境构建。

如果您希望覆盖此检测方法以使用不同的编译器(mingw 或不同版本的 MSVC)

  • 根据需要设置 PATH 和其他环境变量
  • CC 环境变量设置为要使用的编译器 exe,对于不同版本的 MSVC,SET CC=cl.exe

注意:RPython 翻译器需要一个特殊的 64 位 Python,见下文

Python 和 C 编译器是构建 pypy 所需的全部,但它会缺少一些依赖于第三方库的模块。请参阅以下内容,了解如何获取和构建它们。

请参阅 非 Windows 指令 以获取更多信息,尤其要注意翻译过程非常占用内存。标准翻译大约需要 4GB 内存,因此需要进行特殊准备,或者您可以使用以下方法来减少内存使用量,但代价是翻译速度会变慢。

set PYPY_GC_MAX_DELTA=200MB
pypy --jit loop_longevity=300 ../../rpython/bin/rpython -Ojit targetpypystandalone
set PYPY_GC_MAX_DELTA=
# This is done as part of translation
PYTHONPATH=../.. ./pypy-c ../../lib_pypy/pypy_tools/build_cffi_imports.py

为大型构建准备 Windows

通常,32 位程序在 Windows 上的内存限制为 2GB。在 Windows 64 位上,可以将此限制提高到接近 4GB。

您需要执行

<path-to-visual>\vc\vcvars.bat
editbin /largeaddressaware translator.exe

其中 translator.exe 是您将用于翻译的 pypy.exe 或 cpython.exe。这在 PyPy 翻译过程中默认完成,因此应该可以正常工作。

安装外部包

我们在 pypy 内部使用了一个 Mercurial 仓库 来保存 Windows 构建依赖项的二进制编译版本。作为 rpython 设置阶段的一部分,将设置环境变量以使用这些依赖项。该仓库包含一个关于如何复制的 README 文件,以及每个受支持平台的分支。您可以运行 get_externals.py 实用程序来检出适合您平台和 PyPy 版本的分支。如果您错过了此步骤,您将遇到类似 cannot open include file: 'ffi.h' 的错误。

使用 mingw 编译器

您可以使用 mingw 编译器编译 RPython 程序,使用 –cc=mingw32 选项;gcc.exe 必须位于 PATH 中。如果 -cc 标志不以“ming”开头,它应该是有效的 gcc 派生编译器的名称,例如 x86_64-w64-mingw32-gcc 用于创建 64 位目标的 64 位编译器。

如果您安装的本地包不在 mingw 目录层次结构中,您可能需要将 CPATH、LIBRARY_PATH 和 PATH 环境变量分别设置为头文件、lib 或 dll 以及 dll 的路径。

用于 mingw 编译器的 libffi

要启用 _rawffi(和 ctypes)模块,您需要编译 libffi 的 mingw 版本。以下是一种方法,它应该允许您尝试为 win64 或 win32 构建

  1. 下载并解压缩一个 mingw32 构建mingw64 构建,例如将其解压缩到 c:mingw

  2. 如果您不使用 cygwin,您将需要 msys 来提供 make、autoconf 工具和其他工具。

    1. 下载并解压缩一个 用于 mingw 的 msys,例如将其解压缩到 c:msys
    2. 编辑 c:msysetcfstab 文件以挂载 c:mingw
  3. 下载并解压缩 libffi 源文件,并将它们解压缩到基目录中。

  4. 运行 c:msysmsys.bat 或 cygwin shell,这应该让您感觉更好,因为它是一个带有 shell 工具的 shell 提示符。

  5. 在 shell 内部,cd 到 libffi 目录并执行

    sh ./configure
    make
    cp .libs/libffi-5.dll <somewhere on the PATH>
    

如果您找不到 dll,并且 libtool 发出了关于“不允许使用未定义符号”的警告,您需要编辑顶层目录中的 libffi Makefile。将标志 -no-undefined 添加到 libffi_la_LDFLAGS 的定义中。

如果您想尝试使用 win64,您必须使用以下标志运行 configure

sh ./configure --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32

或类似的标志,具体取决于您的 mingw64 下载。

使用 mingw 编译器在 PyPy 上进行黑客攻击

由于在 PyPy 上进行黑客攻击意味着运行测试,您需要一种方法来在进行黑客攻击时指定 mingw 编译器(与翻译相反)。截至 2012 年 3 月,–cc 对于 pytest.py 来说不是一个有效的选项。但是,如果您将环境变量 CC 设置为编译器 exe,测试将使用它。

完整的 64 位移植还缺什么

这是旧链接到此主题的占位符。我们已经解决了 64 位移植问题,并且有 64 位 Windows 的夜间构建版本。