我正在尝试使用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获取编译器标志的位置,或者如何告诉它使用特定的编译器。
答案 0 :(得分:2)
Distutils正在尝试使用gcc和clang选项-arch x86_64编译模块。
这不是一个铿锵的选择;在clang存在之前,它已经存在于gcc中。
问题是我从macports安装了gcc,所以gcc不仅仅是clang的链接。
gcc
从不只是clang
的链接,除非您在Mac上真的做了一些奇怪的事情。特别是,如果您安装了包含MacPorts所必需的Xcode命令行工具,那么您将/usr/bin/gcc
指向gcc-4.2
或llvm-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测试版中这是真的。