Python distutils, как получить компилятор, который будет использоваться?
Например, я могу использовать python setup.py build --compiler=msvc
или python setup.py build --compiler=mingw32
или просто python setup.py build
, и в этом случае будет использоваться компилятор по умолчанию (скажем, bcpp
). Как я могу получить имя компилятора внутри моей setup.py(например, msvc
, mingw32
и bcpp
, соответственно)?
UPD: Мне не нужен компилятор по умолчанию, мне нужен тот, который будет на самом деле, который не обязательно является стандартным. До сих пор я не нашел лучшего способа, чем проанализировать sys.argv
, чтобы увидеть, есть ли там строка --compiler...
.
Ответы
Ответ 1
Это расширенная версия ответа Luper Rouch, которая работала для меня, чтобы получить расширение openmp для компиляции с использованием как mingw, так и msvc в окнах. После подкласса build_ext вам нужно передать его в setup.py в аргументе cmdclass. При подклассификации build_extensions вместо finalize_options у вас будет реальный объект компилятора, чтобы вы могли посмотреть более подробную информацию о версии. Вы могли бы в конечном итоге установить флаги компилятора для каждого компилятора на основе расширения:
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 } )
Ответ 2
Вы можете подклассифицировать команду distutils.command.build_ext.build_ext
.
Как только был вызван метод build_ext.finalize_options()
, тип компилятора хранится в self.compiler.compiler_type
в виде строки (такой же, как и для параметра build_ext
--compiler
, например "mingw32", "gcc", и т.д...).
Ответ 3
#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() + '"'
Ответ 4
import distutils.ccompiler
compiler_name = distutils.ccompiler.get_default_compiler()
Ответ 5
import sys
sys.argv.extend(['--compiler', 'msvc'])
Ответ 6
class BuildWithDLLs(build):
# On Windows, we install the git2.dll too.
def _get_dlls(self):
# return a list of of (FQ-in-name, relative-out-name) tuples.
ret = []
bld_ext = self.distribution.get_command_obj('build_ext')
compiler_type = bld_ext.compiler.compiler_type
Вы можете использовать self.distribution.get_command_obj ('build_ext'), чтобы получить экземпляр build_ext,
а затем получить compiler_type