OpenWrt是一个比较完善的嵌入式Linux开发平台,在无线路由器应用上已有100多个软件包。人们可以在其基础上增加软件包,以扩大其应用范围。

2.1、准备工作

OpenWrt在增加软件方面极其方便,按照OpenWrt的约定就可以很简单完成。加入的软件包可以是网上下载的开源软件或自行开发的软件。加入软件包需要在package目录下创建一个目录。然后创建一个Makefile与OpenWrt建立联系,Makefile需要遵循OpenWrt的约定。另外可以创建一个patchs目录保存patch文件,对下载的源代码进行修改。

由于本文所建立的模块是基于luci的,所以在OpenWrt的“package/feeds/luci”目录下建立“szloogson”目录。

2.2、模块Makefile

在“szloogson”目录下建立一个“Makefile”文件,该文件的如下所示:

点击(此处)折叠或打开

#

# Copyright (C) 2010-2014 Davied Huang Wich

#

# This is free software, licensed under the GNU General Public License v2.

# See /LICENSE for more information.

#

include $(TOPDIR)/rules.mk

PKG_NAME:=luci-app-szloogson

PKG_VERSION=1.0

PKG_RELEASE:=1

PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk

define Package/luci-app-szloogson

SECTION:=luci

CATEGORY:=LuCI

SUBMENU:=3. Applications

TITLE:=shenzhou loogson for LuCI

PKGARCH:=all

endef

define Package/luci-app-njitclient/description

This package contains LuCI configuration pages for shenzhou loogson.

endef

define Build/Prepare

mkdir -p $(PKG_BUILD_DIR)

