2009-04-07 8 views
26

Zum Beispiel kann ich python setup.py build --compiler=msvc oder oder nur python setup.py build verwenden, in diesem Fall wird der Standard-Compiler (zB bcpp) verwendet werden. Wie kann ich den Namen des Compilers in meiner setup.py (z. B. msvc, mingw32 bzw. bcpp) abrufen?Python distutils, wie bekommt man einen Compiler, der benutzt wird?

UPD .: Ich brauche nicht den Standard-Compiler, ich brauche den, der tatsächlich wird verwendet werden, die nicht unbedingt die Standard-Compiler ist. Bis jetzt habe ich keinen besseren Weg gefunden, als sys.argv zu analysieren, um zu sehen, ob dort eine --compiler... Schnur dort ist.

+0

Ich habe das gleiche Problem. Ich möchte einen zusätzlichen 'stdint.h' Header für msvc, aber nicht andere Compiler hinzufügen. –

Antwort

0

Import distutils.ccompiler

compiler_name = distutils.ccompiler.get_default_compiler()

+3

Dies ist nicht unbedingt der Compiler, den Distutils verwenden wird! – Jon

7

Sie die distutils.command.build_ext.build_ext Befehl Unterklasse kann.

Sobald build_ext.finalize_options() Methode aufgerufen wurde, wird der Compiler-Typ in self.compiler.compiler_type als String gespeichert wird (das gleiche wie die an die build_ext passed ‚s --compiler Option, zB 'mingw32', 'gcc', etc ...) .

+0

Das Compiler-Objekt ist 'self.compiler', der Typ ist in' self.compiler.compiler_type' –

+0

Bearbeitet, danke! –

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

Dies ist eine erweiterte Version der Antwort Luper Rouch, die für mich gearbeitet, um eine openmp Erweiterung zu bekommen beide mingw und msvc auf Windows kompilieren verwenden. Nachdem Sie build_ext abgeleitet haben, müssen Sie es in setup.py in cmdclass arg übergeben. Wenn Sie build_extensions statt finalize_options ableiten, müssen Sie sich das eigentliche Compiler-Objekt ansehen, um detailliertere Versionsinformationen zu erhalten. Sie könnten schließlich Compiler-Flags auf einer Pro-Compiler gesetzt, pro-Erweiterung 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 }) 
+0

sollte beachtet werden, dass für gcc/clang unter linux/posix der Schlüsselname für lopt 'unix' sein muss – marscher

+0

Danke. Die Informationen sollten wirklich zugänglicher sein. Wir sollten einen Fehler zu Distutils melden –

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 

Sie self.distribution.get_command_obj verwenden können ('build_ext') build_ext Instanz zu erhalten, und dann bekomme ich den Compiler-Typ