crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Boost + ICU, Хинты по сборке
Iron Bug
  опции профиля:
сообщение 24.11.2011, 17:29
Сообщение #1


Профессионал
*****

Группа: Модератор
Сообщений: 1594
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Я тут собирала новые библиотеки. Обнаружила некоторые косяки. Вот хинты для их обхода, если вдруг кому пригодится.

Сборка ICU 4.8.1.1:

При сборке с MinGW к сорцам ICU нужно применить небольшой патч для исправление ошибки "undefined symbol _mkdir":

В файле toolutil.cpp вот этот #include
/* In MinGW environment, io.h needs to be included for _mkdir() */
#ifdef U_MINGW
#include <io.h>
#endif

меняем на <direct.h>
/* In MinGW environment, io.h needs to be included for _mkdir() */
#ifdef U_MINGW
#include <direct.h>
#endif


С остальными компиляторами вроде проблем не наблюдалось.
Про кросскомпиляцию ICU читать readme.html в корне сорца! Там всё подробно написано. Сборка нетривиальная, так что лучше сначала прочитать документацию :)

Сборка boost 1.48.0 c ICU 4.8.1.1:

Далее, при сборке буста с новым форматом библиотеки ICU нужны дополнительные опции для bjam по сборке с ICU 4.8.1.1:
Цитата
-sHAVE_ICU=1 -sICU_PATH=путь_до_каталога_установки_ICU -sICU_LINK="-L$ICU_PATH/lib -licuuc48 -licuin48 -licudt48"

(Путь до каталога ICU должен быть полный!)

Это переопределение библиотек ICU для линковки, так как они теперь называются по-другому.
О новых правилах именования написано тут:
Цитата
Windows:
The DLLs you may need for your application are located in bin\icuXX##.dll, where "XX" are two letters (such as "uc" for the "common" library, "in" for the "i18n" library, etc.) and ## is the major and the minor version number (such as 42 for 4.2 / 4.2.0.1 or 4.2.4 ).
Either place the DLLs in the same directory as your application's .EXE files, or set the PATH variable to point to the directory containing the ICU DLLs.
For compiling applications, add the "include" direcotry (the parent of the "unicode" and "layout" directories) to the include search path.
For linking applications, add the "lib" directory to the appropriate path.
Other Platforms:
For other platforms, the .tgz file unpacks to a "/usr/local" type hierarchy. For system-wide installation, you can unpack all of the files into /usr/local/bin, /usr/local/include, etc.
The configuration script /usr/local/bin/icu-config or the similar Makefile include fragment /usr/local/lib/icu/current/Makefile.inc can be used in building applications.


При сборке boost 1.48.0 с MinGW в скриптах boost build имеется баг, приводящий к ошибке
Цитата
error: Duplicate name of actual target:
<pstage\lib>libboost_exception-mgw45-mt-1_48.a

У меня не было времени детально копаться в скриптах, я выяснила, что обход бага в том, чтобы проставить threading=multi в параметрах сборки. Баг уже известен в переписке по бусту и, скорее всего, скоро будет поправлен.
В прочих компиляторах баг не проявляется.

Сообщение отредактировал Iron Bug - 25.11.2011, 10:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 25.11.2011, 9:19
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1594
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


В общем, мне удалось собрать boost 1.48.0 c ICU 4.8.1.1 с MSVC 10.0, c MinGW 4.5.2, и кросскомпиляцией под линём, с MinGW 4.6.х (не помню точно версию).
Вот конфиги для сборки под вендой с MinGW:
(я собирала через MSYS)
1. В консоли MSYS:
Цитата
bootstrap.sh --with-icu=/home/Yana/bin/icu-4.8.1.1 --with-toolset=mingw

Может, можно и сразу делать toolset=gcc, но в некоторых конфигурациях он выёживается и лучше потом файл конфигурации руками поправить (см. далее).

2. Редактируем файл project-config.jam:
Все имена 'mingw' меняем на 'gcc', добавляем нужные глобальные переменные и т.п.
У меня в части определений получилось так:
Цитата
using gcc : : : <runtime-link>static/dynamic <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG ;

(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG - это я со скоростными таймерами собираю буст)

