yujietian 发表于 2017-11-24 19:04:55

[OpenWrt]编译记录3

创建packageOpenWRT有自己的应用程序体系,也就是package,我们可以查看下package里的应用程序andygao@andygao-VirtualBox:~/openwrt$ ls package/
base-files boot devel feeds firmware kernel libs Makefile network ralink-wifi-mt76x8 system utils那么我们创建自己的应用程序的方法就是在package创建自己的文件夹创建gGateway目录切换到package目录并创建gGateway文件夹。$cd package/
$mkdir gGateway切换到gGateway文件夹下,创建文件夹files和src,并创建Makefile文件编辑Makefile我们先来看看我创建的makefile文件andygao@andygao-VirtualBox:~/openwrt/package/gGateway$ cat Makefile include $(TOPDIR)/rules.mkPKG_NAME:=gGatewayPKG_VERSION:=2.5.0PKG_RELEASE:=1PKG_BUILD_DIR:= $(BUILD_DIR)/$(PKG_NAME)include $(INCLUDE_DIR)/package.mkdefine Package/gGateway SECTION:=gGateway CATEGORY:=Extra packages TITLE:=gGateway DEPENDS:=+libc +libpthreadendefdefine Package/gGateway/description        gGateway for OpenWRTendefdefine Build/Prepare        mkdir -p $(PKG_BUILD_DIR)        $(CP) ./src/* $(PKG_BUILD_DIR)/endefdefine Build/Compile        $(MAKE) -C $(PKG_BUILD_DIR) $(TARGET_CONFIGURE_OPTS)endefdefine Package/gGateway/install        $(INSTALL_DIR) $(1)/usr/bin/ $(1)/usr/lib/        $(INSTALL_BIN) $(PKG_BUILD_DIR)/objs/gizwits $(1)/usr/bin/        $(INSTALL_BIN) $(PKG_BUILD_DIR)/objs/libgGateway.so $(1)/usr/lib/endef$(eval $(call BuildPackage,gGateway))我们再一部分一部分的进行说明include $(TOPDIR)/rules.mkinclude $(INCLUDE_DIR)/package.mk这2个文件是makefile的一些子文件,里面包含了很多makefile需要的变量。由这些makefile子文件确立软件包加入OpenWrt的方式和方法。$(TOPDIR)/rules.mk一般在Makefile的开头,$(INCLUDE_DIR)/package.mk一般在软件包的基本信息完成后再引入。还有另外一个$(INCLUDE_DIR)/kernel.mk文件,对于软件包为内核时不可缺少。PKG_NAME:=gGatewayPKG_VERSION:=2.5.0PKG_RELEASE:=1PKG_BUILD_DIR:= $(BUILD_DIR)/$(PKG_NAME)这里定义了package的一些信息,包括名称,版本号,编译目录等,详细介绍参考后面的参考链接。define Package/gGateway SECTION:=gGateway CATEGORY:=Extra packages TITLE:=gGateway DEPENDS:=+libc +libpthreadendefdefine Package/gGateway/description        gGateway for OpenWRTendef这两部分定义了package的一些描述信息,描述的是该package在make menuconfig时的位置及显示信息。需要重点强调一下的是DEPENDS,后面的包为多个时必须以空格进行分离,在前面加"+"表示该package被选中时,自动选择依赖package,"+"与依赖package之间不能有空格。SECTION,包类型,没有使用,可不定义。define Build/Prepare        mkdir -p $(PKG_BUILD_DIR)        $(CP) ./src/* $(PKG_BUILD_DIR)/endef编译准备的一些操作,自己开发的package需要修改这部分(一般也无需修改),OpenWRT下一般把自己设计的程序放到src目录下。define Build/Compile        $(MAKE) -C $(PKG_BUILD_DIR) $(TARGET_CONFIGURE_OPTS)endef编译时的一些操作,一般使用默认即可。OpenWRT目录的CFLAGS等变量可以在这里引用。define Package/gGateway/install        $(INSTALL_DIR) $(1)/usr/bin/ $(1)/usr/lib/        $(INSTALL_BIN) $(PKG_BUILD_DIR)/objs/gizwits $(1)/usr/bin/        $(INSTALL_BIN) $(PKG_BUILD_DIR)/objs/libgGateway.so $(1)/usr/lib/endef安装包ipk安装时执行的操作,这部分需要根据自己的程序进行修改。$(eval $(call BuildPackage,gGateway))完成package定义后调用eval函数实现各种定义。其他说明1、makefile文件每行不能有空格。2、执行语句必须以tab开头,非执行语句不可以用tab开头。编译package编译准备需要删除tmp目录,然后使用make menuconfig。$cd ~/openwrt$rm -rf tmp$make menuconfig该步骤不是必须的,package的编译会自动检索Makefile的修改$cd ~/openwrt$make在根目录下对源码进行编译,如果关心编译的具体过程,可使用make V=s。但是整个编译的时间较长,为了提高调试效率也可以针对某个package进行编译。$make package/gGateway/compile V=s清除编译文件$make package/gGateway/clean V=s说明1、package是否必须选中(make menuconfig 时选中'M'或'*')才可以单独编译package,并没有进行验证。2、tab键并不会自动补齐package名称及命令,需要手写。参考资料https://wiki.openwrt.org/doc/devel/packageshttp://blog.csdn.net/teddy99999/article/details/17537545http://blog.csdn.net/lichao_ustc/article/details/42805631
页: [1]
查看完整版本: [OpenWrt]编译记录3