前言

类似的文章其实网上比较多了,我写这个的目的:

1,网上文章良莠不齐,有些自己都没实际动手操作,随便复制粘贴,实际操作不可行.

2,基本只讲了操作,我当时最关心的Makefile文件的解释没有.

所以我自己总结了一篇.


说明

开发板为MT7620a,openwrt版本为:barrier_breaker_14.07.编译主机为ubuntu 14.04 32位.

git clone git://git.openwrt.org/14.07/openwrt.git

关于怎么搭建编译环境以及编译请参考网上


正文

下面我们开始,我们遵循传统以helloworld开始.

1.创建helloworld项目

首先我们新建helloworld.c文件和对应的Makefile文件

  1. $mkdir -p ~/temp/hellworld/src
  2. $cd ~/temp/helloworld/src
  3. $touch helloworld.c Makefile

如下为helloworld.c的内容:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. printf("This is my helloworld!\n");
  5. return 0;
  6. }

如下为Makefile文件的内容:

  1. helloworld : helloworld.o
  2. $(CC) $(LDFLAGS) helloworld.o -o helloworld
  3. helloworld.o : helloworld.c
  4. $(CC) $(CFLAGS) -c helloworld.c
  5. clean :
  6. rm *.o helloworld
$(CC)
这个值由其他Makefile文件规定,表示我们使用编译器.
$(LDFLAGS)&$(CFLAGS)
这个表示编译器的一些选项,这里是可选的,去掉也没有问题.

下面可以输入$make看看有没有问题,注意Makefile文件的书写格式.

最后,输入$make clean来清理掉生成的二进制文件.因为上一步make所使用的编译器并不是我们的交叉编译链,生成的二进制文件并不能在开发板中运行.上一步只是验证我们的src中的内容正确与否.


2.创建helloworld包

下一步我们要创建一个新的Makefile文件,在这个文件中我们要描述的是helloworld包的信息,比如:如何配置,如何编译,如何打包,安装位置等.

  1. $cd ~/temp/helloworld
  2. $touch Makefile

