当gcc在OSX中的PATH上时编译cython模块

时间:2013-09-24 00:21:19

标签: python cython distutils enthought

我正在尝试使用distutils使用Enthought Canopy的python版本编译cython模块;然而很明显gcc和clang之间存在混淆。 Distutils正在尝试使用gcc和clang选项-arch x86_64来编译模块。问题是我从macports安装了gcc,所以gcc不仅仅是clang的链接。我可以使用CC='clang' ./setup.py build_ext来编译模块,但是在分发模块方面感觉有点笨拙。我可以在setup.py中使用这种设置使其更加强大吗?我正在考虑使用clang if -arch是否在编译器标志中,但我似乎无法找到确切的distutils获取编译器标志的位置,或者如何告诉它使用特定的编译器。

1 个答案:

答案 0 :(得分:2)

  

Distutils正在尝试使用gcc和clang选项-arch x86_64编译模块。

这不是一个铿锵的选择;在clang存在之前,它已经存在于gcc中。

  

问题是我从macports安装了gcc,所以gcc不仅仅是clang的链接。

gcc 从不只是clang的链接,除非您在Mac上真的做了一些奇怪的事情。特别是,如果您安装了包含MacPorts所必需的Xcode命令行工具,那么您将/usr/bin/gcc指向gcc-4.2llvm-gcc-4.2(或gcc-4.0或以上)。不久的一天,Apple将放弃对llvm-gcc的支持,并且根本不会有gcc。**

  

我可以使用CC ='clang'./setup.py build_ext来编译模块,但是在分发模块方面感觉有点hacky

该模块显然希望使用gcc进行构建,这意味着Apple的/ usr / bin / gcc。

gcc解释说,依赖-arch x86_64作为任何特定的编译器几乎总是一个坏主意。

但是,在这种情况下,Python执行此操作是有意义的。 Python会记住用于构建它的编译器,以及相同的编译器设置等等,因此可以确保distutils将构建它实际可以使用的模块。所以,如果它是用/ usr / bin / gcc和python-config构建的,那么它将尝试用来构建模块。您可以运行gcc工具(每个Python安装都有自己的工具,因此请确保运行正确的工具)以确切了解它的需求。

你可以用苹果公司的gcc-4.2代替Apple的铿锵声。但是替换一些甚至不支持相同选项的其他随机编译器?那不行。


如果你想用MacPorts构建Python模块,你几乎肯定想用MacPorts构建Python本身,而不是使用一些预编译的二进制安装程序。最重要的是,您可能希望将端口用于任何具有它们的Python模块,而不是手动构建它们,因为其中许多模块需要使用变通方法来处理MacPorts。

另一方面,如果您打算构建非MacPorts软件-Python模块或其他方式 - 而不是将MacPorts gcc放在首位路径。几乎每个configure / setup.py / etc.曾经写过会检测到你在Mac上,期望gcc是Apple -arch,并传递../llvm-gcc-4.2/bin/llvm-gcc-4.2标志,依此类推。 (事实上​​,你会注意到即使很多端口也明确要求使用apple-gcc-4.2,llvm-gcc-4.2或clang,因为即使是MacPorts团队也无法让他们使用不同的编译器。你确定要吗?试试?)


* ...这将是一个指向i686-apple-darwin11-llvm-gcc-4.2的链接,它本身就是{{1}}周围的链接或存根包装......但这并不重要。

**或者至少在Xcode 5.0测试版中这是真的。