相似的文章其实网上比较多了,我写这个的目的: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
首先咱们新建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中的内容正确与否.
下一步咱们要建立一个新的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))
以下是最后的文件树形图:
第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文件,更具体地请参考
至此咱们的软件已经基本完成,下面进行编译
首先将文件文件夹拷贝到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方面的知识,恰好增强下这个方面的学习,欢迎交流~