在網上找了一下,不少關於編譯Openwrt系統的資料,不過這些事情芯片廠商提供的開發包都已經辦得妥妥了,可是沒有找到系統介紹的資料,添加一個包的介紹有很少,其中有兩個頗有參考價值:html
http://blog.csdn.net/lj627889343/article/details/7997463linux
http://kamikaze.openwrt.org/docs/openwrt.html#x1-460002.1.2shell
詳細步驟以下:網絡
在package目錄下建立模塊目錄my_module,內含:app
Makefile 用於創建於OpenWRT的聯繫,成爲OpenWRT的一個包ide
src 包含本身的代碼ui
src/hello.c 源代碼.net
src/Makefile 源代碼的Makefilehtm
後續將主要講解一下目前的系統Makefile的理解:blog
include $(TOPDIR)/rules.mk 必須包含
#include $(INCLUDE_DIR)/kernel.mk 內核模塊包含,目前不須要
PKG_NAME:=my_module 包名稱,在menuconfig顯示
PKG_VERSION:=0.0.1 包版本號
PKG_BASE_NAME:=my_module 包名稱,在build_dir下面建立PKG_BASE_NAME-PKG_VERSION目錄,用於存放源代碼
#PKG_SOURCE:=$(PKG_BASE_NAME)-$(PKG_VERSION).tar.gz
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_BASE_NAME)-$(PKG_VERSION) 指定代碼存放路徑
#PKG_RELEASE:=1
#PKG_SOURCE_URL:=http://localhost
PKG_BUILD_DEPENDS:=
PKG_BIN_DIR= 上面註釋了三項,是爲了避免讓OpenWRT去下載代碼(而從本地拷貝代碼,見後面說明)
include $(INCLUDE_DIR)/package-version-override.mk 不知道幹嗎用,應該是必定要的
include $(INCLUDE_DIR)/package.mk 不知道幹嗎用,應該是必定要的
ifeq ($(DUMP),) 不知道幹嗎用
STAMP_CONFIGURED:=$(strip $(STAMP_CONFIGURED))_$(shell $(SH_FUNC) grep '^CONFIG_GPON_' $(TOPDIR)/.config | md5s)
endif
define Package/$(PKG_NAME) 用於設置menuconfig的選項
SECTION:=application 不知道幹嗎用,相似的選項有net/sys/driver...應該是linux系統的分類
CATEGORY:=teddy menuconfig頂級目錄
TITLE:=the first module by teddy 本包的目錄項說明(目錄項名稱即包名稱)
URL:=http://www.teddy.com/ 不知道幹嗎用,估計用處不大
MAINTAINER:=teddy 不知道幹嗎用,估計用處不大
DEPENDS:= 依賴的包,還不會用
MENU:=1 目錄項使能,若是若是基礎模塊能夠設爲0
endef
define Package/$(PKG_NAME)/description 不知道幹嗎用,估計用處不大
Teddy's First Package On OpenWRT.
endef
define Package/$(PKG_NAME)/config 結合config/Config.in設置比較複雜的目錄項,能夠不用
menu "detail configurations" 第一個選項,由開發人員自行設置
depends on PACKAGE_$(PKG_NAME)
source "$(SOURCE)/config/Config.in"
endmenu
$(call Package/$(PKG_NAME)/override_version) 第二個選項,由系統提供,應該是另外指定版本號
$(call Package/$(PKG_NAME)/override_source_path) 第三個選項,有系統提供,應該是另外指定代碼存放路徑的
endef
CONFIGURE_ARGS +=
ifeq ($(CONFIG_mips),y) 不知道幹嗎用
CONFIGURE_ARGS += --enable-add_drv_cflags="-fno-pic -mno-abicalls -mlong-calls -G 0"
endif
define Build/Prepare 這個很關鍵,在上面取消了從網絡下載,由這裏的語句將src的代碼拷到指定位置
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
define Build/Clean 清除語句,沒用過
@- rm -Rf $(PKG_BUILD_DIR)/ipkg*
@- [ -e $(PKG_BUILD_DIR)/Makefile ] && $(MAKE) -C $(PKG_BUILD_DIR) clean
$(call Build/Clean/Default)
endef
define Package/$(PKG_NAME)/install 忘記幹嗎用的了,好像是用來建立目錄的,沒有這句會致使編譯不過
$(INSTALL_DIR) $(1)/$(PKG_BIN_DIR)
endef
$(eval $(call BuildPackage,$(PKG_NAME))) 必須
另外還能夠建立
config/Config.in
用於細節定義,如
menu "macros" config FIRST_MACRO 這裏的config值能夠被Makefile使用,可是尚未發現源代碼能夠用 bool "first macro defined in my module" default y config SECOND_MACRO bool "second macro defined in my module" default yendmenu