OpenWRT開(kāi)發(fā)之創(chuàng)建軟件包(openwrt創(chuàng)建文件夾)
OpenWRT二次開(kāi)發(fā)時(shí)總免不了開(kāi)發(fā)自己的軟件包。本文介紹如何在OpenWRT中創(chuàng)建一個(gè)新的軟件包。
首先創(chuàng)建軟件包所在的目錄,在openwrt根目錄中執(zhí)行:
mkdir -p package/mypackages/helloworld
這里的mypackages目錄和helloworld目錄都是新建的,helloworld就是我們本次新建的軟件包的包名。我們后續(xù)可以將自己創(chuàng)建的包都放在mypackages目錄下。
helloworld包的目錄結(jié)構(gòu)如下:
helloworld├── Makefile #openwrt’s package manifest file└── src ├── helloworld.c #helloworld source code └── Makefile #helloworld’s makefile
package manifest file
即軟件包helloworld目錄下的Makefile文件。例子以及注釋如下:
# 導(dǎo)入通用編譯規(guī)則include $(TOPDIR)/rules.mk# name和version用來(lái)定義編譯目錄名$(PKG_BUILD_DIR)]PKG_NAME:=helloworldPKG_VERSION:=1.0PKG_RELEASE:=1#PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) # 也可以直接定義編譯目錄名,代替默認(rèn)的目錄名# 導(dǎo)入包定義include $(INCLUDE_DIR)/package.mk# 包定義:定義我們的包在menuconfig中的位置# Makefile中的define語(yǔ)法可以理解為函數(shù),用于定義命令集合define Package/helloworld SECTION:=examples CATEGORY:=Examples TITLE:=helloworld, learn from example.endef# 包描述:關(guān)于我們包的更詳細(xì)的描述define Package/helloworld/description A simple helloworld example, my first openwrt package example.endef# 編譯準(zhǔn)備. 必須使用tab縮進(jìn),表示是可執(zhí)行的命令define Build/Prepare echo "Here is Build/Prepare" mkdir -p $(PKG_BUILD_DIR) cp ./src/* $(PKG_BUILD_DIR)/endef# 安裝define Package/helloworld/install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/usr/binendef# 這一行總是在最后$(eval $(call BuildPackage,helloworld))
上面的例子中沒(méi)有定義define Build/Compile,表示使用默認(rèn)的Compile命令。默認(rèn)的Compile行為就是在$(PKG_BUILD_DIR)目錄下執(zhí)行make命令。
helloworld.c及其Makefile
helloworld.c內(nèi)容如下:
#include<stdio.h>int main(void){ printf("Hello world!n"); printf("This is my first package!n"); return 0;}
與helloworld.c同目錄的Makefile內(nèi)容如下:
TARGET = helloworldOBJS = helloworld.o$(TARGET):$(OBJS) $(CC) $(LDFLAGS) -o $@ $^%.o: %.c $(CC) $(CFLAGS) -c $< -o $@.PHONY: cleanclean: rm -f $(TARGET) $(OBJS)
說(shuō)明:這里的$(CC)、$(CFLAGS)、$(LDFLAGS)都是由OpenWRT的build系統(tǒng)賦值的,CC就是目標(biāo)平臺(tái)對(duì)應(yīng)的交叉編譯工具鏈里的gcc。
測(cè)試
在OpenWRT根目錄下運(yùn)行make menuconfig,可以看到多出來(lái)一個(gè)”Examples —>”菜單,按回車進(jìn)去后可以看到我們新建的”helloworld” 包。 (從這里也可以看出,在執(zhí)行make menuconfig時(shí),OpenWRT會(huì)自動(dòng)掃描package目錄以及其子目錄下所有的包。)
選中這個(gè)”helloworld”包。然后再OpenWRT根目錄下執(zhí)行:
make package/helloworld/compile V=s
此命令即為OpenWRT單package編譯命令。
通過(guò)log,可以看到我們的包編譯成功。編譯目錄為 build_dir/target-XXXX/helloworld-1.0
如果要再次編譯,可以執(zhí)行:
make package/helloworld/{clean,compile} V=s
本文源碼見(jiàn): https://github.com/jian-soft/openwrt-package-example
參考文章:
- https://openwrt.org/docs/guide-developer/packages
- https://openwrt.org/zh-cn/doc/devel/packages
- https://openwrt.org/docs/guide-developer/toolchain/use-buildsystem
- https://openwrt.org/docs/guide-developer/helloworld/start
- https://github.com/mwarning/openwrt-examples