我正在构建一个独立于平台的cython项目,我希望根据所使用的编译器传递编译器args。我可以根据平台猜测编译器,或者假设它与Python使用的编译器相同,但不能保证匹配。通常我会将{{1}} arg注入setuptool的setup方法并包装install或build_ext命令来检查内部状态。但是在这种情况下,我必须在到达包装器之前对扩展模块进行cython化。
在对扩展模块进行cython化之前,有没有办法确定setup.py中的编译器?
答案 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]
获得实际调用的编译器名称,但我还没有检查这是否可靠或可移植。