Всячина

Каплями через край

Как собрать 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) [source] [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) [source] [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

На экране должны появитсья примерно такие окна:

Вот, собственно, и всё.

Comments