2015-02-21 21 views
5

Ben OSX üzerinde clang kullanılarak derlenmiş aşağıdaki derleme bayrakları gerektiren bir Python C++ uzantısına sahip:Kurulum programında bir Python C uzantısı için hangi derleyicinin çağrılacağını nasıl anlarsınız?

CPPFLAGS='-std=c++11 -stdlib=libc++ -mmacosx-version-min=10.8' 
LDFLAGS='-lc++' 

Tespit OSX benim setup.py dosyası yeterince kolaydır. Ben bunu yapabilirsiniz:

if sys.prefix == 'darwin': 
    compile_args.append(['-mmacosx-version-min=10.8', '-stdlib=libc++']) 
    link_args.append('-lc++') 

Ancak GCC bu derleme bayrak geçersiz (tam bağlam için https://github.com/honnibal/spaCy/blob/ba1d3ddd7f527d2e6e41b86da0f2887cc4dec83a/setup.py#L70 bakınız). Yani, eğer setup.py bu şekilde yazıyorsam, birisi OSX'te GCC kullanmaya çalışıyorsa derleme başarısız olur.

GCC ve clang farklı derleyici bayraklarını destekler. Yani hangi derleyicinin çağrılacağını bilmem gerekiyor, böylece farklı bayraklar gönderebiliyorum. Derleyici'yi setup.py'de tespit etmenin doğru yolu nedir?

Düzenleme 1: hayır Python istisna derleme hataları için yükseltilir olduğunu

Not: Ben anahtarın aynı tür ihtiyaç olarak

$ python setup.py build_ext --inplace 
running build_ext 
building 'spacy.strings' extension 
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -c spacy/strings.cpp -o build/temp.linux-x86_64-2.7/spacy/strings.o -O3 -mmacosx-version-min=10.8 -stdlib=libc++ 
gcc: error: unrecognized command line option ‘-mmacosx-version-min=10.8’ 
gcc: error: unrecognized command line option ‘-stdlib=libc++’ 
error: command 'gcc' failed with exit status 1 
$ 
+0

GCC'yi kötü bir bayrağa geçirdiğinizde (Python betiğinizde) hangi özel durum gerçekleşir? ThatException: send_flags_for_gcc() 'dışında doğru yol: try: send_flags_for_clang() olacaktır. –

+0

Bkz. Düzen --- özel durum kaldırılmaz. –

cevap

1

Ben sorunuzun üzerine çarptı. Ayrıca, benim durumumda, platforma bakılmaksızın bayrakların clang için olduğu gibi sys.prefix büyük değildir.

Mükemmel olduğundan emin değilim ama işte benim için en iyi olan şey. Yani, bir CC değişkeninin ayarlanmış olup olmadığını kontrol ediyorum; değilse, distutils'un neye benzediğini tahmin ediyorum.

Daha iyi bir çözüme hoş geldiniz! huysuz çocuklar için

import os 
import distutils 

try: 
    if os.environ['CC'] == "clang": 
     clang = True 
except KeyError: 
    clang = False 

if clang or distutils.sysconfig_get_config_vars()['CC'] == 'clang': 
    try: 
     _ = os.environ['CFLAGS'] 
    except KeyError: 
     os.environ['CFLAGS'] = "" 
    os.environ['CFLAGS'] += " -Wno-unused-function" 
    os.environ['CFLAGS'] += " -Wno-int-conversion" 
    os.environ['CFLAGS'] += " -Wno-incompatible-pointer-types 

Not: Ben extra_compile_args seçeneği kullanmak isterdim ama clang derleme komutu yanlış pozisyonda bayrakları koyar.