2011-11-02 10 views
5

Sto cercando di correggere un bug in libxml2. Non riesco a farlo compilare con --with-icu quando si utilizza --prefix=/Server/software. Ho inviato uno bug report here, ma ho bisogno di farlo compilare per risolvere un conflitto durante la compilazione di PHP con supporto intl. Sospetto che sia un problema con il Makefile. La mia esperienza con Makefile è limitata. Il risultato desiderato sta arrivando con una patch che può essere inviata al rapporto bug collegato.Come applicare una patch a libxml2 in modo che venga compilata con il supporto ICU quando si utilizza un prefisso?

L'indicatore --with-icu causa la definizione di LIBXML_ICU_ENABLED. Il codice incluso dovrebbe risolvere un conflitto includendo le intestazioni da icu e libxml2 (in particolare, entrambi utilizzano UChar). Il plugin PHP intl, attivato con --enable-intl, richiede icu. libxml2 è richiesto da PHP per le funzioni DOM/XML.

Ci sono due problemi.

primo luogo, questa configurazione:

./configure --prefix=/Server/software --enable-shared --enable-static --with-icu

risultati in:

configure: error: libicu config program icu-config not found

Questo accade a causa di questo codice in configure.in:

WITH_ICU=0 
if test "$with_icu" != "yes" ; then 
    echo Disabling ICU support 
else 
    ICU_CONFIG=icu-config 
    if ${ICU_CONFIG} --cflags >/dev/null 2>&1 
    then 
     ICU_LIBS=`icu-config --ldflags` 
     LDFLAGS="$LDFLAGS $ICU_LIBS" 
     WITH_ICU=1 
     echo Enabling ICU support 
    else 
     AC_MSG_ERROR([libicu config program icu-config not found]) 
    fi 
fi 

Specificamente ICUCONFIG=icu-config non sta rispettando --prefix=/Server/software. Posso aggirare questo facendo export PATH=/Server/software/bin:$PATH.

Questo "risolve" il problema ./configure.

In secondo luogo, quando corro make ottengo gli errori, i più relavent:

./include/libxml/encoding.h:31:26: error: unicode/ucnv.h: No such file or directory

Il file unicode/uncv.h è in /Server/software/include/unicode/uncv.h. Sospetto che il compilatore stia cercando questo file nella directory locale e nella mia directory/usr.

Questo è quanto l'errore si riferisce a:

#ifdef LIBXML_ICU_ENABLED 
#include <unicode/ucnv.h> 
#endif 

Chiaramente questo è un problema vettoriale con --with-icu e --prefix=/Server/software. Senza --with-icu compila bene, ma questo è necessario per risolvere un conflitto UChar definito durante la compilazione di PHP con icu e libxml2.

Il risultato è icu-config --cflags:

-O2 -Wall -ansi -pedantic -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -Wno-long-long

Questo viene convogliato in/dev/null.

Il risultato di icu-config --ldflags è:

-lpthread -lm -L/Server/software/lib -licui18n -licuuc -licudata -lpthread -lm

ciò che deve essere cambiato per risolvere questi problemi?

+0

ho postato una patch per il problema ICU_CONFIG: https://bugzilla.gnome.org/show_bug.cgi?id=663214 –

risposta

2

Quindi, date un'occhiata a dove sta usando icu-config.Dovrebbe fare qualcosa come icu-config --cppflags che dovrebbe impostare -I/Server/Software/include o simile. È possibile aggirare il problema impostando CPPFLAGS per includere un parametro di questo tipo.

È possibile includere la riga di comando compilata immediatamente prima dell'errore?

Sembra un bug in libxml - dovrebbe cercare $ {PREFIX}/bin per icu-config.

Inoltre, ICU ora esporta i file pkg-config, che sono più di un modo standard per trovare tali elementi.


Prova questa prima WITH_ICU:

ICU_CPPFLAGS=`icu-config --cppflags` 
    CPPFLAGS="$CPPFLAGS $ICU_CPPFLAGS" 

aggiornamento ho intenzione di citare l'ultima risposta di Luca. Sono contento che stia funzionando.

Ho risolto i problemi del linker, quindi ora tutto funziona. Per questa domanda utilizzando libxml 2.7.7 era la soluzione. Sembra che OX X 10.6 sia fornito con 2.7.8. Quindi per farlo funzionare devi compilare libxml2 tu stesso con 2.7.7. I problemi del linker vengono risolti aggiungendo LIBS = "- lresolv -lstdC++" appena prima di PHP ./configure. Se si installa in una posizione non standard, è inoltre necessario compilare ICU con --enable-rpath. Ho accettato la tua risposta. Sentiti libero di aggiornarlo con queste informazioni :). - Luca 17 ore fa

+0

Ho aggiornato la questione per includere le parti più relavent di configure.in e l'output di icu-config quando usato in 'configure.in'. Sembra che 'icu-config --ldflags' debba passare'/Server/software' per fare in modo che l'inclusione funzioni in 'encoding.h', ma non riesce a passare. Cercando di trovare altri pacchetti che potrebbero fare qualcosa di simile. – Luke

+0

Bene, sembra aver risolto il problema con la creazione di libxml2. Ma ora la configurazione del mio PHP fallisce con 'controllando se la build di libxml funziona ... no'. Il bit relavant in config.log essendo 'configure: 21707: gcc -o conftest -fvisibility = hidden -no-cpp-precomp -Wl, -rpath,/Server/software/lib -L/Server/software/lib conftest.c '. Senza compilare libxml2 con '--with-icu' PHP va bene (se non includo' --enable-intl', di cui ho bisogno). – Luke

+0

@Luke cosa dice config.log in php? Intl usa ICU come presumo tu sappia. intl sta usando la stessa ICU che stai usando per libxml2, giusto? –

Problemi correlati