Python distutils, как получить компилятор, который будет использоваться? - PullRequest
27 голосов
/ 07 апреля 2009

Например, я могу использовать 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....

Ответы [ 6 ]

26 голосов
/ 04 марта 2011

Это расширенная версия ответа Luper Rouch, которая сработала для меня, чтобы получить расширение openmp для компиляции, используя mingw и msvc на windows. После создания подкласса 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 } )
7 голосов
/ 04 ноября 2009

Вы можете создать подкласс команды distutils.command.build_ext.build_ext.

После вызова метода build_ext.finalize_options() тип компилятора сохраняется в self.compiler.compiler_type в виде строки (такой же, как тип, переданный параметру build_ext 's --compiler, например,' mingw32 ',' gcc и т.д. ...).

2 голосов
/ 05 января 2010
#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() + '"'
0 голосов
/ 07 апреля 2012
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

0 голосов
/ 17 ноября 2011
import sys
sys.argv.extend(['--compiler', 'msvc'])
0 голосов
/ 07 апреля 2009

import distutils.ccompiler

имя_компилятора = distutils.ccompiler.get_default_compiler ()

...