2015-02-21 9 views
5

Mam Python C++, która wymaga rozszerzenia następujące flagi kompilacji gdy skompilowany przy użyciu szczęk na OSX:Jak stwierdzić, który kompilator zostanie wywołany dla rozszerzenia Python C w setuptools?

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

Wykrywanie OSX w moim setup.py jest dość prosta. Mogę to zrobić:

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

(Zobacz https://github.com/honnibal/spaCy/blob/ba1d3ddd7f527d2e6e41b86da0f2887cc4dec83a/setup.py#L70 pełnego kontekstu)

Jednak ta flaga na GCC kompilacji jest nieprawidłowy. Tak więc kompilacja nie powiedzie się, jeśli ktoś spróbuje użyć GCC na OSX, jeśli napiszę plik setup.py w ten sposób.

GCC i clang obsługują różne flagi kompilatora. Tak więc, muszę wiedzieć, który kompilator zostanie wywołany, więc mogę wysyłać różne flagi. Jaki jest właściwy sposób wykrywania kompilatora w pliku setup.py?

Edit 1:

Należy pamiętać, że żaden wyjątek Python jest podniesiona za błędy kompilacji:

$ 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

Jaki wyjątek ma miejsce (w skrypcie w języku Python), gdy GCC jest błędną flagą? Właściwą metodą byłoby 'try: send_flags_for_clang() z wyjątkiem ThatException: send_flags_for_gcc()'. –

+0

Zobacz Edycja --- żaden wyjątek nie został zgłoszony. –

Odpowiedz

1

uderzę na swoje pytanie, jak muszę tego samego rodzaju przełącznika. Poza tym w moim przypadku sys.prefix nie jest wielki, ponieważ flagi są dla clang niezależnie od platformy.

Nie jestem pewien, czy jest idealny, ale oto, co jest najlepsze dla mnie. Tak więc sprawdzam, czy ustawiono zmienną CC; jeśli nie, sprawdzam, jak sądzę, gdzie jest distutils.

Każde lepsze rozwiązanie z zadowoleniem!

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 

Uwaga na złym humorze facetów: Bardzo chciałbym użyć opcji extra_compile_args, ale stawia flagi w niewłaściwym miejscu w komendzie clang kompilacji.

Powiązane problemy