Пример стороннего приложения
Данный пример демонстрирует как подключить к сборке сторонний проект с открытым кодом.
Для примера разберем добавление редактора 'nano'
Как и в случае с другими приложениями, необходимо добавить описание модуля
package third_party.cmd
@App
@AutoCmd
@Build(stage=2,script="$(EXTERNAL_MAKE)")
@Cmd(name = "nano",
help = "Text editor",
man = '''
NAME
nano - Nano's ANOther editor
SYNOPSIS
nano [OPTIONS] [[+LINE,COLUMN] FILE]...
AUTHORS
Ilia Vaprol - Adaptation for Embox
''')
module nano {
source "^BUILD/extbld/^MOD_PATH/install/nano.o"
@NoRuntime depends embox.compat.posix.regex
depends embox.compat.posix.LibCurses
}
Отличием описание данного модуля от описания обычного приложения являются два аспекта:
- Наличие аннотации @Build позволяющего задать некоторые детали процесса сборки модуля
- В качестве файла исходного кода используется объектный файл
Аннотация @Build
Аннотация @Build позволяет задавать некоторые детали процесса сборки модуля к которому применена данная аннотация.
Стадия сборки
Сборка Embox происходит в несколько стадий. Некоторые модули требуют предварительно подготовленного окружения. Например, если модулю требуются стандартная библиотека и собранные библиотеки из внешних репозиторий. Опция stage позволяет задать стадию сборки. Нулевая стадия включает в себя сборку стандартной библиотеки и ядра ОС. Начиная с первой стадии используется компилятор в котором в качестве библиотек используются собранные библиотеки с нулевой стадии. Вторая стадия используется для приложений которым требуется какое то собранное окружение.
Задание внешнего скрипта сборки
С помощью аннотации @Build можно задавать свои правила для сборки. В том числе можно указать, часто используемый Makefile который позволяет задавать три цели (configure, build, install) (по аналогии с configure, make, make install). Для использования в качестве опции к аннотации нужно использовать
script="$(EXTERNAL_MAKE)"
При использовании данного скрипта происходит выполнение makefile находящегося в данной директории.
Для того чтобы использовать разработанные скрипты упрощающие включение стороннего приложение можно использовать скрипт EXTBLD_LIB. Для этого необходимо включить эту библиотеку в makefile
...
include $(EXTBLD_LIB)
...
При подключении происходит скачивание архива, проверка контрольной суммы md5, накладывание патчей и затем выполнение целей
$(CONFIGURE) :
...
$(BUILD) :
...
$(INSTALL) :
...
для использования данного скрипта необходимо задать несколько переменных:
- PKG_SOURCES - название пакета
- PKG_VER - версия пакета
- PKG_SOURCES - url для скачивания
- PKG_MD5 - контрольная сумма md5
- PKG_PATCHES - список файлов с патчами для наложения на оригинальные исходники
PKG_NAME := nano
PKG_VER := 2.2.6
PKG_SOURCES := http://www.nano-editor.org/dist/v2.2/$(PKG_NAME)-$(PKG_VER).tar.gz
PKG_MD5 := 03233ae480689a008eb98feb1b599807
PKG_PATCHES := pkg_patch.txt
include $(EXTBLD_LIB)
$(CONFIGURE) :
...
цель $(CONFIGURE), должна перейти с директорию с распакованными и пропатчеными исходниками и затем вызвать configure с требуемыми параметрами:
$(CONFIGURE) :
export EMBOX_GCC_LINK=full; \
cd $(PKG_SOURCE_DIR) && ( \
./configure --host=$(AUTOCONF_TARGET_TRIPLET) \
--target=$(AUTOCONF_TARGET_TRIPLET) \
--enable-tiny \
--disable-shared \
--disable-static \
--disable-largefile \
--disable-rpath \
--disable-nls \
--disable-extra \
--disable-browser \
--disable-help \
--disable-justify \
--disable-mouse \
--disable-operatingdir \
--disable-speller \
--disable-tabcomp \
--disable-wrapping \
--disable-wrapping-as-root \
--disable-color \
--disable-multibuffer \
--disable-nanorc \
--disable-glibtest \
CC=$(EMBOX_GCC) \
)
touch $@
цель $(BUILD) должна перейти в папку с исходниками и вызвать make если требуется передать дополнительные флаги.
$(BUILD) :
cd $(PKG_SOURCE_DIR) && ( \
$(MAKE) MAKEFLAGS='$(EMBOX_IMPORTED_MAKEFLAGS)'; \
)
touch $@
цель $(INSTALL), должна скопировать результаты сборки в папку для дальнейшей обработки в составе Embox (линковка в конечном образе или использование заголовочных файлов)
$(INSTALL) :
cp $(PKG_SOURCE_DIR)/src/nano $(PKG_INSTALL_DIR)/nano.o
touch $@
Включение объектных файлов
В конечный образ Embox включаются только те файлы которые указаны в описании модуля, а не все файлы которые получились в процессе сборки стороннего проекта. Таким образом объектный файл представляющий из себя приложение nano и скопированный в цели $(INSTALL) описанного выше Makefile не будет использоваться, если это не описано в модуле с помощью ключевого слова source:
...
module nano {
source "^BUILD/extbld/^MOD_PATH/install/nano.o"
...
}
В окончательный образ Embox включается бинарный код команды nano и если требуется, линкуется с конечным образом