
Компиляция/портирование своей программы под OpenWRT
Недавно мне понадобилось установить мою программу написанную на C(Си) на точку доступа под управлением OpenWRT. Уже была написана статья по сборке этой программы под Windows при помощи GCC из Cygwin. Для сборки же OpenWRT и всех поставляемых программ используется система сборки Buildroot и система пакетов ipkg. После долгих исследований OpenWrt Wiki и других сайтов найти актуальную документации не удалось. В итоге после сборки информации по крупицам я всетаки собрал пакет ipkg со своей программой. Дабы не пропасть приобретенным знаниям я решил написать данную статью.
Получение исходных кодов
Я собираю OpenWrt из исходных кодов ветки trunk. Получить её можно либо при помощи git:
git clone git://nbd.name/openwrt.git
Либо при помощи svn:
svn co svn://svn.openwrt.org/openwrt/trunk/ openwrt/
Как получить другие ветки, в том числе с пакетами, написано тут.
Подготовка к добаленю своего пакета
Переходим в полученный каталог
cd openwrt
и получаем так называетмые feeds(дополнительные пакеты). Получаемые feeds можно отредактировать в файле feeds.conf.default
./scripts/feeds update -a && ./scripts/feeds install -a
Потом выполняем комадну
make preq
И мы узнаем каких пакетов нехватает у нас в системе(в операционной системе)
Добавление своего пакета
Переходим в каталог package
cd package/
Создаем коталог под наш пакет(у меня он называется ecu)
mkdir ecu
Копируем исходники нашей программы. Я собираю простую программу которая собирается простым Makefile'ом
mkdir ecu/ecu-src/
cp -r моя_программа/* ecu/ecu-src/
Содержимое каталога ecu-src/
$ ls -R ecu-src/
ecu-src/:
Makefile srcecu-src/src:
crc.c crc.h main.c
Содержимое ecu-src/Makefile
cat ecu-src/Makefile
ecu: main.o crc.o $(CC) $(LDFLAGS) main.o crc.o -o ecu main.o: src/main.c src/crc.h $(CC) $(CFLAGS) -c src/main.c crc.o: src/crc.c $(CC) $(CFLAGS) -c src/crc.c clean: rm *.o ecu
Теперь на нужно интегрировать исходники с Makefile'ом в систему сбоки OpenWRT. Для этого нужно создать специальный Makefile в каталоге ecu/. Содержимое моего файла:
include $(TOPDIR)/rules.mk
PKG_NAME:=ecu
PKG_RELEASE:=1
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)include $(INCLUDE_DIR)/package.mk
define Package/ecu
SECTION:=utils
CATEGORY:=Utilities
TITLE:=Embedded clock updater
endef
define Package/ecu/description
Big comments....
...
endefdefine Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./ecu-src/* $(PKG_BUILD_DIR)/
endefdefine Package/ecu/install
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/ecu $(1)/bin/
endef$(eval $(call BuildPackage,ecu))
Сборка OpenWRT с добавленным пакетом пакетом
Переходим в корневой каталог openwrt/ и открываем menuconfig
make menuconfig
Далее выбираем все что нам нужно для дистрибутива( на эту тему есть статья) и самое главное наш новый пакет. Я добавил свою программу в секцию utils то я ищу её в ней
Выбираю, собирать отдельным пакетом:
Все, теперь выходим и запускаем сборку
make
или если у вас многоядерный процессор
make -jn
где n - колличество ядер + 1
А вот и наш пакетик
bin/ar71xx/packages/ecu_1_ar71xx.ipk
Возможные проблемы
Если в ходе сборки появляется это
...
make[3] -C package/ecu compile
make -r world: build failed. Please re-run make with V=99 to see what's going on
make: *** [world] Ошибка 1
то перезапускаем сборку с рекомендованным ключем(очень подробный вывод)
make V=99
и ждем, у меня, например была такая ошибка
...
src/main.c: In function 'main':
src/main.c:113:2: error: 'for' loop initial declarations are only allowed in C99 mode
src/main.c:113:2: note: use option -std=c99 or -std=gnu99 to compile your code
src/main.c:118:4: error: 'for' loop initial declarations are only allowed in C99 mode
...
не понравился синтаксис моего файла, я добавил рекомендуемый ключ компиляции, так:
cat package/ecu/ecu-src/Makefile
ecu: main.o crc.o $(CC) $(LDFLAGS) main.o crc.o -o ecu main.o: src/main.c src/crc.h $(CC) $(CFLAGS) -std=gnu99 -c src/main.c crc.o: src/crc.c $(CC) $(CFLAGS) -std=gnu99 -c src/crc.c clean: rm *.o ecu