2012-09-18 6 views
8

Sto costruendo lxml su Mac OS X 10.8.1 e Python 2.7.2 e ho problemi. (Ho clonato il repository Github e ho seguito le istruzioni per Mac OS X qui: http://lxml.de/build.html)Cosa sto facendo male quando si installa lxml su Mac OS X 10.8.1?

Sembra che qualcosa si blocchi nella costruzione di libxml2; la seguente è la coda del terminale di uscita:

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 

[snipped]

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 

[snipped]

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 

[snipped]

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 WAY fuori dalla mia profondità nel tentativo di capire cosa c'è di sbagliato qui. Qualcuno può indicarmi la direzione di ciò che devo fare per risolvere il problema?

risposta

17

Questo è un bug in libxml2 2.9.

L'errore che stai ricevendo è su questa linea:

once_control = PTHREAD_ONCE_INIT; 

Questo è il codice illegale, che accade solo a lavorare su Linux. PTHREAD_ONCE_INIT può essere utilizzato solo per l'inizializzazione, non per l'assegnazione, e c'è una ragione specifica per questo: in questo modo le piattaforme possono definire PTHREAD_ONCE_INIT come inizializzatore di aggregazione. Quale OS X fa. Da 10.8.1 di /usr/include/pthread.h:

#define PTHREAD_ONCE_INIT {_PTHREAD_ONCE_SIG_init, {0}} 

Sembra che questo è stato riportato alla libxml2 mailing list di qualche giorno fa (https://mail.gnome.org/archives/xml/2012-September/msg00036. html), archiviato in bugzilla due giorni dopo (https://bugzilla.gnome.org/show_bug.cgi?id=684024) e risolto il giorno successivo (http://git.gnome.org/browse/libxml2/commit /? id = 3f6cfbd1d38d0634a2ddcb9a0a13e1b5a2195a5e), quindi presumibilmente 2.9.1 non avrà questo problema.

Così, qui sono le opzioni:

Naturalmente si potrebbe aspettare che 2.9.1 a venire fuori.

Alternativa, nonostante quello che dice la pagina di build, la versione di libxml2 fornita con Mountain Lion, 2.7.8, non è "orribilmente obsoleta" - è più recente della versione 2.7.3 che suggerisce di usare. Quindi, puoi semplicemente saltare lo --static-deps e usare il 2.7.8 integrato.

Se si desidera qualcosa di più recente di 2.7.8, ma non come nuovo (non funzionante) 2.9.0, la pagina di build mostra come specificarlo esplicitamente, e http://www.xmlsoft.org dovrebbe avere la cronologia delle versioni da qualche parte in modo da puoi scegliere la versione che desideri. Per esempio:

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

Oppure si potrebbe applicare manualmente la patch da http://git.gnome.org/browse/libxml2/commit/?id=3f6cfbd1d38d0634a2ddcb9a0a13e1b5a2195a5e e costruire che manualmente, o tirare la cima dell'albero invece della versione 2.9.0, costruire quella, e poi dire lxml di utilizzare tale accumulo.

In futuro, se non si vuole avere a che fare con i build di debug, suggerirei semplicemente di usare pip per installare i pacchetti Python, e Homebrew per installare eventuali dipendenze mancanti.Potresti non avere sempre la build ideale dell'ultima versione di tutto, ma sarà molto più semplice e generalmente abbastanza buono.

+0

Wow, grazie mille per la risposta incredibilmente completa! So che ho provato a usare pip in un primo momento ma non ha funzionato; L'ho appena provato e completato con successo. (Terminale output alla fine = "Lxml installato con successo") Ma quando vado in python e digito "import lxml" ottengo "ImportError: No module named lxml". Qualche idea su cosa sto facendo male? –

+1

Avete qualche installazione non Apple Python? È possibile che tu stia utilizzando versioni di pip e python che non corrispondono. Una cosa abbastanza comune è che si finisce con/usr/local/bin/pip (o/opt/local/bin/pip, ecc.) Come primo pip sul proprio percorso e installa moduli per/usr/local/bin/python, ma poi/usr/bin/python come primo python. – abarnert

+0

È possibile che sia riuscito a rovinare tutto a un certo punto. Come posso diagnosticare questo? (Sono un vero novizio su comandi/percorsi/protocolli UNIX!) –