Table of Contents

Створення пакета з вашої програми

Це третій розділ серії “Hello, world!” для OpenWrt. На цьому етапі ви вже повинні були виконати такі дії:

Якщо ви пропустили щось із вищенаведеного, перегляньте попередні розділи.

Створення власного джерела пакетів (package feed)

Система збірки OpenWrt повністю орієнтована на пакети. Практично все в ній — це пакети: від інструментів та крос-компілятора до ядра Linux, модулів, утиліт та програм, що будуть інстальовані на цільовий пристрій.

Тож абсолютно логічно застосувати цей самий підхід і для програми “Hello, world!”.

Механізм доставки сторонніх пакетів — це джерело пакетів (package feed). Це просто каталог (локальний, спільний чи з репозиторію Git), у якому зберігаються пакети-кандидати для включення у прошивку. Цей підхід дозволяє зберігати логіку створення пакета окремо від основного коду.

У цьому прикладі ми створимо локальний репозиторій `mypackages`, у якому буде категорія `examples`, і лише один пакет — `helloworld`:

cd /home/buildbot
mkdir -p mypackages/examples/helloworld

Створення маніфесту пакета

Кожен пакет у OpenWrt описується Makefile-маніфестом. Цей файл містить опис пакета, місце знаходження вихідного коду, інструкції для збірки та встановлення, а також (за потреби) залежності та додаткові скрипти.

Щоб наш застосунок став пакетом — створимо для нього `Makefile`:

cd /home/buildbot/mypackages/examples/helloworld
touch Makefile

Вставте наступний вміст у файл `Makefile` за допомогою вашого текстового редактора:

⚠️ УВАГА: У цьому файлі важливо використовувати справжні табуляції для деяких рядків — `make` не працює зі звичайними пробілами. Деякі редактори (наприклад, VS Code або Notepad++) можуть автоматично замінювати табуляції на пробіли — вимкніть це в налаштуваннях!

Makefile
include $(TOPDIR)/rules.mk
 
# Назва, версія та реліз
PKG_NAME:=helloworld
PKG_VERSION:=1.0
PKG_RELEASE:=1
 
# Розташування вихідного коду
SOURCE_DIR:=/home/buildbot/helloworld
 
include $(INCLUDE_DIR)/package.mk
 
# Опис пакета — як він з’явиться в меню make menuconfig
define Package/helloworld
  SECTION:=examples
  CATEGORY:=Examples
  TITLE:=Hello, World!
endef
 
# Більш докладний опис пакета
define Package/helloworld/description
  A simple "Hello, world!" -application.
endef
 
# Підготовка до збірки — створення build-каталогу та копіювання коду
define Build/Prepare
		mkdir -p $(PKG_BUILD_DIR)
		cp $(SOURCE_DIR)/* $(PKG_BUILD_DIR)
		$(Build/Patch)
endef
 
# Компіляція — спочатку збираємо .o, потім лінкуємо у виконуваний файл
define Build/Compile
		$(TARGET_CC) $(TARGET_CFLAGS) -o $(PKG_BUILD_DIR)/helloworld.o -c $(PKG_BUILD_DIR)/helloworld.c
		$(TARGET_CC) $(TARGET_LDFLAGS) -o $(PKG_BUILD_DIR)/$1 $(PKG_BUILD_DIR)/helloworld.o
endef
 
# Встановлення — створюємо каталог usr/bin та копіюємо туди виконуваний файл
define Package/helloworld/install
		$(INSTALL_DIR) $(1)/usr/bin
		$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/usr/bin
endef
 
# Завершення — побудова пакета на основі наведених вище правил
$(eval $(call BuildPackage,helloworld))

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

Існує багато способів описати збірку пакета — це лише один із них. Ми навмисно використовуємо явні змінні та інструкції, щоб показати структуру. У реальних проектах іноді достатньо значно менше.

Підсумок

У цьому розділі ми:

У наступному розділі ми додамо цей пакет у систему збірки OpenWrt та скомпілюємо його.