$(CP) ./src/* $(PKG_BUILD_DIR)/

endef

define Build/Configure

endef

define Build/Compile

$(MAKE) -C $(PKG_BUILD_DIR) \

CC="$(TARGET_CC)" \

CROSS_COMPILE="$(TARGET_CROSS)" \

ARCH="$(ARCH)"

endef

define Package/luci-app-szloogson/install

#install shell

$(INSTALL_DIR) $(1)/etc/init.d

$(INSTALL_BIN) ./files/loogson.init $(1)/etc/init.d/loogson

#install config

$(INSTALL_DIR) $(1)/etc/config

$(INSTALL_CONF) ./files/loogson.config $(1)/etc/config/loogson

#install execute bin

$(INSTALL_DIR) $(1)/usr/sbin

$(INSTALL_BIN) $(PKG_BUILD_DIR)/gsc3280_led $(1)/usr/sbin/gsc3280_led

#install luci

mkdir -p $(1)/usr/lib/lua/luci/controller/admin

$(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller

$(INSTALL_DATA) ./src/luci/controller/admin/loogson.lua $(1)/usr/lib/lua/luci/controller/admin/loogson.lua

mkdir -p $(1)/usr/lib/lua/luci/model/cbi/admin_loogson

$(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi

$(INSTALL_DATA) ./src/luci/model/cbi/admin_loogson/* $(1)/usr/lib/lua/luci/model/cbi/admin_loogson/

endef

$(eval $(call BuildPackage,luci-app-szloogson)

说明:

2.2.1、第8行“$(TOPDIR)/rules.mk”

“$(TOPDIR)/rules.mk”一般在Makefile的开头,定义一些包的基本信息。

软件包的信息均以“PKG_”开头,其意思和作用如下:

PKG_NAME:软件包名称,将在menuconfig和ipkg可以看到。

PKG_VERSION:软件版本号。

PKG_RELEASE:Makefile的版本号

PKG_SOURCE:源代码的文件名。

PKG_SOURCE_URL:源代码的下载网站位置。@SF表示在sourceforge网站,@GNU表示在GNU网站,还有@GNOME、@KERNEL。获取方式可以为:git、svn、cvs、hg、bzr等。有关下载方法可参考$(INCLUDE_DIR)/download.mk和$(SCRIPT_DIR)

/download.pl。由于本文使用的是自己开发的代码,所以没有此项。

PKG_MD5SUM:源代码文件的效验码。用于核对软件包是否下载正确。

PKG_CAT:源代码文件的解压方法。包括zcat, bzcat, unzip等。

PKG_BUILD_DIR:软件包编译目录。它的父目录为$(BUILD_DIR)。如果不指定,默认为$(BUILD_DIR)/$( PKG_NAME)-$( PKG_VERSION)。

还有一些有关源代码的定义如下:

PKG_SOURCE_SUBDIR

PKG_SOURCE_PROTO

PKG_SOURCE_MIRROR

PKG_MIRROR_MD5SUM

PKG_SOURCE_VERSION 2.2.2、第17行“include $(INCLUDE_DIR)/package.mk”

“include $(INCLUDE_DIR)/package.mk”一般在软件包的基本信息完成后再引入,他定义了用户态软件包的规则。

编译包分为用户态和内核模块,用户态软件包使用Package,内核模块使用KernelPackage。“$(INCLUDE_DIR)/kernel.mk”文件对于软件包为内核时不可缺少,“$(INCLUDE_DIR)/package.mk”应用在用户态。接下来讲述用户态软件包。用户程序的编译包以“Package/”开头,然后接着软件名,在Package定义中的软件名可以与软件包名不一样,而且可以多个定义。

2.2.3、第19行”define Package/luci-app-szloogson

包的名称为”luci-app-szloogson“。

接下来定义的包括:

SECTION:包的类型,预留。

CATEGORY:分类,在menuconfig的菜单下将可以找到。

SUBMENU:包在make menuconfig的位置,此处即在”LuCi/3. Applications“下。

TITLE:用于软件包的简短描述,将显示在”make menuconfig“中。

DESCRIPTION:用于软件包的详细描述,已放弃使用。如果使用DESCRIPTION将会提示“error DESCRIPTION:= is obsolete, use Package/PKG_NAME/description”。

URL:软件包的下载位置。

MAINTAINER:维护者选项。

DEPENDS:与其他软件的依赖。即如编译或安装需要其他软件时需要说明。如果存在多个依赖,则每个依赖需用空格分开。依赖前使用+号表示默认显示,即对象沒有选中时也会显示,使用@则默认为不显示,即当依赖对象选中后才显示。

2.2.4、第27行”define Package/luci-app-szloogson/description“

软件包的详细描述,取代前面提到的DESCRIPTION详细描述。此处定义的信息将显示在”make menuconfig“中。

2.2.5、第31行”define Build/Prepare“

编译准备方法,对于网上下载的软件包不需要再描述。对于非网上下载或自行开发的软件包必须说明编译准备方法。本文所用的准备方法就是首先创建软件包目录,然后将源码拷贝到刚刚创建的目录中。按OpenWrt的习惯,一般把自己设计的程序全部放在src目录下。

2.2.6、第36行"define Build/Configure”

Build/Configure:在Automake中需要进行“./configure”,所以本配置方法主要针对需要配置的软件包而设计,一般自行开发的软件包可以不在这里说明。本文设计的package由自己写makefile,所以此处没有定义。

2.2.7、第39行”define Build/Compile“

编译方法,没有特别说明的可以不予以定义。如果不定义将使用默认的编译方法Build/Compile/Default。

自行开发的软件包可以考虑使用下面的定义:点击(此处)折叠或打开

define Build/Compile

$(MAKE) -C $(PKG_BUILD_DIR) \

$(TARGET_CONFIGURE_OPTS) CFLAGS="$(TARGET_CFLAGS) -I$(LINUX_DIR)/include"

Endef        本文此处指定了交叉编译器和体系结构。

2.2.8、第46行”define Package/luci-app-szloogson/install“

软件包的安装方法,包括一系列拷贝编译好的文件到指定位置。调用时会带一个参数,就是嵌入系统的镜像文件系统目录,因此$(1)表示嵌入系统的镜像目录。一般可以采用下面的方法:点击(此处)折叠或打开

define Package/luci-app-szloogson/install

$(INSTALL_DIR) $(1)/usr/bin

$(INSTALL_BIN) $(PKG_BUILD_DIR)/gsc3280_led $(1)/usr/sbin/

endef   INSTALL_DIR、INSTALL_BIN在”$(TOPDIR)/rules.mk“文件中定义,所以本Makefile必须引入$(TOPDIR)/rules.mk文件。

INSTALL_DIR :=install -d -m0755:创建所属用戶可读写、执行,其他用戶可读可执行的目录。

INSTALL_BIN:=install -m0755:编译好的文件到镜像文件目录。

安装文件放在files子目录下,不要与源代码文件目录“src”混在一起,以提高可读性。

如果用户态软件在boot时要自动运行,则需要在安装方法说明中增加自动运行的脚本文件安装和配置文件安裝方法。

例如:

点击(此处)折叠或打开

define Package/luci-app-szloogson/install

#install shell

$(INSTALL_DIR) $(1)/etc/init.d

$(INSTALL_BIN) ./files/loogson.init $(1)/etc/init.d/loogson

#install config

$(INSTALL_DIR) $(1)/etc/config

$(INSTALL_CONF) ./files/loogson.config $(1)/etc/config/loogson

endef

使用清晰的文件扩展名,更方便安裝识别文件。

Package/$(PKG_NAME)/preinst

软件包安装前处理方法,使用脚本语言,因此定义的第一行需要下面的格式

#!/bin/sh:调用时带入的参数为嵌入式系统的镜像目录。

Package/$(PKG_NAME)/postinst:软件包安装后处理方法,使用脚本语言。

Package/$(PKG_NAME)/prerm:软件包删除前处理方法,使用脚本语言

Package/$(PKG_NAME)/postrm:软件包删除后处理方法,使用脚本语言

程序接下来安装luci文件。

2.2.9、第66行”$(eval $(call BuildPackage,luci-app-szloogson))“

完成前面定义后,必须使用eval函数实现各种定义。其格式为:

对于一般软件包:$(eval $(call Package,$(PKG_NAME)))

或对于内核模块:$(eval $(call KernelPackage,$(PKG_NAME)))

如果一个软件包有多个程序,例如:一个应用程序有自己的内核模块,上面使用的“PKG_NAME”需要灵活变通。eval函数可能设计多个。也可以当成多个软件包处理。

2.2.10、本文没有用到的

Package/$(PKG_NAME)/conffiles:本包安装的配置文件,一行一个。如果文件结尾使用“/”,则表示为目录。用于备份配置文件说明,在sysupgrade命令执行时将会用到。

2.3、内核模块包定义

Linux分为内核态和用户态。开发者开发的内核部分可以直接加入Linux的Kernel程序,也可以生成内核模块以便需要时装入内核。OpenWrt一般希望开发者生成内核模块,在Linux启动后自动装载或手工使用insmod命令装载。内核模块使用“KernelPackage”开头,其他与一般软件包基本相同。

在内核模块定义中增加“SUBMENU”表示子菜单位置,在“$(INCLUDE)/kernel.mk”对内核模块定义了CATEGORY为kernel

modules,所以内核模块在menuconfig中的主菜单为kernel modules,然后有下一级子菜单$(SUBMENU)。在子菜单下可以看到以kmod-$(

PKG_NAME)项目。

DEFAULT表示直接编入内核或产生内核模块,y表示直接编入内核,m表示产生内核模块。

AUTOLOAD表示自动装入内核,一般表示方法为:

AUTOLOAD:=$(call AutoLoad, $(PRIORITY),$(AUTOLOAD_MODS))

AutoLoad的第一个参数$(PRIORITY)为优先级,01为最优先,99为最后装载。有关自动装载可以在/etc/modules.d目录下看到,第二个参数$(AUTOLOAD_MODS)模块名,每个模块名以空格符分隔。即可同时装载多个内核模块。

在开发过程最好不要使用自动装载,需经过严格调试后再使用,可以减轻调试的工作量。

用户态的软件包中沒有内核模块的“AUTOLOAD”参数。如果软件需要在boot时自动运行,则需要在“/etc/init.d”增加相应的脚本文件。

脚本文件需要START参数,说明在boot时的优先级,如果在boot启动后再启动,则需要STOP参数。如果STOP参数存在,其值必须大于START。由“/etc/rc.d/S10boot”知道,装载内核模块的优先级为10,需要使用自己设计的内核模块的程序其START的值必须大于10。同样由“/etc/rc.d/S40network”知道,使用网络通信的程序其START的值必须大于40。

api文档 luci_openwrt中luci学习笔记相关推荐

  1. Dom4j 解析Xml文档及 XPath查询 学习笔记

    2019独角兽企业重金招聘Python工程师标准>>> 本文查阅方法:     1.查阅目录 -- 查阅本文目录,确定想要查阅的目录标题     2.快捷"查找" ...

  2. Dom4j 解析Xml文档及XPath查询 学习笔记

    本文查阅方法:     1.查阅目录 -- 查阅本文目录,确定想要查阅的目录标题     2.快捷"查找" -- 在当前浏览器页面,按键 "Ctrl+F" 按键 ...

  3. Sphinx文档的展示-个人学习笔记

    文章目录 背景介绍 环境搭建 1.申请一台服务器 2.安装环境 3.ssh登录 4.安装HTTP服务 5.浏览器访问 背景介绍 在学习了[How TO]-如何使用Sphinx编写漂亮的文档一问之后,我 ...

  4. api文档 luci_研究LuCI - 技术手札 - OSCHINA - 中文开源技术交流社区

    OpenWrt里有微型的 http 服务器,叫 uhttpd. 可执行文件在 /usr/sbin/uhttpd,对应的配置文件是 /etc/config/uhttpd.打开这个文件: 里面指定的网页的 ...

  5. cocos2d python文档_【Cocos2D-X 学习笔记】Cocos2D-x 3.0+VS开发环境搭建[使用Python]

    上一节讲了如何用VS自带的项目管理器创建项目,该方法只适用于cocos2d-x 2.0版本,而cocos2d-x 3.0较之前版本在命名等方面有了较大更新,而cocos2d-x3.0不再支持用VS项目 ...

  6. 错过就找不到了 Java API文档 免费下载!!!

    今天上Java课学习到了Java Swing 听说它可是有很多的方法的呦,书上说为了避免罗列类中的大量方法,所以读者在学习本章时要善意查阅Java提供的类库帮助文档,所以找了好久找到了很多资源但同时也 ...

  7. 在ASP.NET Core Web API上使用Swagger提供API文档

    我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的API文档功能.当设置IISExpress的默认启动路由到Swagger的API文档页 ...

  8. admin.php生成地址,FastAdmin命令行一键生成API文档

    一键生成API文档 FastAdmin中的一键生成API文档可以在命令行或后台一键生成我们API接口的接口测试文档,可以直接在线模拟接口请求,查看参数示例和返回示例. 准备工作 请确保你的API模块下 ...

  9. Java基础--API文档是什么

    API文档是什么? 开发一个大型软件时,需要定义成千上万的类,而且需要很多人参与开发.每个人都会开发一些类,并在类里面定义一些方法,成员变量提供给其他人使用.但其他人怎么知道如何使用这些类和方法呢? ...

  10. FreeMarker中文帮助手册API文档,基础入门学习文档

    FreeMarker中文帮助手册API文档,基础入门学习文档 分类: 编程技术 发布: bywei 浏览: 7 日期: 2011年5月28日 分享到: QQ空间 新浪微博 腾讯微博 人人网 什么是Fr ...

最新文章

  1. 并发下常见的加锁及锁的PHP具体实现-转载
  2. 打印两个有序链表的公共部分
  3. 20211005 Hermite矩阵及几个性质
  4. Spring4 MVC + REST + List + Bootstrap 简单示例
  5. hadoop join之semi join
  6. Spring核心知识点总结
  7. 基于Ymodem协议的IAP上位机(C#)
  8. MySQL中Packet for query is too large (1327736 1048576)错误
  9. 经纬财富:渭南炒现货白银的七条做单习惯
  10. 免费拥有个人云主机——AWS免费EC2套餐
  11. openssh8.3p1 RPM 升级
  12. 软件实习-学生管理系统
  13. http的常见错误代码
  14. 台式计算机配置什么音响好,用什么办法才能让台式的电脑不用音响就有声音
  15. linux服务器安装vncserve过程记录
  16. Java多线程实现的四种方式
  17. 林业数字孪生打造实时树木“管家”
  18. 将PDF转换成html的操作步骤
  19. 灰度处理与二值化的关系
  20. Python 的itchat 的微信文件传输助手和朋友性别,签名,所在城市分析

热门文章

  1. 基于MAX2671设计的400Mhz混频器
  2. Goldendict 及其词典详述
  3. 电脑启动盘引导丢失怎么办
  4. [导入]陈冠希蛰伏35天后闪电复出 将与舒淇演爱情片
  5. Banner设计技巧总结
  6. 【第三方互联】14、Github授权第三方登录
  7. LAMP 技术简介(2)
  8. python 模仿excel中的‘删除重复项’功能,根据某行删除二维数组的重复项,但不使用drop_duplicates’函数实现
  9. jena 查询 java_Java调用Jena写SPARQL查询
  10. 2021年4月程序员工资统计排行