在cygwin上编译PyPy

时间:2012-04-20 19:22:37

标签: python gcc cygwin pypy

我正在尝试在cygwin上编译PyPy,当python尝试打开文件“externmod”时,编译停止,该文件刚刚用gcc编译。 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?我不想那样做。

3 个答案:

答案 0 :(得分:3)

要回答您的问题,解决问题的最简单方法是在pypy / translator / platform中修改 init .py,使其指向实际平台,而不是“无”它现在正好。在linux.py中,您会注意到有一行“so_ext ='so'',这可能解决了扩展问题。

请注意,虽然假装cygwin的小黑客是linux将在这个确切的实例中工作,但稍后会有一些道路颠簸将会让你(不幸的是,没有我记得足够的细节以避免)。

编辑:我的init.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'):

答案 1 :(得分:3)

我必须做出一些改动后才设法编译它。

  1. PyPy不提供Cygwin的配置。如上所述,我复制了Linux 配置并根据需要进行修改。特别是我删除了 -pthread标志和--export-dynamic C链接器标志应该是--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下。
  5. 您可以在http://www.tux.org/~mayer/cygwin/pypy

    找到cygwin的补丁和说明

答案 2 :(得分:1)

Windows需要" .exe"扩展以了解它的可执行文件。您需要修改构建以查找Windows并使用.exe扩展名。