Собираем FreeSWITCH из Git в Windows

Posted on November 28, 2011

Казалось бы, что может быть проще сборки приложения из его репозитория? Скачал зеркало или снапшот, накатил зависимостей, потом autoreconf -fvi && ./configure --prefix=/opt && make и дело в шляпе.

Как правило, в нормальных ОС так оно и есть. Однако, доминирующее положение на рынке до сих пор занимает куда более нетрадиционная система, и имя её всем известно.

Нетрадиционная система нетрадиционна во всём – и окончания строк-то у неё иные, и окружение по-умолчанию ущербное, и тд и тп.

Сегодня я поделюсь своим опытом сборки FreeSWITCH под Windows. Официальная документация умалчивает некоторые каверзные моменты, да и документов по сборке на русском я ещё не видел (может быть, плохо искал).

Получение исходного кода

Для начала нам понадобится клиент Git для Windows . После его установки открываем “Git Bash”, переходим командой cd в нужную директорию, куда будет качать снапшот. Стоит отметить, что в этой черной консольке эмулируется Unix-окружение со всеми вытекающими – там есть и grep , и sed , и awk , и все-все-все. А ещё там используется стандартная для Unix схема организации иерархии файловой системы (не знаю, как это выразить лучше по-русски), так что вместо привычного пользователям Windows “C:” в путях к файлам вы увидим “/c/”.

В общем, я решил качать исходники в директорию “/d/src” на своём компьютере, которая в Windows видна как “D:/src”.

Нетерпеливый читатель, который сам всё знает, наверно сразу набрал заветную команду “git clone …”, чтобы скачать исходники. А вот нет! Так делать не надо, и сейчас объясню почему.

Как я уже сказал, в разных ОС используются разные символы для обозначения окончания строки. В Unix это просто символ “0x0A” (LF, linefeed), а в Windows – аж два символа, “0x0D0A” (CRLF, carriage-return linefeed). Заботливый Git знает об этом, и по-умолчанию при клонировании репозитория (или же загрузке обновлений в него) осуществляет конвертацию окончаний строк в родные для данной ОС.

Всё бы хорошо, только вот в хитрой системе сборки FreeSWITCH некоторые исходники предварительно обрабатываются программой awk , и замена окончаний строк тупо ломает некоторые скрипты, и в итоге сервер не собирается вообще. На официальной вики об этом, конечно, написано, но только после того, как дана команда качать исходники :)

Эту операцию конвертирования, конечно, можно отключить в настройках. Как известно, в git настройки могут быть как глобальными для всех репозиториев, так и персональными для каждого.

Глобально отключать эту фичу я не хочу, т.к. массе моих проектов оно не мешает, поэтому делаю следующий финт:

$ mkdir freeswitch
$ cd  freeswitch
$ git init
$ git config core.autocrlf false
$ git remote add origin git://git.freeswitch.org/freeswitch.git
$ git pull origin master

Что тут сделалось? Я создал пустую директорию, создал в ней пустой репозиторий, выключил в нём конвертирование, добавил репозиторий FreeSWITCH как “origin” и выкачал оттуда код. Теоретически, можно было поступить и иначе – глобально отключить конвертацию, выполнить клонирование репозитория, глобально включить конвертацию и локально выключить её для репозитория. Результат в целом должен быть тот же.

Сборка

Сразу скажу, что я использую не распоследнюю версию FreeSWITCH, а довольно специфичную – я буду вести свою бранчу, основанную на коммите

8f15bc7b45ade9e3737757be90b248c74828f414

времён конца августа’2011, потому что так надо. Описанный ниже процесс сборки будет применим и для распоследней версии (я надеюсь), могут измениться версии зависимостей.

Нам понадобится VC++ 2010 Express , которую можно свободно скачать с официального сайта.

После установки опционально ребутаем компьютер, потом запускаем VC++, открываем в ней файл “Freeswitch.2010.express.sln”, который объединяет в себе все студийные проекты FreeSWITCH. У меня при этом студия (хоть VC++ Express некорректно называть студией, но я так привык за много лет) ругнулось, что мол некоторые свойста проекта прочитать не смогла. Судя по всему, это не критично.

Следующим делом надо сменить конфигурацию сборки с “Debug” на “Release” в специально отведенном для этого выпадающем списке на панели инструментов где-то сверху – отладочная информация, включаемая в исполняемые файлы при использовании “Debug”, мне на данном этапе не нужна.

Готовы? Теперь жмём F7 или “Build Solution” из меню “Debug”. По истечении некоторого времени FreeSWITCH будет собран. Если один из 141 компилируемых проектов у вас не собрался, это, скорее всего, mod_managed – для поддержки расширений на дотнете. Он не собрался, потому что для него нужен дотнет и компилятор сишарпа. Мне он не нужен, а если вдруг понадобился вам – по ссылке есть инструкции.

Сегодня сборка у меня прошла удачно. Но вот в прошлый раз, когда я сидел на убертормозном соединении с Интернетом (меньше 2 КБ/с), я огрёб несколько неприятных проблем, о которых тоже тут расскажу.

Вот что может вас ожидать:

  1. Где-то посередине сборки студия ругнулась, что ``7za.exe не является исполняемым файлом’’. Находим в директории “libs/win32” указанный исполняемый файл, запускаем его вручную, получаем то же самое сообщение. Либо скачался битый архив, либо ещё чего, в общем решается эта проблема просто и брутально. Ставим 7-Zip, берём из установочной директории файл “7z.exe”, и подкладываем его в “libs/win32” вместо того проблемного (заранее переименовав). Всё.
  2. Не собираются различные проекты-зависимости. На медленном соединении серверы, с которых во время первой сборки происходит скачивание зависимостей, могут разрывать подключения по истечении какого-нибудь тайм-аута, или им просто надоедает стравливать большие файлы со скоростью в пару килобайт в секунду. В этом случае в директории “libs” наберется куча архивов, которое невозможно будет открыть. Ничего не остается, как вручную выкачать какой-нибудь более стабильной качалкой зависимости требуемых версий с используемых при сборке зеркал (их можно подглядеть в окне компиляции “Output”). Разумеется, потом все скачанные зависимости надо будет распаковать там же, в директории “libs”.

Заключение

Собранный и готовый к использованию FreeSWITCH, со всеми своими модулями, конфигами и звуковыми файлами, будет лежать в директории “Win32/Release”. Для запуска в продакшн осталось только поудалять оттуда многочисленные файлы типа .pdb, .lib и *.exp – для работы самого сервера они не нужны.

Стоит отдать должное разработчикам, ибо в отличие от многих, даже больших и популярных проектов, FreeSWITCH собирается и работает в Windows почти без проблем.