Openwrt新增定製一個軟體包
我深知前路風雨,但我依然微笑前行 ;)
Openwrt的Makefile流程異於一般常用的Makefile,閱讀起來難度太大。但是我麼可以先通過如何使用、修改Makefile開始,從Makefile的某個區域性開始瞭解,事情就會變得簡單許多。我們在開發定製Openwrt的時候,通常會給它新增某項功能。這裡介紹一下使用,新增軟體包(opkg線上安裝)、編譯出核心模組ko兩種方法完成功能的新增。(它們分別是使用者態、核心態)
使用者態與核心態的區別:簡單來說就是處於核心態的程式對於作業系統資源的訪問擁有更大的特權,對於某些操作可以直接呼叫資源;而不像使用者態的程式,訪問作業系統資源受到限制,而且是通過作業系統提供的介面來訪問資源。核心態程式可以執行得很快,但如果出錯則系統崩潰;使用者態程式與之相反。
[下面使用TOP_DIR表示Openwrt的住目錄]這裡先介紹如何使用新增軟體包(使用者態)形式新增功能的方法。本文的目錄結構安排如下所示:
-
package的所有原始碼都存放在本地
-
package的原始碼存放在因特網(和Openwrt做法相似)
-
package中新增patch來給軟體包打補丁
1、package的所有原始碼都存放在本地
首先我們要在TOP_DIR/package/utilks目錄下建立helloworld資料夾,然後建立兩個Makefile檔案外加一個helloworld.c共三個檔案。具體的目錄結構如下圖所示:
TOP_DIR/package/utils/helloworld------Makefile | --------src-------helloworld.c | ----------Makefile
檔案介紹
-
helloworld/Makefile:交給Openwrt工程Makefile呼叫,用於描述軟體包的各種資訊。主要作用是告訴Openwrt我的軟體包基本資訊(軟體包名、版本號、詳細介紹等等;如何編譯、安裝)
-
helloworld/src/helloworld.c:軟體包C原始碼
-
helloworld/src/Makefile:軟體包具體的編譯依賴描述,和我們平時寫的Makefile類似;
1.1首先建立helloworld資料夾,然後在目錄下建立Makefile(不要建立src資料夾以及目錄下的兩個檔案)。
該Makefile的內容如下所示:
include $(TOPDIR)/rules.mk PKG_NAME:=helloworld PKG_VERSION:=1 PKG_RELEASE:=1 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) include $(INCLUDE_DIR)/package.mk define Package/helloworld SECTION:=utils CATEGORY:=Utilities TITLE:=helloworld_xz endef define Package/helloworld/description show demo. endef define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ endef define Package/helloworld/install $(INSTALL_DIR) $(1)/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin endef $(eval $(call BuildPackage,helloworld))
此時軟體包的描述資訊新增完畢,此時在TOP_DIR目錄下執行make menuconfig,則會在Utilities選項下看到你的軟體包,如下圖所示:
將其前面選擇為M,則等會編譯工程時則會將其編譯成一個*.ipx軟體安裝包。
1.2新增src/helloworld.c、src/Makefile兩個檔案。
這兩個檔案的內容很簡單,和平時寫的簡單工程的C檔案以及Makefile沒有區別[這裡就不做詳細介紹]。
/* src/helloworld.c */
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
printf("zhangxingzhi hello world!\n");
return 0;
}
/* src/Makefile */
APP_NAME = helloworld
OBJ = helloworld.o
$(APP_NAME):$(OBJ)
$(CC) $^ -o [email protected] $(LDFLAGS)
%.o:%.c
$(CC) $(CFLAGS) -c $^
.PHONY:clean
clean:
rm $(OBJ) $(APP_NAME)
1.3將編譯生成的*.ipx,上傳到目標板上安裝執行
我生成的檔案是:TOP_DIR/bin/targets/brcm2708/bcm2710/packages/kmod-khello_4.4.112+1.0-1_arm_cortex-a53_neon-vfpv4.ipk【編譯時可以單獨編譯該模組,如果之前已經編譯好工具鏈,“make package/helloworld/compile V=99”】
- 使用scp命令即可將生成軟體包遠端複製到目標板
- 使用opkg install/remove即可安裝解除安裝軟體包