2012-09-18 5 views
8

Buduję lxml na Mac OS X 10.8.1 i Pythonie 2.7.2 i mam problemy. (Sklonowałem repozytorium Github i postępowałem zgodnie z instrukcjami dla Mac OS X tutaj: http://lxml.de/build.html)Co robię źle podczas instalowania lxml na Mac OS X 10.8.1?

Wygląda na to, że coś zawiesza się w budynku libxml2; następujące koniec ogona wyjściowej terminala:

configure: creating ./config.status 
config.status: creating libxml2.spec 
config.status: creating Makefile 
config.status: creating include/Makefile 
config.status: creating include/libxml/Makefile 
config.status: creating doc/Makefile 
config.status: creating doc/examples/Makefile 
config.status: creating doc/devhelp/Makefile 
config.status: creating example/Makefile 
config.status: creating python/Makefile 
config.status: creating python/tests/Makefile 
config.status: creating xstc/Makefile 
config.status: creating include/libxml/xmlversion.h 
config.status: creating xml2-config 
config.status: creating libxml-2.0.pc 
config.status: creating libxml-2.0-uninstalled.pc 
config.status: creating python/setup.py 
config.status: creating config.h 
config.status: executing depfiles commands 
config.status: executing libtool commands 
rm: libtoolT: No such file or directory 
Done configuring 
make all-recursive 
Making all in include 
Making all in libxml 
make[3]: Nothing to be done for `all'. 
make[3]: Nothing to be done for `all-am'. 
Making all in . 
    CC  error.lo 

[wycięte]

CC  hash.lo 
parser.c: In function 'xmlParseInNodeContext': 
parser.c:13492: warning: pointer targets in passing argument 1 of 'xmlFindCharEncodingHandler' differ in signedness 
    CC  list.lo 

[wycięte]

CC  xpointer.lo 
xpath.c: In function 'xmlXPathRegisterFuncNS': 
xpath.c:4870: warning: ISO C forbids passing argument 4 of 'xmlHashAddEntry2' between function pointer and 'void *' 
xpath.c: In function 'xmlXPathFunctionLookupNS': 
xpath.c:4951: warning: ISO C forbids assignment between function pointer and 'void *' 
xpath.c: In function 'xmlXPathCompOpEval': 
xpath.c:13535: warning: ISO C forbids assignment between function pointer and 'void *' 
xpath.c:13562: warning: ISO C forbids assignment between function pointer and 'void *' 
xpath.c: At top level: 
trionan.c:221: warning: 'trio_is_negative' defined but not used 
    CC  xinclude.lo 

[wycięte]

CC  xmlstring.lo 
threads.c: In function 'xmlCleanupThreads': 
threads.c:918: error: expected expression before '{' token 
make[2]: *** [threads.lo] Error 1 
make[2]: *** Waiting for unfinished jobs.... 
make[1]: *** [all-recursive] Error 1 
make: *** [all] Error 2 
Traceback (most recent call last): 
    File "setup.py", line 225, in <module> 
    **setup_extra_options() 
    File "setup.py", line 139, in setup_extra_options 
    STATIC_CFLAGS, STATIC_BINARIES) 
    File "/Users/jedc/Downloads/lxml/setupinfo.py", line 57, in ext_modules 
    multicore=OPTION_MULTICORE) 
    File "/Users/jedc/Downloads/lxml/buildlibxml.py", line 338, in build_libxml2xslt 
    cmmi(libxml2_configure_cmd, libxml2_dir, multicore, **call_setup) 
    File "/Users/jedc/Downloads/lxml/buildlibxml.py", line 266, in cmmi 
    cwd=build_dir, **call_setup) 
    File "/Users/jedc/Downloads/lxml/buildlibxml.py", line 249, in call_subprocess 
    raise Exception('Command "%s" returned code %s' % (cmd_desc, returncode)) 
Exception: Command "make -j5" returned code 512 

I m SPEŁNIE poza moją głębię, próbując dojść do tego co tu jest nie tak. Czy ktoś może wskazać mi kierunek, w którym muszę to naprawić?

