如何在定义cython扩展之前识别编译器?

时间:2015-06-22 17:07:53

标签: cython setuptools

我正在构建一个独立于平台的cython项目,我希望根据所使用的编译器传递编译器args。我可以根据平台猜测编译器,或者假设它与Python使用的编译器相同,但不能保证匹配。通常我会将{{1}} arg注入setuptool的setup方法并包装install或build_ext命令来检查内部状态。但是在这种情况下,我必须在到达包装器之前对扩展模块进行cython化。

在对扩展模块进行cython化之前,有没有办法确定setup.py中的编译器?

2 个答案:

答案 0 :(得分:0)

第一个答案的简单变化:

from setuptools import setup, Extension
from distutils.command.build_ext import build_ext

myextension = Extension(
    name = 'packagename',
    sources = [
        'source/debugger.cpp',
    ],
    include_dirs = [ 'source' ],
)

class build_ext_compiler_check(build_ext):
    def build_extensions(self):
        compiler = self.compiler.compiler_type

        # print('\n\ncompiler', compiler)
        if not 'msvc' in compiler:

            for extension in self.extensions:

                if extension == myextension:
                    extension.extra_compile_args.append( '-O0' )
                    extension.extra_compile_args.append( '-std=c++11' )

        super().build_extensions()

setup(
        name = 'packagename',
        version = __version__,
        ext_modules= [ myextension ],
    )

答案 1 :(得分:0)

(抱歉,由于缺少信用,无法发表评论)

不幸的是,答案 https://stackoverflow.com/a/32192172/7379507 有点误导,因为 build_ext 实例的 self.compiler.compiler_type 是“unix”,而不是“gcc”(“distutils compiler_class”)。

即从这个 defaultdict 字典中查找

BUILD_ARGS = defaultdict(lambda: ['-O3', '-g0'])
for compiler, args in [
    ('msvc', ['/EHsc', '/DHUNSPELL_STATIC']),
    ('gcc', ['-O3', '-g0'])]:
BUILD_ARGS[compiler] = args

通常不会到达“gcc”条目,而是总是回退到 defaultdict 的默认值(lambda 函数)。

也就是说,只要默认选项与 'gcc' 选项保持相同,在大多数情况下您可能不会注意到这一点。例如。 clang 似乎理解与 gcc 相同的选项。

您似乎可以通过 self.compiler.compiler[0] 获得实际调用的编译器名称,但我还没有检查这是否可靠或可移植。