Добрый день, хабрапользователи!
Выкладываю небольшую шпаргалку по настройке WebRTC + Eclipce 4.3 + ubuntu 13.10. Это может быть полезно тем, кто решил попробовать себя в написании кода на С++ для webrtc.
Скажу сразу, что у Google есть неплохая документация для того, чтобы настроить среду программирования и начать пользоваться. Но к сожалению, у меня каждый раз уходит очень много времени на установку всего этого. Не каждый же день приходится устанавливать все по новому. Поэтому решил поделиться опытом, может кому-то она поможет сэкономить пару суток. На ubuntu до версии 12.10 почти всегда все ставилось хорошо и сразу начинало работать. Но недавно вышла версия 13.10 и тут начались еще большие проблемы. На установку гугл-кода пришлось потратить пол-дня. А что делать, тому кто только начал разбираться?
Получение кода
Итак, начнем. Первым делом нужно установить depot_tools
$ mkdir ~/webrtc
$ cd ~/webrtc
$ wget https://src.chromium.org/svn/trunk/tools/depot_tools.zip
Далее распаковывем скаченный архив в этот же каталог. И теперь нам нужно прописать пути к этой папке:
$ export PATH="$PATH":/home/username/webrtc/depot_tools
$ export CHROMIUM_ROOT = /home/username/webrtc/ #Не знаю правда зачем, но у меня сейчас так. Может и не нужно
И заодно дабавляем тоже самое в свой .bashrc, чтобы после перезагрузки переменные восстанавливались:
$ sudo nano ~/.bashrc
Добавляем те же самые строки. Конечно же «username» нужно заменить на свое имя пользователя:
export PATH="$PATH":/home/username/webrtc/depot_tools
export CHROMIUM_ROOT = /home/username/webrtc
Далее проверяем все ли правильно сделано:
$ gclient --version
gclient.py 0.7
Если верно, то должны увидеть версию клиента. Если нет, то скорее всего не установлен python. Нужно установить его.
Итак, gclient заработал и теперь нужно скачать исходники. Возвращаемся в директорию webrtc и скачиваем:
$ gclient config http://webrtc.googlecode.com/svn/trunk
$ gclient sync --force
Скачиваться будет долго. После того как закачалось, нужно установить gyp:
$ sudo apt-get install gyp
Установили gyp, переходим к установке необходимых требований для компиляции исходников. Для этого в скаченной нами ранне папке есть скрипт install-build-deps.sh. Запускаем его:
$ sudo ~/webrtc/trunk/build/install-build-deps.sh
И нам показывают неприятное сообщение: ERROR: Only Ubuntu 12.04 (precise) through 13.04 (raring) are currently supported. Не беда, апгрейдим скрипт. Находим строку 55 приводим ее к такому виду:
ubuntu_versions="12.04|12.10|13.04|13.10"
Заново запускаем скрипт install-build-deps.sh. Начнется установка необходимых программ и библиотек.
Теперь находясь в директории ~/webrtc/ запускаем gclient с другими парамерами:
$ gclient runhooks --force
Если появилась ошибка:
File "<string>", line 1, in <module>
AssertionError: Point $JAVA_HOME or the java_home gyp variable to a directory containing include/jni.h!
gyp: Call to 'python -c "import os; dir=os.getenv('JAVA_HOME', '/usr/lib/jvm/java-6-sun'); assert os.path.exists(os.path.join(dir, 'include/jni.h')), 'Point $JAVA_HOME or the java_home gyp variable to a directory containing include/jni.h!'; print dir"' returned exit status 1.
То устанавливаем openjdk-6-jdk и прописываем пути:
$ sudo apt-get install openjdk-6-jdk
$ sudo ln -s /usr/lib/jvm/java-6-openjdk-amd64 /usr/lib/jvm/java-6-sun
$ export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64
$ echo "export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64" >> ~/.bashrc
На всякий случай добавляем, для того чтобы у нас сгенерировался Makefile:
$ echo "export GYP_GENERATORS=make" >> ~/.bashrc
Запускаем последний раз
$ gclient sync --force
$ gclient runhooks --force
И убеждаемся, что был создан Makefile в директории ~/webrtc/trunk/
Импорт в Eclipse и компиляция
Теперь можно запускать Eclipse и импортировать проект по этой инструкции: LinuxEclipseDev (Раздел «Install the C Development Tools (»CDT")")
Теперь, когда создали проект, пробуем его собрать.
Ошибка 1
У меня самая первая ошибка показала строки, содержащие:
narrowing conversion of ‘rate’ from ‘int’ to ‘uint32_t []
Для этого изменил файл webrtc/modules/rtp_rtcp/interface/rtp_payload_registry_unittest.cc, в нем функцию:
ModuleRTPUtility::Payload* ExpectReturnOfTypicalAudioPayload(
uint8_t payload_type, int rate)
на
ModuleRTPUtility::Payload* ExpectReturnOfTypicalAudioPayload(
uint8_t payload_type, uint32_t rate)
Ошибка 2
В следющей ошибке было:
... -Werror=extra ...
Файл /webrtc/trunk/webrtc/build/common.gypi у
Удалить строку 179
179: '-Wextra',
Файл /webrtc/trunk/build/common.gypi
Строка 3875
Изменить
3875: 'GCC_TREAT_WARNINGS_AS_ERRORS': 'YES', # -Werror
На
3875: 'GCC_TREAT_WARNINGS_AS_ERRORS': 'NO', # -Werror
И чуть ниже строка 3882, удалить ее:
3882: '-Wextra',
Ошибка 3
Сообщение вроде этого:
/webrtc/talk/app/webrtc/java/jni/peerconnection_jni.cc:113:7: note: in definition of macro ‘CHECK’
Добавляем в файл /webrtc/talk/app/webrtc/java/jni/peerconnection_jni.cc:
#include <unistd.h>
Ошибка n
Дальше уже не стал исправлять ошибки компилятора в unittest-ах гугла и вообще выклчил их компиляцию в файле webrtc/trunk/all.gyp.
#'talk/libjingle_tests.gyp:*',
В итоге, в папке /home/udaf/rabbit/webrtc/trunk/out/Debug/ появились скомпилированные примеры, среди которых набольший интерес представляют: peerconnection_client и peerconnection_server
Коротко о Gyp
Гугл-код для компиляции использует gyp. В .gyp файлах можно управлять компиляцией приложений. Например можно подключить сторонние библиотеки к своему коду вот так:
'cflags': [
'-I/usr/local/include -I/usr/local/include/cppconn -fexceptions',
],
'link_settings': {
'ldflags': [
'<!@(pkg-config --libs gtk+-2.0 gmodule-2.0 gthread-2.0 libavcodec libavformat libavutil libswscale)',
'-lmysqlcppconn'
],
'libraries': [
'-ldl',
'-lmysqlcppconn'
],
},
Ссылки
- www.webrtc.org/reference/getting-started — Получение кода WebRTC
- www.webrtc.org/reference/getting-started/prerequisite-sw — Установка требуемых программ и библиотек, необходимых для компиляции WebRTC
- sites.google.com/a/chromium.org/dev/developers/how-tos/depottools — Установка и использование depot_tools
- code.google.com/p/chromium/wiki/LinuxEclipseDev — Настройка Eclipse
- code.google.com/p/gyp/wiki/GypUserDocumentation — Использование и синтаксис gyp.
Автор: udaf