Как собрать Erlang c wxWidgets на MacOS X 10.8.x
UPDATE: Решение проверено и работает на MacOS X 10.8.5 и XCode/CLT 4.6.3. На XCode/CLT 5.0 beta и MacOS X 10.9 Maverics работать не будет.
У Erlang есть специальное средство получения различных характеристик локальной или удалённой ноды — observer. Штука замечательная, однако, требующая библиотеки wxWidgets, что затрудняет использование данного инструмента на MacOS X, так как официальные релизы последней не очень-то хорошо работают на MacOS X в 64-bit режиме. Поэтому сборки Erlang для MacOS X как правило поставляются либо без wx, либо с wx, но он всё равно не работает так как не хватает необходимых библиотек. Ситуация неприятная, но не безнадёжная.
Установка wxWidgets
Для того чтобы исправить ситуацию необходимо сначала установить wxWidgets версии 2.9.x. Официальная документация рекомендует скачать и установить необходимую версию вручную, однако, я привык полагаться в таких вопросах на менеджеры пакетов, чтобы не получить в будущем каких-либо проблем с разными версиями библиотек.
Homewbrew, который я использую для управления всякими сторонними программами и библиотеками, предлагает использовать wxmac — несколько урезанную версию wxWidgets для MacOS X. Однако у этого пакета есть одна проблема: если его собрать с опциями по-умолчанию, Erlang не сможет слинковать свой драйвер wxWidgets. Поэтому при сборке wxmac необходимо указать ключик —disable-monolithic:
$ brew install --disable-monolithic wxmac
После сборки с этим флажком вывод wx-config —libs должен выглядеть примерно так:
$ wx-config --libs -L/usr/local/Cellar/wxmac/2.9.5.0/lib -framework IOKit -framework Carbon -framework Cocoa -framework AudioToolbox -framework System -framework OpenGL -framework QuickTime -lwx_osx_cocoau_xrc-2.9 -lwx_osx_cocoau_webview-2.9 -lwx_osx_cocoau_html-2.9 -lwx_osx_cocoau_qa-2.9 -lwx_osx_cocoau_adv-2.9 -lwx_osx_cocoau_core-2.9 -lwx_baseu_xml-2.9 -lwx_baseu_net-2.9 -lwx_baseu-2.9
Всё, wxWidgets установлена как надо, теперь нужно собрать Erlang, который сможет её использовать.
Установка Erlang
В этой части мы рассмотрим два типа установки Erlang, из homebrew и из исходников. Думаю по приведённым заметкам несложно будет собрать Erlang из других менеджеров пакетов или kerl.
Сборка с помощью homebrew
Чтобы собрать пакет, а не использовать уже собранный, homebrew предоставляет специальный параметр команды install --build-from-source
. Однако этого параметра недостаточно.
По-умолчанию homebrew накладывает некоторые ограничения на окружение в процессе сборки, поэтому для того чтобы конфигуратор Erlang смог найти установленный в /usr/local wxWidgets необходимо указать параметр --env=std
.
Кроме того, homebrew соберёт erlang с помощью clang, однако при попытке запустить что-то использующее wxWidgets Erlang VM будет падать. Чтобы избежать этого добавим ещё один параметр --cc=gcc-4.2
.
Полностью строка установки Erlang c помощью homebrew будет выглядеть так:
$ brew -v install --env=std --build-from-source --cc=gcc-4.2 erlang
Чтобы убедиться что Erlang будет использовать вашу свежесобраную библиотеку wxWidgets внимательно посмотрите на вывод configure. Если вы увидите в нём следующее:
...
checking for debug build of wxWidgets... checking for wx-config... /usr/local/bin/wx-config
checking for wxWidgets version >= 2.8.4 (--unicode --debug=yes)... yes (version 2.9.5)
checking for wxWidgets static library... no
checking for standard build of wxWidgets... checking for wx-config... (cached) /usr/local/bin/wx-config
checking for wxWidgets version >= 2.8.4 (--unicode --debug=no)... yes (version 2.9.5)
checking for wxWidgets static library... no
checking if wxwidgets have opengl support... yes
...
то всё в порядке, Erlang соберётся с поддержкой wxWidgets. Если нет, это повод прервать установку и разобраться в причинах такого результата.
Проверяем что Erlang собрался корректно:
$ erl Erlang R16B02 (erts-5.10.3) [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] Eshell V5.10.3 (abort with ^G) 1> wx:demo(). ok 2> observer:start(). ok
Установка из исходников
Если вы по каким-то причинам не используете homebrew, можно собрать Erlang с поддержкой wxWidgets из исходников:
$ git clone git@github.com:erlang/otp.git erlang-otp $ cd erlang-otp $ git co OTP_R16B02 $ ./configure --disable-debug --enable-kernel-poll --enable-threads --enable-dynamic-ssl-lib --enable-shared-zlib --enable-smp-support --with-dynamic-trace=dtrace --enable-hipe --enable-darwin-64bit --prefix=/opt/erlang && make && sudo make install
Если на предыдущем этапе компиляция и установка не прервались с ошибкой линковки драйвера wx (или какой-то другой), в каталоге /opt/erlang будет лежать Erlang с поддержкой wxWidgets. Проверяем:
$ /opt/erlang/bin/erl Erlang R16B02 (erts-5.10.3) [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] Eshell V5.10.3 (abort with ^G) 1> wx:demo(). ok 2> observer:start(). ok
Вот, собственно, и всё.
Поделиться:
- Нажмите, чтобы поделиться на Twitter (Открывается в новом окне)
- Послать ссылку другу по электронной почте (Открывается в новом окне)
- Нажмите, чтобы открыть на Facebook (Открывается в новом окне)
- Нажмите, чтобы поделиться на LinkedIn (Открывается в новом окне)
- Нажмите для печати (Открывается в новом окне)
Похожее
-
02.10.2013 в 10:15Находки в сети за сентябрь 2013 | Записки программиста