2012-04-20 66 views
2

我想要编译PyPy在Cygwin上,当蟒蛇试图打开文件“externmod”,它只是用gcc编译,编译将会停止编译PyPy。在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?我不想这样做。在Cygwin上

回答

3

要回答你的问题,解决你的问题最简单的方法是在pypy/translator/platform中修改init .py,使它指向一个实际的平台,而不是它现在正在使用的'None' 。在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'): 
+0

为Cygwin和指令的补丁你是对的,也有其他roadbumps。但是你之前已经完成了整个过程,并且已经完成了它的工作? – 2012-04-23 18:22:29

+2

大约一年前我就收集了它,是的(你已经启发我再次尝试:D)。如果您使用上面提到的特定修复程序,则会遇到有关rctime模块未进行翻译的问题。接受[来自这里的]建议(https://bugs.pypy.org/issue902),我禁用了rctime和_multiprocessing模块;不幸的是,这会破坏使用线程的任何代码。我正在考虑启用一些可以弥补这一点的Windows功能,但是我还没有走得很远。 – Casey 2012-04-23 19:49:24

1

Windows需要“.exe”扩展名才能知道它是可执行文件。您需要修改构建以查找Windows并使用.exe扩展名。

3

我设法编译它,不得不作出了不少改变之后。

  1. PyPy没有为Cygwin提供配置。如上所示,我复制了Linux 配置并根据需要对其进行了修改。特别是我删除了 -pthread标志,并且--export-dynamic C链接器标志应该是--export-all-symbols。这也是指定文件扩展名(.exe,.dll)的位置。
  2. Cygwin的不实现在tm结构的tm_gmtoff和tm_zone领域,这是一个GNU扩展POSIX标准。 PyPy使用这些字段来确定时区。我实施了解决方法。使用这些tm字段可以使几个文件都处于更新状态。
  3. 在Cygwin下,系统调用waitpid()需要PyPy使用的插槽2的不同参数类型。我实现了一个重新映射参数的包装器。
  4. 在Cygwin下,curses C头文件在ncurses下。

你可以找到http://www.tux.org/~mayer/cygwin/pypy