2009-04-07 37 views
26

Ví dụ: tôi có thể sử dụng python setup.py build --compiler=msvc hoặc python setup.py build --compiler=mingw32 hoặc chỉ python setup.py build, trong trường hợp đó trình biên dịch mặc định (ví dụ: bcpp) sẽ được sử dụng. Làm thế nào tôi có thể lấy tên trình biên dịch bên trong setup.py của mình (e. G. msvc, mingw32bcpp, tương ứng)?Trán Python, làm thế nào để có được một trình biên dịch sẽ được sử dụng?

UPD .: Tôi không cần trình biên dịch mặc định, tôi cần một trình biên dịch thực sự sẽ không được sử dụng mặc định. Cho đến nay tôi đã không tìm thấy một cách tốt hơn để phân tích cú pháp sys.argv để xem liệu có một chuỗi --compiler... ở đó không.

+0

Tôi có cùng một vấn đề. Tôi muốn bao gồm thêm một tiêu đề 'stdint.h' cho msvc, nhưng không bao gồm các trình biên dịch khác. –

Trả lời

0

nhập khẩu distutils.ccompiler

compiler_name = distutils.ccompiler.get_default_compiler()

+3

Điều này không nhất thiết phải là trình biên dịch mà các méo sẽ sử dụng! – Jon

7

Bạn có thể phân lớp các lệnh distutils.command.build_ext.build_ext.

Khi phương pháp build_ext.finalize_options() đã được gọi là, loại trình biên dịch được lưu trữ trong self.compiler.compiler_type như là một chuỗi (giống như một truyền cho build_ext '--compiler tùy chọn s, ví dụ như 'mingw32', 'gcc', vv ...) .

+0

Đối tượng trình biên dịch là 'self.compiler', loại này nằm trong' self.compiler.compiler_type' –

+0

Đã chỉnh sửa, cảm ơn! –

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

Đây là một phiên bản mở rộng của câu trả lời Luper Rouch rằng làm việc cho tôi để có được một phần mở rộng OpenMP để biên dịch sử dụng cả hai mingw và msvc trên cửa sổ. Sau khi phân lớp build_ext, bạn cần chuyển nó tới setup.py trong cmdclass arg. Bằng cách phân lớp build_extensions thay vì finalize_options bạn sẽ có đối tượng trình biên dịch thực sự để xem xét, vì vậy bạn có thể nhận được thông tin phiên bản chi tiết hơn. Sau cùng, bạn có thể thiết lập cờ biên dịch trên một cơ sở cho mỗi trình biên dịch cho mỗi phần mở rộng:

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

cần lưu ý rằng đối với gcc/clang dưới linux/posix, tên khóa cho lopt phải là 'unix' – marscher

+0

Cảm ơn. Thông tin thực sự phải dễ tiếp cận hơn. Chúng ta nên báo cáo một lỗi cho các méo –

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 

Bạn có thể sử dụng self.distribution.get_command_obj ('build_ext') để có được build_ext dụ, và sau đó lấy compiler_type

Các vấn đề liên quan