openwrt的package目录下存放着系统使用的一写软件包,现在来尝试自己编写一个简单的软件包,然后把它编译进系统中
1、在package目录下创建一个新的文件夹hello
2、在hello文件夹下创建Makefile
3、创建src文件夹,用来存放我们的源码
4、进入src文件夹,创建文件hello.c和Makefile
回到上一层,编写Makefile
#
# Copyright (C) 2006-2008 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
#添加系统的一些文件,里面有定义好的变量
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
#软件包的名字
PKG_NAME:=hello
#版本
PKG_VERSION:=1.0
#makefile版本
PKG_RELEASE:=1
#编译之后存放的路径
PKG_BUILD_DIR:= $(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
#定义包的属性
define Package/hello
SECTION:=utils #包的种类
CATEGORY:=Utilities #在menuconfig下的目录
TITLE:= myy-hello #标题
endef
define Package/bridge/description
my package hello for openwrt #描述
endef
#编译准备,创建目录,这个目录中包含的变量在引入的文件中被定义
#其实就是在build_dir目录下创建hello目录,并把src下的文件全部拷贝过去
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
#安装,编译好的文件存放的地方
define Package/hello/install
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/hello $(1)/bin/
endef
#使用BuildPackage宏来编译hello软件包
$(eval $(call BuildPackage,hello))
src下的文件 hello.c
#include <stdio.h>
int main()
{
printf("HELLO \n");
return 0;
}
Makefile
all : hello
.PHONY : all
hello : hello.o
$(CC) -o $@ $<
%.o : %.c
$(CC) -c $<
clean:
rm hello hello.o
到这里就完成了,按照网上的提示接下来执行make menuconfig就可以看到自己的软件包hello,然后选择,make即可。但是,事情总不会这么一帆风顺,执行make menuconfig发现在Utilities目录下并没有刚才创建的软件包的信息,然后我就去看别的已经被选择上的软件包中的Makefile文件,看看我是否遗漏了哪里,找了很久,并没有什么发现,虽然我的Makefile很简单,但是该有的地方都有,按道理它是不会出现这样的问题,接下来的时间我又去查看各种配置文件,我也把配置文件中的hello软件包的开关配置添加进去了(y),然而还是没有。万般无奈之际发现了一个隐藏文件.config,在这个文件里并没有我配置的编译选项,也就是说和之前在别的配置文件中写的配置选项并没有生效,于是我打算单独编译这个软件包
make package/hello/compile -j1 V=s
果然出现了问题,按照提示打开了/logs/package/hello/dump.txt
报这些错我也不知道什么意思,我之前是按照别人的Makefile去改的,如是我从别人的Makefile里把这几行复制过来,奇迹般的编译成功了,接下来执行
make menuconfig
hello终于出现了,然后选择,保存退出,执行make,发现hello确实被编译进了系统
烧写新的系统,测试
之前创建了PKG_BUILD_DIR目录,并把src目录下的文件都拷贝过去了,来看看这个文件究竟在哪里
在build_dir目录下的target中发现了hello文件夹,里面有src的全部文件,还有一些编译生成的文件
还有编译安装后的可执行文件被放在了bin目录下,在bin/package下发现了编译好的ipk软件包