For example, I may use python setup.py build --compiler=msvc
or python setup.py build --compiler=mingw32
or just python setup.py build
, in which case the default compiler (say, bcpp
) will be used. How can I get the compiler name inside my setup.py (e. g. msvc
, mingw32
and bcpp
, respectively)?
UPD.: I don't need the default compiler, I need the one that is actually going to be used, which is not necessarily the default one. So far I haven't found a better way than to parse sys.argv
to see if there's a --compiler...
string there.
distutils has been deprecated in NumPy 1.23. 0 . It will be removed for Python 3.12; for Python <= 3.11 it will not be removed until 2 years after the Python 3.12 release (Oct 2025).
The distutils package provides support for building and installing additional modules into a Python installation. The new modules may be either 100%-pure Python, or may be extension modules written in C, or may be collections of Python packages which include modules coded in both Python and C.
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, Extension
from distutils.command.build_ext import build_ext
copt = {'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 good
def 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 comp
print "Using compiler " + '"' + compilerName() + '"'
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With