3. Запускаем сборку:
Цитата
bjam threading=multi link=shared runtime-link=shared -d2 -j2 --without-python --without-mpi --build-dir=каталог_для_сборки --layout=tagged address-model=32 -sHAVE_ICU=1 -sICU_PATH=полный_путь_до_каталога_установки_ICU -sICU_LINK="-L$ICU_PATH/lib -licuuc48 -licuin48 -licudt48" stage

Естественно, runtime-link, link и address-model ставим по своему усмотрению. Главное, оставить threading=multi (см. про баг чуть выше).
Ну и если собирать в консоли под вендой будет маленько по-другому:
Цитата
-sICU_LINK="-L%ICU_PATH%/lib -licuuc48 -licuin48 -licudt48"

просто разный синтаксис оформления переменных в скриптах.

Собственно, на этом всё. Собирается без проблем.

Про кросскомпиляцию под линём пока не пишу: это вряд ли кого заинтересует, а писать там надо дофига. Если будут вопросы - пишите сюда.

Сообщение отредактировал Iron Bug - 25.11.2011, 10:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 19.11.2012, 14:44
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1594
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Сборка boost 1.52.0 с ICU4 49.1.2 под MinGW 32 (с MSys)

1. Качаем сорц ICU4 49.1.2.
2. Далее сборка ICU происходит в консоли MSys
3. Распаковываем архив в сорцами ICU в каталог, где будем собирать, переходим в этот каталог.
4. Собираем ICU:
Цитата
cd source
./runConfigureICU MinGW
make
install

Примечание: для 64-битного MinGW перед сборкой нужно применять патч отсюда.
При конфигурировании можно указать префикс установки (--prefix). По умолчанию в MSys библиотека установится в C:\MinGW\msys\1.0\local\lib\
5. Качаем сорц boost 1.52.0.
6. Далее сборка boost происходит в консоли венды
7. Распаковываем буст куда-либо. Переходим в корень распакованного каталога.
8. Собираем bjam (b2):
Цитата
bootstrap.bat

9. Собираем сам буст:
Цитата
set PATH=c:\MinGW\bin;c:\MinGW\mingw32\bin;C:\MinGW\msys\1.0\bin
set ICU_PATH="C://MinGW//msys//1.0//local"
b2 toolset=gcc --build-type=complete address-model=32 -sHAS_ICU=1 -sICU_LINK="-L%ICU_PATH%//lib -licuuc49 -licuin49 -licudt49" --layout=tagged

Примечание: для ускорения сборки можно добавить опцию -jX, где X - число ядер на машине.
Путь ICU_PATH зависит от префикса установки ICU.

При старте сборки буста нужно смотреть, что появилась строка:
Цитата
Performing configuration checks

- has_icu builds : yes

Если не появилась - значит, где-то в путях допущена ошибка. Смотреть, что не так, можно в логе build_v2/check.log.

Собственно, всё.
Для работы используем библиотеки буст из stage/lib и ICU из каталога установки.

Сообщение отредактировал Iron Bug - 20.11.2012, 9:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 28.11.2012, 11:55
Сообщение #4


Профессионал
*****

Группа: Модератор
Сообщений: 1594
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Можно собрать boost + ICU полностью статически:
Собрать статические библиотеки ICU: запускать конфигурацию с флагом --enable-static:
Цитата
runConfigureICU MinGW --enable-static

(соответственно, если не под MinGW собирается, то другое имя прописать)
При сборке ICU в статическом виде имена библиотек имеют название не libicuXX.a, а libsicuXX.a. Сначала не заметила этой мелочи и долго не могла понять, почему не линкуется.
Для работы со статической сборкой ICU нужно определять макрос:
Цитата
U_STATIC_IMPLEMENTATION=1

Это касается и буста, и конечных exe-шников.

Собрать буст полностью статически, со статической ICU (пример для сборки под MinGW):
Цитата
set PATH=c:\MinGW\bin;c:\MinGW\mingw32\bin;C:\MinGW\msys\1.0\bin
set ICU_PATH="C://MinGW//msys//1.0//local"
b2 -j2 toolset=gcc link=static runtime-link=static define=U_STATIC_IMPLEMENTATION=1 address-model=32 -sHAS_ICU=1 --layout=tagged


Мне удалось под MinGW собрать exe-шник, который юзает boost, ICU, libiconv, libintl и зависит только от msvcrt.dll.

Для этого libiconv надо тоже собирать статически:
Цитата
./configure --prefix=/mingw --disable-shared --disable-nls


