Компиляция/портирование своей программы под 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  src

ecu-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....
...
endef

define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./ecu-src/* $(PKG_BUILD_DIR)/
endef

define 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

Теги: , , ,

Дата: 23 декабря 2011

Автор: andreykyz

Комментарии: 8

Комментарии: 8

  1. если я положу свои файлы в /files/usr/sbin файл mpcs_ext а так же в /files/etc/init.d файл mpcs_init и в /files/etc/config файл network и соберу прошивку,будут ли они лежать в этих папках на роутере или так не правильно ?

  2. что то не правильно как то , почему то по стиралась директория trunk перед путями

  3. отвечаю сам себе,всё замечательно... добавляются

  4. Не хочу ставить под сомнение статью, но в 2010 уже был толковый ман по сборке пакетов тут http://synology-forum.ru/wiki/index.php/%D0%9A%D0%B0%D0%BA_%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C_ipk_%D0%BF%D0%B0%D0%BA%D0%B5%D1%82_%D0%BD%D0%B0_%D0%B4%D0%B5%D1%81%D0%BA%D1%82%D0%BE%D0%BF%D0%B5

  5. Зачем собирать всю прошивку, если можно собрать отдельно пакет: make package/ecu/compile V=99?

Оставить комментарий

*

Комментарий:

Ваш e-mail не будет опубликован.
Обязательные поля помечены *

Разрешенные HTML теги:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>