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