Сообщение отредактировал Iron Bug - 28.11.2012, 12:14
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 17.10.2013, 10:07
Сообщение #5


Профессионал
*****

Группа: Модератор
Сообщений: 1594
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Собрала тут в очередной раз комплект boost+ICU. На этот раз boost 1.54.0 и ICU 52.1.

Собрано было для MSVC и MinGW под вендой и GCC под линём.

Для сборки в MSVC под вендой:
ICU собирается в студии, открыванием солюшена icu/source/allinone/allinone.sln и полной сборкой релиза.
Далее, для сборки boost запускается Bootstrap.bat (он компилирует bjam.exe).
И далее, в консоли венды запускается следующий батничек:
bjam --toolset=msvc-10.0 --build-dir="<каталог_для_временных_файлов_сборки>" address-model=32 threading=multi link=static runtime-link=static -sHAVE_ICU=1 -sICU_PATH="<путь_до_корня_ICU_сорца>" -sICU_LINK="/LIBPATH:<путь_до_корня_ICU_сорца>/lib icuuc.lib icuin.lib icudt.lib" 
bjam --toolset=msvc-10.0 --build-dir="<каталог_для_временных_файлов_сборки>" address-model=32 threading=multi link=static runtime-link=shared -sHAVE_ICU=1 -sICU_PATH="<путь_до_корня_ICU_сорца>" -sICU_LINK="/LIBPATH:<путь_до_корня_ICU_сорца>/lib icuuc.lib icuin.lib icudt.lib"

Тут сборка идёт под 10-й студией, для 32-битной системы, многопоточные сборки со статической линковкой и разными линковками runtime библиотек.
Если добавить в обе строки
cflags="/DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG"

то будет сборка boost::thread с наносекундными таймерами.

Для MinGW под вендой:
ICU собирается в MSys:
./configure --prefix=<какая-нить отдельная папка>

Инсталляция в отдельную папку нужна для последующего копирования файлов для работы в венде. Потом стандартно: make+make install. Забираем все файлы из папки, куда установилось, и копируем в удобное для себя место для хранения собранной ICU.
Далее, собираем boost (из консоли венды):
Bootstrap.bat (для собирания bjam, неважно, каким компилятором).
Далее, батничек:
bjam --toolset=gcc --build-dir="<каталог_для_временных_файлов_сборки>"  threading=multi link=static runtime-link=shared address-model=32 cflags="-DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG" -sHAVE_ICU=1 -sICU_PATH="<путь_до_копии собранного_ICU>" -sICU_LINK="-L<путь_до_копии собранного_ICU>/lib -licuuc -licuin -licudt"

-DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG означает сборку boost::thread с наносекундными таймерами. Это можно опустить или добавить, по желанию. Я собираю с таймерами, ибо они мне нужны.

Для запуска GCC нужно, чтобы в переменной окружения PATH был прописан путь до MinGW/bin.

Также везде в опции bjam можно добавить -j2 для сборки на двух ядрах проца, например. Чтобы было быстрее.

Собирается долго, жрёт много памяти и винта в каталоге для временных файлов. Можно указать конкретные библиотеки для сборки или исключить некоторые, по желанию.

Под линюксом, с GCC:
ICU собирается стандартно (configure+make+make install). Если нужен нестандарный каталог, то с prefix.
Сборка boost:
Если ICU установлен в нестандартный каталог, то указать, где:
bootstrap.sh --with-icu=<путь_до_установки_ICU>

Либо просто без параметров, если ICU установлен в общие каталоги.
Далее, скрипт:
bjam threading=multi link=shared runtime-link=shared -d2 --without-python --without-mpi --layout=tagged -sHAVE_ICU=1 -sICU_PATH=<путь_до_установки_ICU> -sICU_LINK="-L<путь_до_установки_ICU>/lib -licuuc -licudata" cxxflags="-I<путь_до_установки_ICU>/include" stage

Собственно, параметры ICU_PATH и cxxflags тут нужны только если ICU был установлен в нестандартный каталог (с prefix).
Ну и выбор дополнительных флагов можно добавить, по желанию. Например,
cflags="-DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG"
или список библиотек, которые нужны, или -j2 для ускорения. Ну и разные параметры линковки, разумеется.

Сообщение отредактировал Iron Bug - 17.10.2013, 11:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.1.2020, 2:22