Как мне исправить libxml2, чтобы он скомпилировался с поддержкой ICU при использовании префикса? - PullRequest
5 голосов
/ 03 ноября 2011

Я пытаюсь исправить ошибку в libxml2. Я не могу заставить его скомпилировать с --with-icu при использовании --prefix=/Server/software. Я отправил отчет об ошибке здесь , но мне нужно его скомпилировать для разрешения конфликта при компиляции PHP с поддержкой intl. Я подозреваю, что это проблема с Makefile. Мой опыт работы с Makefile ограничен. Желаемый результат - это патч, который можно отправить в связанный отчет об ошибке.

Флаг --with-icu определяет LIBXML_ICU_ENABLED. Включенный код должен разрешать конфликт при включении заголовков из icu и libxml2 (в частности, оба используют UChar). PHP плагин intl, активированный с помощью --enable-intl, требует icu. libxml2 необходим PHP для функций DOM / XML.

Есть две проблемы.

Во-первых, этот конфиг:

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

Результаты:

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

Это происходит из-за этого кода в 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

В частности ICUCONFIG=icu-config не уважает --prefix=/Server/software. Я могу обойти это, выполнив export PATH=/Server/software/bin:$PATH.

Это "исправляет" проблему ./configure.

Во-вторых, когда я запускаю make, я получаю ошибки, наиболее подходящие из которых:

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

Файл unicode/uncv.h находится в /Server/software/include/unicode/uncv.h. Я подозреваю, что компилятор ищет этот файл в локальном каталоге и в моем каталоге / usr.

На это ссылается ошибка:

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

Очевидно, что это проблема пути при использовании --with-icu и --prefix=/Server/software. Без --with-icu он прекрасно компилируется, но это необходимо для разрешения определенного конфликта UChar при компиляции PHP как с icu, так и с libxml2.

Результат icu-config --cflags:

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

Это передается в /dev/null.

.

Результат icu-config --ldflags:

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

Что нужно изменить, чтобы решить эти проблемы?

1 Ответ

2 голосов
/ 03 ноября 2011

Итак, посмотрите, где он использует icu-config. Он должен делать что-то вроде icu-config --cppflags, которое должно установить -I/Server/Software/include или подобное. Вы можете обойти это, установив CPPFLAGS для включения такого параметра самостоятельно.

Можете ли вы включить фактическую командную строку компиляции непосредственно перед ошибкой?

Похоже на ошибку в libxml - она ​​должна искать $ {PREFIX} / bin для icu-config.

Кроме того, ICU теперь экспортирует pkg-config файлы, что является более стандартным способом поиска таких предметов.


Попробуйте это раньше WITH_ICU:

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

обновление Я собираюсь процитировать последний ответ Люка. Рад, что работает.

Я решил проблемы с компоновщиком, теперь все работает. На этот вопрос использование libxml 2.7.7 было решением. Похоже, OX X 10.6 поставляется с 2.7.8. Таким образом, чтобы это работало, вы должны сами скомпилировать libxml2 с 2.7.7. Проблемы с компоновщиком решаются путем добавления LIBS = "- lresolv -lstdc ++" непосредственно перед PHP ./configure. При установке в нестандартном месте вам также нужно скомпилировать ICU с --enable-RPATH. Я принял твой ответ. Не стесняйтесь обновлять его с этой информацией :). - Люк 17 часов назад

...