在cygwin上编译PyPy

2024-09-24 08:31:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在cygwin上编译PyPy,当python试图打开刚刚用gcc编译的“externmod”文件时,编译就停止了。cygwin上gcc的问题是,它会自动将“.exe”附加到您正在编译的任何内容中,因此即使gcc被称为gcc -shared -Wl,--enable-auto-image-base -pthread -o /tmp/usession-release-1.8/shared_cache/externmod,输出文件最终都是externmod.exe。所以python试图打开/tmp/usession-release-1.8/shared_cache/externmod,但是找不到它——因此编译停止了。除了重新编译gcc,有人知道如何解决这个问题吗?我不想那样做。在


Tags: 文件cache内容autoreleaseenablepypyexe
3条回答

Windows需要“.exe”扩展名才能知道它是可执行的。您需要修改生成以查找Windows并使用.exe扩展名。在

在做了一些修改之后,我成功地编译了它。在

  1. PyPy没有为Cygwin提供配置。如上所述,我复制了Linux 配置并根据需要进行修改。特别是我把 -pthread标志和export dynamic C linker标志应为export all symbols。这也是指定文件扩展名(.exe,.dll)的位置。在
  2. Cygwin不实现tm结构中的tm gmtoff和tm_zone字段,它们是POSIX标准的GNU扩展。PyPy使用这些字段来确定时区。我实施了变通办法。使用这些tm字段可以渗透几个必须更改的文件。在
  3. 在Cygwin下,系统调用waitpid()期望插槽2的参数类型与PyPy使用的不同。我实现了一个重新映射参数的包装器。在
  4. 在Cygwin下curses C头文件在ncurses下。在

您可以在http://www.tux.org/~mayer/cygwin/pypy上找到cygwin和说明的修补程序

为了回答您的问题,解决问题的最简单的方法是修改pypy/translator/platform中的init.py,使其指向一个实际的平台,而不是它现在得到的“None”。在linux.py,您会注意到有一行“so\u ext=”so“”,这可能就是解决扩展问题的原因。在

请注意,尽管在这个例子中,假装cygwin是linux的小技巧可以奏效,但是稍后会有一些障碍会让您遇到(不幸的是,我没有足够的细节来避免这些障碍)。在

编辑:我的相关部分初始py现在看起来像

if sys.platform == 'cygwin':
    from pypy.translator.platform.linux import Linux, Linux64
    import platform
    if platform.architecture()[0] == '32bit':
        host_factory = Linux
    else:
        host_factory = Linux64
elif sys.platform.startswith('linux'):

相关问题 更多 >