Odpowiedz

17

To jest błąd w bibliotece libxml2 2.9.

Błąd dostajesz na tej linii:

once_control = PTHREAD_ONCE_INIT; 

To nielegalne kod, który właśnie się dzieje, do pracy w systemie Linux. PTHREAD_ONCE_INIT można użyć tylko do inicjowania, a nie do przypisania, i istnieje ku temu konkretny powód: aby platformy mogły definiować PTHREAD_ONCE_INIT jako inicjator agregujący. Którego OS X ma. Od 10.8.1 na /usr/include/pthread.h:

#define PTHREAD_ONCE_INIT {_PTHREAD_ONCE_SIG_init, {0}} 

Wygląda to zostało zgłoszone do listy mailingowej libxml2 kilka dni temu (https://mail.gnome.org/archives/xml/2012-September/msg00036. html), złożony w bugzilli dwa dni później (https://bugzilla.gnome.org/show_bug.cgi?id=684024) i naprawiony następnego dnia (http://git.gnome.org/browse/libxml2/commit /? id = 3f6cfbd1d38d0634a2ddcb9a0a13e1b5a2195a5e), więc prawdopodobnie 2.9.1 nie będzie mieć tego problemu.

Tak, tu są twoje opcje:

Oczywiście można czekać na 2.9.1 wyjdzie.

Alternatywa, wbrew temu, co twierdzi strona build, wersja libxml2, że pochodzi z Mountain Lion, 2.7.8, nie jest „strasznie przestarzałe” -To nowsza niż wersja 2.7.3 on sugeruje użycie. Więc możesz po prostu pominąć --static-deps i użyć wbudowanego 2.7.8.

Jeśli chcesz czegoś nowszego niż 2.7.8, ale nie tak nowatorskiego jak (niedziałający) 2.9.0, strona kompilacji pokazuje, jak go jawnie określić, a http://www.xmlsoft.org powinna mieć gdzieś historię wersji, aby może wybrać wersję, którą chcesz. Na przykład:

python setup.py build --static-deps \ 
    --libxml2-version=2.8.0 

Lub można ręcznie zastosować poprawkę z http://git.gnome.org/browse/libxml2/commit/?id=3f6cfbd1d38d0634a2ddcb9a0a13e1b5a2195a5e i budować to ręcznie, albo pociągnąć górną część drzewa zamiast wersji 2.9.0, który budować, a potem powiedzieć lxml użyć tej kompilacji.

W przyszłości, jeśli nie chcesz mieć do czynienia z kompilacjami debugowania, sugeruję użycie pip do zainstalowania pakietów w Pythonie i Homebrew do zainstalowania brakujących zależności.Nie zawsze można uzyskać idealną kompilację najnowszej wersji wszystkiego, ale będzie to znacznie łatwiejsze i zazwyczaj wystarczająco dobre.

+0

Wow, dziękuję bardzo za niewiarygodnie wyczerpującą odpowiedź! Wiem, że próbowałem najpierw użyć pip, ale to nie zadziałało; Właśnie wypróbowałem to teraz i to zakończyło się pomyślnie. (Wyjście terminala na końcu = "Pomyślnie zainstalowano lxml") Ale kiedy wchodzę do pythona i wpisuję "import lxml", otrzymuję "ImportError: Brak modułu o nazwie lxml". Jakieś pomysły na temat tego, co robię źle? –

+1

Czy masz instalacje Pythona inne niż Apple? Możliwe, że używasz wersji pip i python, które nie pasują do siebie. Jedną z powszechnych rzeczy jest to, że kończysz z/usr/local/bin/pip (lub/opt/local/bin/pip, itp.) Jako pierwszym pipsem na twojej ścieżce i instalujesz moduły dla/usr/local/bin/python, ale potem/usr/bin/python jako pierwszy python. – abarnert

+0

Jest całkiem możliwe, że udało mi się to w pewnym momencie zepsuć. Jak mogę to zdiagnozować? (Jestem prawdziwym nowicjuszem na komendach/ścieżkach/protokołach UNIX!) –