Python distutils, how to get a compiler that is going to be used?

后端 未结 6 2070
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-02 10:41

For example, I may use python setup.py build --compiler=msvc or python setup.py build --compiler=mingw32 or just python setup.py build

相关标签:
6条回答
  • 2020-12-02 11:06

    import distutils.ccompiler

    compiler_name = distutils.ccompiler.get_default_compiler()

    0 讨论(0)
  • 2020-12-02 11:09

    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 } )
    
    0 讨论(0)
  • 2020-12-02 11:26

    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...).

    0 讨论(0)
  • 2020-12-02 11:26
    #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 讨论(0)
  • 2020-12-02 11:31
    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
    

    You can use self.distribution.get_command_obj('build_ext') to get build_ext instance, and then get the compiler_type

    0 讨论(0)
  • 2020-12-02 11:32
    import sys
    sys.argv.extend(['--compiler', 'msvc'])
    
    0 讨论(0)
提交回复
热议问题