2013-09-24 36 views
0

我想用distutils編譯一個使用Enthought Canopy的python版本的cython模塊;然而很明顯gcc和clang之間有混淆。 Distutils試圖使用gcc和叮噹選項-arch x86_64來編譯模塊。問題是我從macports安裝了gcc,所以gcc不只是一個叮噹的鏈接。我可以使用CC='clang' ./setup.py build_ext來編譯模塊,但在分配模塊方面感覺有點不方便。有沒有什麼我可以放在setup.py中,使它更穩健的這種設置?如果-arch在編譯器標誌中,我正在思考使用clang的一些方法,但我似乎無法找到distutils獲取編譯器標誌的地方,或者如何告訴它使用特定的編譯器。當gcc在OSX的PATH上編譯cython模塊

回答

2

Distutils正在嘗試使用gcc和clang選項-arch x86_64來編譯模塊。

這不是一個鏗鏘的選擇;在clang存在之前,它已經在gcc多年了。

問題是我已經從macports安裝gcc,所以gcc不只是一個叮噹的鏈接。

gcc從未只是一個鏈接到clang,除非你真的做了你的Mac上一些奇怪的。特別是,如果您已安裝必需的Xcode命令行工具以包含MacPorts,則您將擁有/usr/bin/gcc,這是指向gcc-4.2llvm-gcc-4.2(或gcc-4.0或更早版本)的鏈接。不久後的一天,蘋果將下降支持llvm-gcc,又會有什麼叫gcc可言。**

我可以得到模塊使用CC =「鐺」 ./setup.py build_ext編譯,但這種感覺有點哈克在分發模塊

模塊顯然希望建立與gcc,它指的蘋果在/ usr/bin中/海灣合作委員會的條款。

依賴於gcc是任何特定的編譯器幾乎總是一個壞主意,如MacPorts documentation解釋。

但是,在這種情況下,Python這樣做是有道理的。 Python會記住編譯器用於構建它,以及相同的編譯器設置等等,所以可以確定distutils將構建它實際可以使用的模塊。所以,如果它是用/ usr/bin/gcc構建的,那麼它將嘗試用來構建模塊。您可以運行工具(您的每個Python安裝都將擁有自己的工具,因此請確保您運行的是正確的工具)以準確查看它的需求。

用蘋果的叮噹代替蘋果公司的gcc-4.2,你幾乎總能逃脫。但是用一些其他的甚至不支持相同選項的隨機編譯器代替?這是行不通的。


如果你想建立的MacPorts Python模塊,你幾乎可以肯定要構建Python本身的MacPorts,無法使用一些預編譯的二進制安裝包。最重要的是,您可能希望將端口用於任何具有它們的Python模塊,而不是手動構建它們,因爲它們中的很多都需要解決方法才能使用MacPorts。

在另一方面,如果你計劃建立非MacPorts的軟件Python模塊或以其他方式 - 你真的更好把MacPorts的gcc作爲對PATH頂事。幾乎每個配置/ setup.py /等。永遠寫的會檢測到你在Mac上,期望gcc成爲Apple gcc,並通過-arch標誌等等。 (事實上​​,你會注意到甚至很多端口都明確要求使用apple-gcc-4.2,llvm-gcc-4.2或clang,因爲即使MacPorts團隊也無法讓他們使用不同的編譯器。你確定你想要嗎?試試嗎?)


* ......這將是,比方說,../llvm-gcc-4.2/bin/llvm-gcc-4.2一個鏈接,這將自身周圍i686-apple-darwin11-llvm-gcc-4.2的鏈接或存根包裝...但是這並不重要。

**或者至少在Xcode 5.0測試版中是這樣。