`

openwrt加入自己的 package

 
阅读更多

1. 代码上来看有几个重要目录package, target, build_root, bin, dl....

---build_dir/host目录是建立工具链时的临时目录

---build_dir/toolchain-<arch>*是对应硬件的工具链的目录

---staging_dir/toolchain-<arch>* 则是工具链的安装位置

---target/linux/<platform>目录里面是各个平台(arch)的相关代码

---target/linux/<platform>/config-3.10文件就是配置文件了

---dl目录是'download'的缩写, 在编译前期,需要从网络下载的数据包都会放在这个目录下,这些软件包的一个特点就是,会自动安装在所编译的固件中,也就是我们make menuconfig的时候,为固件配置的一些软件包。如果我们需要更改这些源码包,只需要将更改好的源码包打包成相同的名字放在这个目录下,然后开始编译即可。编译时,会将软件包解压到build_dir目录下。

---而在build_dir/目录下进行解压,编译和打补丁等。

---package目录里面包含了我们在配置文件里设定的所有编译好的软件包。默认情况下,会有默认选择的软件包。在openwrt中ipk就是一切, 我们可以使用

$ ./scripts/feeds update来对软件包进行更新.

$ ./scripts/feeds search nmap 查找软件包'nmap'

 Search results in feed ’packages’: 
 nmap       Network exploration and/or security auditing utility 

 

$ ./scripts/feeds install nmap 安装'nmap'这个软件

$ make package/symlinks  //估计意思是更新软件源之类的

 

---bin目录下生成了很多bin文件,根据不同的平台来区分。另外bin/<platform>/package目录,里面有很多ipk后缀的文件,都是package目录下的源码在build_dir目录下编译后的生成的结果。

 

2. 新建自己的packages
对于自己新建的package,而这个package又不需要随固件一起安装,换句话说,就是可以当做一个可选软件包的话。我们可以利用我们的SDK环境来单独编译,编译后会生成一个ipk的文件包。然后利用 opkg install xxx.ipk 来安装这个软件。

 

下面具体说下,如何编译一个helloword的软件包。
(1)首先,编写helloworld程序
编写helloworld.c
/****************
* Helloworld.c
* The most simplistic C program ever written.
* An epileptic monkey on crack could write this code.
*****************/
#include <stdio.h>
#include <unistd.h>
int main(void)
{
     printf("Hell! O' world, why won't my code compile?\n\n");
     return 0;
}


编写Makefile文件
# build helloworld executable when user executes "make"
helloworld: helloworld.o
        $(CC) $(LDFLAGS) helloworld.o -o helloworld
helloworld.o: helloworld.c
        $(CC) $(CFLAGS) -c helloworld.c
# remove object files and executable when user executes "make clean"
clean:
        rm *.o helloworld
                                  
在这两个文件的目录下,执行make 应该可以生成helloworld的可执行文件。执行helloworld后,能够打印出“Hell!O' world, why won't my code compile?”。 这一步,主要保证我们的源程序是可以正常编译的。

 

下面我们将其移植到OpenWRT上。
(2)将OpenWrt-SDK-brcm47xx-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz2解压
tar –xvf OpenWrt-SDK-brcm47xx-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz2
(3)进入SDK
cd OpenWrt-SDK-brcm47xx-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1
可以看到里面的目录结构跟我们之前source的目录结构基本相同,所需要编译的软件包,需要放置在package目录下
(4)在package目录下创建helloworld目录
cd package
mkdir helloworld
cd helloworld
(5)创建src目录,拷贝 helloworld文件
mkdir src
cp /home/wrt/test/helloworld.c src
cp /home/wrt/test/Makefile src
(6)在helloworld目录下创建Makefile文件
这个Makefile文件是给OpenWRT读的,而之前写的那个Makefile文件是针对helloworld给编译其读的。两个Makefile不在同一层目录下。


touch Makefile
vim Makefile


Makefile文件模板内容如下:
##############################################
# OpenWrt Makefile for helloworld program
#
#
# Most of the variables used here are defined in
# the include directives below. We just need to
# specify a basic description of the package,
# where to build our program, where to find
# the source files, and where to install the
# compiled program on the router.
#
# Be very careful of spacing in this file.
# Indents should be tabs, not spaces, and
# there should be no trailing whitespace in
# lines that are not commented.
#
##############################################
include $(TOPDIR)/rules.mk
# Name and release number of this package
PKG_NAME:=helloworld
PKG_RELEASE:=1


# This specifies the directory where we're going to build the program. 
# The root build directory, $(BUILD_DIR), is by default the build_mipsel
# directory in your OpenWrt SDK directory
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)


include $(INCLUDE_DIR)/package.mk
 
# Specify package information for this program.
# The variables defined here should be self explanatory.
# If you are running Kamikaze, delete the DESCRIPTION
# variable below and uncomment the Kamikaze define
# directive for the description below
define Package/helloworld
        SECTION:=utils
        CATEGORY:=Utilities
        TITLE:=Helloworld -- prints a snarky message
endef


# Uncomment portion below for Kamikaze and delete DESCRIPTION variable above
define Package/helloworld/description
        If you can't figure out what this program does, you're probably
        brain-dead and need immediate medical attention.
endef
 
# Specify what needs to be done to prepare for building the package.
# In our case, we need to copy the source files to the build directory.
# This is NOT the default.  The default uses the PKG_SOURCE_URL and the
# PKG_SOURCE which is not defined here to download the source from the web.
# In order to just build a simple program that we have just written, it is
# much easier to do it this way.
define Build/Prepare
        mkdir -p $(PKG_BUILD_DIR)
        $(CP) ./src/* $(PKG_BUILD_DIR)/
endef


# We do not need to define Build/Configure or Build/Compile directives
# The defaults are appropriate for compiling a simple program such as this one


# Specify where and how to install the program. Since we only have one file,
# the helloworld executable, install it by copying it to the /bin directory on
# the router. The $(1) variable represents the root directory on the router running
# OpenWrt. The $(INSTALL_DIR) variable contains a command to prepare the install
# directory if it does not already exist.  Likewise $(INSTALL_BIN) contains the
# command to copy the binary file from its current location (in our case the build
# directory) to the install directory.
define Package/helloworld/install
        $(INSTALL_DIR) $(1)/bin
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/
endef


# This line executes the necessary commands to compile our program.
# The above define directives specify all the information needed, but this
# line calls BuildPackage which in turn actually uses this information to
# build a package.
$(eval $(call BuildPackage,helloworld))


(7)返回到SDK的根目录
执行make进行编译
编译过程会在build_dir目录下完成
编译结果会放在 bin/[yourtarget]/package目录下helloworld_1_bcm47xx.ipk
(8)上传helloworld_1_bcm47xx.ipk
上传helloworld_1_bcm47xx.ipk至路由器
执行# opkg install helloworld_1_bcm47xx.ipk
然后输入hello然后按Tab键,发现openwrt中已经有helloworld可执行命令。
执行 helloworld命令来查看程序的效果。
Hell! O' world, why won't my code compile?

 

分享到:
评论

相关推荐

    openwrt SDK, 利用SDK生成自己的ipk安装包

    openwrt SDK生成自己的ipk安装包 OpenWrt SDK是一个可再定位的、预编译好的OpenWrt工具链,适用于在不从头开始编译整个系统的前提下,针对一个特定平台交叉编译单个用户空间包。使用SDK的原因是为了保证二进制和...

    openwrt 根据自己路由器或硬件型号添加OPKG软件源地址和如何获取型号和芯片架构说明

    总的来说,了解自己的路由器型号和芯片架构,正确添加OPKG软件源,是充分利用OpenWRT功能的关键步骤。这不仅可以让你安装更多定制化的软件,还可以保持系统更新,提升设备性能。在操作过程中,务必遵循安全最佳实践...

    openwrt可用helloworld程序

    1. 创建源代码文件:在OpenWrt源码树的`package`目录下,新建一个目录,例如`hello-world`,并在其中创建`src`子目录和`Makefile`文件。`src`目录用于存放源代码,`Makefile`用于指示OpenWrt如何构建和打包这个程序...

    深入理解openwrt架构

    trunk目录是OpenWRT的源码目录,feeds目录存放的是扩展软件源列表,package目录存放的是扩展软件,build_dir目录是编译目录,staging_dir目录是交叉编译工具链的安装目录,bin目录存放的是最终的镜像文件。...

    OpenWrt搭建开发环境

    OpenWrt搭建开发环境 OpenWrt是一款开源的路由器固件,提供了高度可定制化和灵活性的解决方案。搭建OpenWrt开发环境是开发者和爱好者不可或缺的步骤。下面我们将详细介绍如何搭建OpenWrt开发环境。 1. 搭建开发...

    OpenWrt开发入门培训视频.zip

    8.OpenWRT Package结构分析。 9.如何移植、编写简单的软件。 10.OpenWRT UI框架发展历史讲解,石像鬼、X-WRT、Luci。 11.基于uhttpd,lua编写简单的UI界面,基于Luci编写简单的UI界面。 12.OpenWrt常用命令使用方法...

    OpenWrt 开发学习入门视频教程、OpenWrt 编译教程、从零开始学OpenWrt、跟着佐大学OpenWrt开发入门培训班-试听课

    '跟着佐大学OpenWrt开发入门培训班'适合学生、爱好者、职场新人,入门班主要作用是带大家梳理知点从整体上认识OpenWrt。授课方式采用的是观看预录的视频,你可以在任意时间段内观看。配合线上的答疑,可以让你更快的...

    Openwrt-package

    这个文件可能包含了软件包的元数据、源代码链接或其他相关信息,用户可以使用它来构建自己的OpenWrt镜像或者更新系统中的软件包。 关于JavaScript在OpenWrt中的应用,我们可以探讨以下几点: 1. **Node.js集成**:...

    OpenWrt 创建软件包

    OpenWrt 创建软件包是一个深度定制嵌入式Linux系统的必要步骤,它允许用户根据自己的需求构建个性化的固件。OpenWrt是一个轻量级、高度可裁剪的Linux发行版,广泛应用于路由器和其他嵌入式设备。通过创建自定义...

    openwrt编译框架分析1

    OpenWrt是一个强大的嵌入式Linux开发平台,其最初由Linsys基于Linux内核构建,主要用于路由器设备。它的核心优势在于其灵活的编译框架,该框架支持模块化,使得添加、删除或定制软件包变得简单易行。OpenWrt的这种...

    Openwrt 目录结构介绍

    4. **`package`**:存放了适用于 OpenWrt 系统的各种软件包及其对应的 Makefile 文件。这些文件定义了软件包的版本、下载地址、编译方式等信息。此外,通过运行 `./scripts/feed update -a` 和 `./scripts/feed ...

    openwrt的dl库

    它提供了高度可定制性和灵活性,使得用户能够自定义自己的固件,添加各种功能和服务。在这个场景中,"dl库"可能指的是OpenWRT固件构建过程中需要用到的动态链接库(Dynamic Link Libraries),这些库文件是系统运行...

    openwrt-解压后使用.gz

    openwrt-解压后使用.gz

    openwrt学习资料合集.rar

    这份笔记将帮助初学者理解如何使用该工具,定制自己的OpenWrt固件。 3. **Lua程序设计** `Lua程序设计(第二版).pdf`是一本关于Lua编程语言的书籍,Lua在OpenWrt中常用于编写脚本和配置。通过学习Lua,开发者可以更...

    packages-openwrt.zip

    OpenWRT的软件包系统借鉴了Debian的Apt(Advanced Package Tool)模型,但进行了简化和优化,以适应嵌入式设备的资源限制。OpenWRT的软件包管理系统称为Opkg,它负责安装、更新和卸载软件包。Opkg支持包依赖关系解析...

    openwrt-15.05_openwrt_

    这可能是OpenWrt 15.05的一个预编译虚拟机镜像,用户可以直接在虚拟机软件中运行,无需自己编译源代码,便于快速测试和开发。 通过研究和编译OpenWrt源代码,开发者可以自定义固件以满足特定需求,比如增强网络性能...

    openwrt知识总结 (开发教程+补丁 patch)

    OpenWRT知识总结(开发教程+补丁patch) ...OpenWRT提供了提交补丁的功能,开发者可以使用这个功能来提交自己的补丁并帮助OpenWRT的开发。提交补丁需要了解如何contributing、哪里listen和talk、何时提交补丁等。

    OpenWrt之helloworld程序

    OpenWrt是一个轻量级的Linux发行版,主要用于嵌入式设备,如路由器。它提供了高度可定制的软件环境,允许用户根据需求编译和安装各种软件包。在这个"OpenWrt之helloworld程序"中,我们将探讨如何在OpenWrt环境中编写...

    7500固件刷openwrt

    固件刷写是IT领域中路由器定制化的重要环节,OpenWrt是一个开源的嵌入式操作系统,常用于无线路由器的个性化改造。本文将详细介绍如何在7500V2型号的路由器上刷写OpenWrt固件,以及涉及到的相关技术知识点。 首先,...

    K2P刷openwrt

    它提供了高度自定义性和强大的功能,允许用户根据自己的需求对路由器进行深度定制,例如提升网络性能、增强安全设置、添加额外的服务等。 在进行K2P刷openwrt的过程中,你需要了解以下几个关键知识点: 1. **固件...

Global site tag (gtag.js) - Google Analytics