2012-04-20 79 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