类似的文章其实网上比较多了,我写这个的目的:
1,网上文章良莠不齐,有些自己都没实际动手操作,随便复制粘贴,实际操作不可行.
2,基本只讲了操作,我当时最关心的Makefile文件的解释没有.
所以我自己总结了一篇.
开发板为MT7620a,openwrt版本为:barrier_breaker_14.07.编译主机为ubuntu 14.04 32位.
git clone git://git.openwrt.org/14.07/openwrt.git
关于怎么搭建编译环境以及编译请参考网上
下面我们开始,我们遵循传统以helloworld开始.
首先我们新建helloworld.c文件和对应的Makefile文件
$mkdir -p ~/temp/hellworld/src
$cd ~/temp/helloworld/src
$touch helloworld.c Makefile
如下为helloworld.c的内容:
#include
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
下面可以输入$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))
如下是最后的文件树形图:
include $(TOPDIR)/rules.mk
$(BUILD_DIR)
,
$(INCLUDE_DIR)
,
$(CP)
,
$(INSTALL_DIR)
,
$(INSTALL_BIN)
都是这里定义的.具体内容可以到源码主目录下,查看
rules.mk
文件.
include $(INCLUDE_DIR)/package.mk
$(INCLUDE_DIR)/Kernel.mk
文件对于软件包为内核时不可缺少,
$(INCLUDE_DIR)/package.mk
应用在用户态。接下来讲述用户态软件包。用户程序的编译包以
Package/
开头,然后接着软件名,在Package定义中的软件名可以与软件包名不一样,而且可以多个定义。
helloworld
utils
menuconfig
中的位置;有时还会有
SUBMENU
项,即子目录.
menuconfig
中.
make menuconfig
中
INSTALL_DIR:=install -d -m0755
: 创建所属用戶可读写、执行,其他用戶可读可执行的目录
INSTALL_BIN:=install -m0755
: 编译好的文件到镜像文件目录
$(eval $(call BuildPackage,helloworld))
$(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方面的知识,刚好加强下这个方面的学习,欢迎交流~