如下为Makefile内容:

  1. include $(TOPDIR)/rules.mk
  2. PKG_NAME:=helloworld
  3. PKG_RELEASE:=1
  4. PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
  5. include $(INCLUDE_DIR)/package.mk
  6. define Package/helloworld
  7. SECTION:=utils
  8. CATEGORY:=Utilities
  9. TITLE:=Helloworld -- prints a snarky message
  10. endef
  11. define Package/helloworld/description
  12. It's my first package demo.
  13. endef
  14. define Build/Prepare
  15. echo "Here is Package/Prepare"
  16. mkdir -p $(PKG_BUILD_DIR)
  17. $(CP) ./src/* $(PKG_BUILD_DIR)/
  18. endef
  19. define Package/helloworld/install
  20. echo "Here is Package/install"
  21. $(INSTALL_DIR) $(1)/bin
  22. $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/
  23. endef
  24. $(eval $(call BuildPackage,helloworld))

如下是最后的文件树形图:


3.Makefile注释

第1行include $(TOPDIR)/rules.mk
一般在Makefile的开头,包含了包的基本信息,比如Makefile中的$(BUILD_DIR),$(INCLUDE_DIR),$(CP),$(INSTALL_DIR),$(INSTALL_BIN)都是这里定义的.具体内容可以到源码主目录下,查看rules.mk文件.
3~5行,软件包的信息均以“PKG_”开头,其意思和作用如下
PKG_NAME:软件包名称,将在menuconfig和ipkg可以看到。

PKG_VERSION:软件版本号。

PKG_RELEASE:Makefile的版本号

PKG_SOURCE:源代码的文件名。

PKG_SOURCE_URL:源代码的下载网站位置。

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

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

PKG_BUILD_DIR:软件包编译目录。它的父目录为$(BUILD_DIR)。
第7行include $(INCLUDE_DIR)/package.mk
一般在软件包的基本信息完成后再引入,他定义了用户态软件包的规则。编译包分为用户态和内核模块,用户态软件包使用Package,内核模块使用KernelPackage.$(INCLUDE_DIR)/Kernel.mk文件对于软件包为内核时不可缺少,$(INCLUDE_DIR)/package.mk应用在用户态。接下来讲述用户态软件包。用户程序的编译包以Package/开头,然后接着软件名,在Package定义中的软件名可以与软件包名不一样,而且可以多个定义。
9~13行
定义包的名称为helloworld

SECTION : 包的类型为utils

CATEGORY : 目录为Utilitis,即文件在menuconfig中的位置;有时还会有SUBMENU项,即子目录.

TITLE : 用于软件包的简短描述,将显示在menuconfig中.

URL : 软件包的下载位置。

MAINTAINER : 维护者选项。

DEPENDS : 与其他软件的依赖。即如编译或安装需要其他软件时需要说明。如果存在多个依赖,则每个依赖需用空格分开。依赖前使用+号表示默认显示,即对象沒有选中时也会显示,使用@则默认为不显示,即当依赖对象选中后才显示。
15~17行
软件包的详细描述,将显示在make menuconfig
19~23行
编译准备方法,对于网上下载的软件包不需要再描述。对于非网上下载或自行开发的软件包必须说明编译准备方法。本文所用的准备方法就是首先创建软件包目录,然后将源码拷贝到刚刚创建的目录中。按OpenWrt的习惯,一般把自己设计的程序全部放在src目录下。
25~29行
软件包的安装方法,包括一系列拷贝编译好的文件到指定位置。调用时会带一个参数,就是嵌入系统的镜像文件系统目录,因此$(1)表示嵌入系统的镜像目录。

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

INSTALL_BIN:=install -m0755 : 编译好的文件到镜像文件目录
31行 $(eval $(call BuildPackage,helloworld))
完成前面定义后,必须使用eval函数实现各种定义。其格式为:

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

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

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

这里简单地解释了Makefile文件,更具体地请参考


4.编译软件

至此我们的软件已经基本完成,下面进行编译

首先将文件文件夹拷贝到openwrt目录中的package文件中,这里我的源码目录为~/openwrt,你需要把openwrt目录替换为你的openwrt源码目录.

  1. $mv ~/temp/helloworld ~/openwrt/package

然后回到项目主目录运行make menuconfig

  1. $cd ~/openwrt
  2. $make menuconfig

按"/"后,输入helloworld,搜索对应的路径



接着到Utilities目录下,找到helloworld并按空格打开;



保存后退出;

  1. $cd ~/openwrt
  2. $make package/helloworld/compile V=s

编译完成后,ipk应该已经生成

  1. $find bin/ -name "helloworld*.ipk"

至此我们已经生成简单的ipk,恭喜:)

最后可以通过winscp,将ipk安装到开发板中.


尾记

我比较薄弱的是Makefile方面的知识,刚好加强下这个方面的学习,欢迎交流~

openwrt简单ipk生成及Makefile解释的更多相关文章

  1. Linux守护进程简单介绍和实例具体解释

    Linux守护进程简单介绍和实例具体解释 简单介绍 守护进程(Daemon)是执行在后台的一种特殊进程.它独立于控制终端而且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种非常实用的进程. ...

  2. 磨刀-CodeWarrior11生成的Makefile解析

    https://mp.weixin.qq.com/s/plvviDFLsLQeg9ZeP_3WMA   一. 简介 Code Warrior 11是基于Eclipse CDT开发的集成开发环境(IDE ...

  3. (四) openwrt单个ipk编译过程

    Tags : Makefile 本周是成胖子每周一博的第五周. 更好的阅读体验,请点击这里 [TOC] 前言 前一篇博客中,我们已经知道整个openwrt的编译顺序,本文我们来探讨与开发者息息相关的单 ...

  4. 菜鸟学Java(六)——简单验证码生成(Java版)

    验证码大家都知道,它的作用也不用我多说了吧.如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字.字母或者汉字等),然后将这些生成的字符绘制成一张图片,再在图片上加上一些干扰元素 ...

  5. python中yield的用法详解——最简单,最清晰的解释(转载)

    原文链接 首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的, ...

  6. python中yield的用法详解——最简单,最清晰的解释

    转载自https://blog.csdn.net/mieleizhi0522 首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都 ...

  7. openwrt编译ipk包提示缺少feeds.mk文件

    问题具体表现如下 这个问题困扰了我两个多星期,总算解决了.解决方案如下: 首先,先应该把配置菜单调好. 我的硬件是7620a,要编译的ipk包为helloworld,所以应该使用 make menuc ...

  8. Mac OS环境下媒体文件分割工具mediafilesegmenter的简单使用(生成M3U8 TS文件)

    mediafilesegmenter是苹果开发的一款用于分割媒体文件的工具,其功能与mediastreamsegmenter相似,但操作更简单. * 具体可以对比博客中的另一篇简介<Mac OS ...

  9. PHP 用session与gd库实现简单验证码生成与验证的类

    验证码是为了防止机器灌水给网站带来污染以及增加服务器负担而出现的.目前大大小小的网站都有验证码.今天自己实现了一个简单的验证码类.说简单是因为没有加一些干扰的弧线等等,只是将文字旋转了一下.当然,因为 ...

随机推荐

  1. SQL查询作业执行情况

    查询作业的执行情况sql: SELECT [JobName] = JOB.name, [Step] = HIST.step_id, [StepName] = HIST.step_name, [Mess ...

  2. Python基础:序列(列表、元组)

    一.概述 列表(list)是由一个个 Python对象 组成的序列.其中,Python对象 可以是任何类型的对象,包括 Python标准类型(数值.字符串.列表.元组和字典)以及 用户自定义类型(类) ...

  3. sencha grid templatecolumn模板列,actioncolumn和renderer实现单元格重绘

    templatecolumn列: {                                     xtype: 'templatecolumn',                     ...

  4. AJAX使用技巧:如何处理书签和翻页按扭

    本篇文章提供了一个开源JavaScript库,它提供了给AJAX应用程序中添加书签和会退按钮的功能.在学习完这个教程后,开发者将能够对开发AJAX应用碰到的问题获得一个解决方案,这个特性甚至Googl ...

  5. 单例(C#版)

    单例: 一个类只有一个实例.巧妙利用了编程语言的一些语法规则:构造函数private, 然后提供一个public的方法返回类的一个实例:又方法和返回的类的实例都是static类型,所以只能被类所拥有, ...

  6. NameValueCollection类集合

    1.NameValueCollection类集合是基于 NameObjectCollectionBase 类. 但与 NameObjectCollectionBase 不同,该类在一个键下存储多个字符 ...

  7. ActiveReports 9 新功能:借助目录(TOC)控件为报表添加目录功能

    在最新发布的ActiveReports 9报表控件中添加了多项新功能,以帮助你在更短的时间里创建外观绚丽.功能强大的报表系统,本文将重点介绍新增文档目录控件(TOC),通过拖拽操作便可添加报表目录. ...

  8. SignalR-入门

    1.什么是SignalR: ASP.NET SignalR是为简化开发开发人员将实时web内容添加到应用程序过程而提供的类库.实时web功能指的是让服务器代码可以随时主动推送内容给客户端,而不是让服务 ...

  9. php中的常用数组函数(三)(获取数组交集的函数们 array_intersect()、array_intersect_key()、array_intersect_assoc()、array_intersect_uassoc()、array_intersect_ukey())

    这5个获取交集的函数 有 5个对应的获取差集的函数.我是链接. array_intersect($arr1, $arr2); //获得数组同键值的交集 array_intersect_key($arr ...

  10. window10 mysql5.7 解压版 安装

    1. 解压mysql-5.7.11-winx64.zip 到某文件夹, 如C:\DevelopCommon\mysql-5.7.11-winx64. 2. 配置环境变量 变量名 : MYSQL_HOM ...