openwrt簡單ipk生成及Makefile解釋

前言

相似的文章其實網上比較多了,我寫這個的目的:php

1,網上文章參差不齊,有些本身都沒實際動手操做,隨便複製粘貼,實際操做不可行.
2,基本只講了操做,我當時最關心的Makefile文件的解釋沒有.html

因此我本身總結了一篇.git


說明

開發板爲MT7620a,openwrt版本爲:barrier_breaker_14.07.編譯主機爲ubuntu 14.04 32位.
git clone git://git.openwrt.org/14.07/openwrt.git
關於怎麼搭建編譯環境以及編譯請參考網上ubuntu


正文

下面咱們開始,咱們遵循傳統以helloworld開始.bash

1.建立helloworld項目

首先咱們新建helloworld.c文件和對應的Makefile文件函數

$mkdir -p ~/temp/hellworld/src
$cd ~/temp/helloworld/src
$touch helloworld.c Makefile

以下爲helloworld.c的內容:學習

#include <stdio.h>
int main()
{
    printf("This is my helloworld!\n");
    return 0;
}

以下爲Makefile文件的內容:網站

helloworld : helloworld.o
    $(CC) $(LDFLAGS) helloworld.o -o helloworld

helloworld.o : helloworld.c
    $(CC) $(CFLAGS) -c helloworld.c

clean :
    rm *.o helloworld

$(CC)
: 這個值由其餘Makefile文件規定,表示咱們使用編譯器.ui

$(LDFLAGS)&$(CFLAGS)
: 這個表示編譯器的一些選項,這裏是可選的,去掉也沒有問題..net

下面能夠輸入$make看看有沒有問題,注意Makefile文件的書寫格式.
最後,輸入$make clean來清理掉生成的二進制文件.由於上一步make所使用的編譯器並非咱們的交叉編譯鏈,生成的二進制文件並不能在開發板中運行.上一步只是驗證咱們的src中的內容正確與否.


2.建立helloworld包

下一步咱們要建立一個新的Makefile文件,在這個文件中咱們要描述的是helloworld包的信息,好比:如何配置,如何編譯,如何打包,安裝位置等.

$cd ~/temp/helloworld
$touch Makefile

以下爲Makefile內容:

include $(TOPDIR)/rules.mk

PKG_NAME:=helloworld
PKG_RELEASE:=1
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk

define Package/helloworld
    SECTION:=utils
    CATEGORY:=Utilities
    TITLE:=Helloworld -- prints a snarky message
endef

define Package/helloworld/description
    It's my first package demo.
endef

