Створення пакета з вашої програми
Це третій розділ серії “Hello, world!” для OpenWrt. На цьому етапі ви вже повинні були виконати такі дії:
- Підготували середовище розробки
- Налаштували та зібрали інструменти й крос-компілятор
- Додали `PATH` для доступу до утиліт
- Створили просту програму “Hello, world!” засобами нативної компіляції
Якщо ви пропустили щось із вищенаведеного, перегляньте попередні розділи.
Створення власного джерела пакетів (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 виходить за межі цього розділу, але коментарі пояснюють основні частини.
Існує багато способів описати збірку пакета — це лише один із них. Ми навмисно використовуємо явні змінні та інструкції, щоб показати структуру. У реальних проектах іноді достатньо значно менше.
Підсумок
У цьому розділі ми:
- Створили власне локальне джерело пакетів (`mypackages`)
- Додали до нього простий пакет `helloworld`
- Створили Makefile-маніфест із назвами, версією, описом та командами для збірки і встановлення
У наступному розділі ми додамо цей пакет у систему збірки OpenWrt та скомпілюємо його.