2009-04-07 19 views
26

Por ejemplo, puedo usar python setup.py build --compiler=msvc o python setup.py build --compiler=mingw32 o simplemente python setup.py build, en cuyo caso se utilizará el compilador predeterminado (por ejemplo, bcpp). ¿Cómo puedo obtener el nombre del compilador dentro de mi setup.py (por ejemplo, msvc, mingw32 y bcpp, respectivamente)?Python distutils, ¿cómo obtener un compilador que se va a usar?

UPD .: No necesito el compilador predeterminado, necesito el que es realmente va a ser utilizado, que no es necesariamente el predeterminado. Hasta ahora no he encontrado una manera mejor que analizar sys.argv para ver si hay una cadena --compiler... allí.

+0

Tengo el mismo problema. Quiero incluir un encabezado 'stdint.h' adicional para msvc, pero no para otros compiladores. –

Respuesta

0

distutils.ccompiler importación

compiler_name = distutils.ccompiler.get_default_compiler()

+3

¡Este no es necesariamente el compilador que distutils va a usar! – Jon

7

Usted puede subclase el comando distutils.command.build_ext.build_ext.

Una vez build_ext.finalize_options() método ha sido llamado, el tipo compilador se almacena en self.compiler.compiler_type como una cadena (el mismo que el que se pasa al build_ext 's opción --compiler, por ejemplo, 'mingw32', 'gcc', etc ...) .

+0

El objeto del compilador es 'self.compiler', el tipo está en' self.compiler.compiler_type' –

+0

Editado, ¡gracias! –

1
 
#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() + '"' 
23

Esta es una versión ampliada de la respuesta de Luper Rouch que trabajó para mí para conseguir una extensión OpenMP para compilar utilizando tanto MinGW y msvc en las ventanas. Después de subclasificar build_ext, debe pasarlo a setup.py en cmdclass arg. Al crear subclases de build_extensions en lugar de finalize_options, tendrá que examinar el objeto del compilador para que pueda obtener información más detallada sobre la versión. Eventualmente podría establecer parámetros del compilador sobre una base per-per-compilador de extensión:

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 }) 
+0

se debe tener en cuenta que para gcc/clang en linux/posix, el nombre de tecla para lopt tiene que ser 'unix' – marscher

+0

Gracias. La información realmente debería ser más accesible que eso. Deberíamos informar un error a distutils –

0
import sys 
sys.argv.extend(['--compiler', 'msvc']) 
0
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 

Usted puede utilizar self.distribution.get_command_obj ('build_ext') para obtener build_ext ejemplo, y luego obtenga el compiler_type

Cuestiones relacionadas