define Build/Prepare
    echo "Here is Package/Prepare"
    mkdir -p $(PKG_BUILD_DIR)
    $(CP) ./src/* $(PKG_BUILD_DIR)/
endef

define Package/helloworld/install
    echo "Here is Package/install"
    $(INSTALL_DIR) $(1)/bin
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/
endef
    
$(eval $(call BuildPackage,helloworld))

以下是最後的文件樹形圖:
樹形圖


3.Makefile註釋

第1行include $(TOPDIR)/rules.mk
: 通常在Makefile的開頭,包含了包的基本信息,好比Makefile中的$(BUILD_DIR),$(INCLUDE_DIR),$(CP),$(INSTALL_DIR),$(INSTALL_BIN)都是這裏定義的.具體內容能夠到源碼主目錄下,查看rules.mk文件.

3~5行,軟件包的信息均以「PKG_」開頭,其意思和做用以下
: PKG_NAME:軟件包名稱,將在menuconfig和ipkg能夠看到。
PKG_VERSION:軟件版本號。
PKG_RELEASE:Makefile的版本號
PKG_SOURCE:源代碼的文件名。
PKG_SOURCE_URL:源代碼的下載網站位置。
PKG_MD5SUM:源代碼文件的效驗碼。用於覈對軟件包是否下載正確。
PKG_CAT:源代碼文件的解壓方法。包括zcat, bzcat, unzip等。
PKG_BUILD_DIR:軟件包編譯目錄。它的父目錄爲$(BUILD_DIR)。

第7行include $(INCLUDE_DIR)/package.mk
: 通常在軟件包的基本信息完成後再引入,他定義了用戶態軟件包的規則。編譯包分爲用戶態和內核模塊,用戶態軟件包使用Package,內核模塊使用KernelPackage.$(INCLUDE_DIR)/Kernel.mk文件對於軟件包爲內核時不可缺乏,$(INCLUDE_DIR)/package.mk應用在用戶態。接下來說述用戶態軟件包。用戶程序的編譯包以Package/開頭,而後接着軟件名,在Package定義中的軟件名能夠與軟件包名不同,並且能夠多個定義。

9~13行
: 定義包的名稱爲helloworld
SECTION : 包的類型爲utils
CATEGORY : 目錄爲Utilitis,即文件在menuconfig中的位置;有時還會有SUBMENU項,即子目錄.
TITLE : 用於軟件包的簡短描述,將顯示在menuconfig中.
URL : 軟件包的下載位置。
MAINTAINER : 維護者選項。
DEPENDS : 與其餘軟件的依賴。即如編譯或安裝須要其餘軟件時須要說明。若是存在多個依賴,則每一個依賴需用空格分開。依賴前使用+號表示默認顯示,即對象沒有選中時也會顯示,使用@則默認爲不顯示,即當依賴對象選中後才顯示。

15~17行
: 軟件包的詳細描述,將顯示在make menuconfig

19~23行
: 編譯準備方法,對於網上下載的軟件包不須要再描述。對於非網上下載或自行開發的軟件包必須說明編譯準備方法。本文所用的準備方法就是首先建立軟件包目錄,而後將源碼拷貝到剛剛建立的目錄中。按OpenWrt的習慣,通常把本身設計的程序所有放在src目錄下。

25~29行
: 軟件包的安裝方法,包括一系列拷貝編譯好的文件到指定位置。調用時會帶一個參數,就是嵌入系統的鏡像文件系統目錄,所以$(1)表示嵌入系統的鏡像目錄。
INSTALL_DIR:=install -d -m0755 : 建立所屬用戶可讀寫、執行,其餘用戶可讀可執行的目錄
INSTALL_BIN:=install -m0755 : 編譯好的文件到鏡像文件目錄

31行 $(eval $(call BuildPackage,helloworld))
: 完成前面定義後,必須使用eval函數實現各類定義。其格式爲:
對於通常軟件包:$(eval $(call Package,$(PKG_NAME)))
或對於內核模塊:$(eval $(call KernelPackage,$(PKG_NAME)))
若是一個軟件包有多個程序,例如:一個應用程序有本身的內核模塊,上面使用的PKG_NAME須要靈活變通。eval函數可能設計多個。也能夠當成多個軟件包處理。

這裏簡單地解釋了Makefile文件,更具體地請參考


4.編譯軟件

至此咱們的軟件已經基本完成,下面進行編譯
首先將文件文件夾拷貝到openwrt目錄中的package文件中,這裏個人源碼目錄爲~/openwrt,你須要把openwrt目錄替換爲你的openwrt源碼目錄.

$mv ~/temp/helloworld ~/openwrt/package

而後回到項目主目錄運行make menuconfig

$cd ~/openwrt
$make menuconfig

按"/"後,輸入helloworld,搜索對應的路徑
搜索
搜索結果

接着到Utilities目錄下,找到helloworld並按空格打開;
打開編譯開關
保存後退出;

$cd ~/openwrt
$make package/helloworld/compile V=s

編譯完成後,ipk應該已經生成

$find bin/ -name "helloworld*.ipk"

至此咱們已經生成簡單的ipk,恭喜:)
最後能夠經過winscp,將ipk安裝到開發板中.
結局


尾記

我比較薄弱的是Makefile方面的知識,恰好增強下這個方面的學習,歡迎交流~

相關文章
相關標籤/搜索