Python distutils, how to get a compiler that is going to be used? Python distutils, how to get a compiler that is going to be used? python python

Python distutils, how to get a compiler that is going to be used?


This is an expanded version of Luper Rouch's answer that worked for me to get an openmp extension to compile using both mingw and msvc on windows. After subclassing build_ext you need to pass it to setup.py in the cmdclass arg. By subclassing build_extensions instead of finalize_options you'll have the actual compiler object to look into, so you can then get more detailed version information. You could eventually set compiler flags on a per-compiler, per-extension basis:

from distutils.core import setup, Extensionfrom distutils.command.build_ext import build_extcopt =  {'msvc': ['/openmp', '/Ox', '/fp:fast','/favor:INTEL64','/Og']  ,     'mingw32' : ['-fopenmp','-O3','-ffast-math','-march=native']       }lopt =  {'mingw32' : ['-fopenmp'] }class build_ext_subclass( build_ext ):    def build_extensions(self):        c = self.compiler.compiler_type        if copt.has_key(c):           for e in self.extensions:               e.extra_compile_args = copt[ c ]        if lopt.has_key(c):            for e in self.extensions:                e.extra_link_args = lopt[ c ]        build_ext.build_extensions(self)mod = Extension('_wripaca',            sources=['../wripaca_wrap.c',                      '../../src/wripaca.c'],            include_dirs=['../../include']            )setup (name = 'wripaca',   ext_modules = [mod],   py_modules = ["wripaca"],   cmdclass = {'build_ext': build_ext_subclass } )


You can subclass the distutils.command.build_ext.build_ext command.

Once build_ext.finalize_options() method has been called, the compiler type is stored in self.compiler.compiler_type as a string (the same as the one passed to the build_ext's --compiler option, e.g. 'mingw32', 'gcc', etc...).


#This should work pretty gooddef compilerName():  import re  import distutils.ccompiler  comp = distutils.ccompiler.get_default_compiler()  getnext = False  for a in sys.argv[2:]:    if getnext:      comp = a      getnext = False      continue    #separated by space    if a == '--compiler'  or  re.search('^-[a-z]*c$', a):      getnext = True      continue    #without space    m = re.search('^--compiler=(.+)', a)    if m == None:      m = re.search('^-[a-z]*c(.+)', a)    if m:      comp = m.group(1)  return compprint "Using compiler " + '"' + compilerName() + '"'