曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 1836|回复: 0
打印 上一主题 下一主题

交叉编译及生成 ipk 包详细说明

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2015-3-11 12:16:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. 在 make menuconfig 时,选择 “Build the OpenWrt SDK”,然后 make 编译,如下图所示:



编译完成后,对应的 SDK 生成在类似 ~/openwrt/barrier_breaker/bin/ar71xx 的目录中,比如我这里的名字是:OpenWrt-SDK-ar71xx-for-linux-i686-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2 。

为了清晰起见,可以将该文件拷贝到另一处目录下并解压缩,比如我这里将其存放在 ~/OPSDK 中 。

2. 现在开始创建我们的 hello 工程,切换到 ~/OPSDK/package 目录下,建立一个 hello 的目录:



再切换到 hello 目录,新建一个 src 目录,用来存放源代码;然后再 touch 一个空的 Makefile 文件,该文件是 OpenWrt 格式定义的 Makefile ,和通常的 GNU Makefile 不同。

其中 hello.c 的代码为:



src 目录下要有一个 GNU 格式的 Makefile 文件,用以编译生成相应可执行文件,其内容为:



最后,写 hello 目录下的 Makefile 文件,其内容为:
  1. include $(TOPDIR)/rules.mk

  2. PKG_NAME:=hello
  3. PKG_RELEASE:=1

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

  5. include $(INCLUDE_DIR)/package.mk

  6. define Package/hello
  7.         SECTION:=utils
  8.         CATEGORY:=Utilities
  9.         TITLE:=HelloWorld
  10. endef



  11. define Build/Prepare
  12.         mkdir -p $(PKG_BUILD_DIR)
  13.         $(CP) ./src/* $(PKG_BUILD_DIR)/
  14. endef


  15. define Package/hello/install
  16.         $(INSTALL_DIR) $(1)/bin/
  17.         $(INSTALL_BIN) $(PKG_BUILD_DIR)/hello $(1)/bin/hello
  18. endef

  19. $(eval $(call BuildPackage,hello))
复制代码

其中,
include $(TOPDIR)/rules.mk 这个包含是必须的,不然没有相应的编译规则可依。

PKG_NAME 是软件包的名字, 在 menuconfig 和 ipkg 中显示。

PKG_RELEASE 该 Makefile 的版本。

PKG_BUILD_DIR:= $(BUILD_DIR)/$(PKG_NAME) 定义了我们将要在哪里编译这个程序。BUILD_DIR 定义为:
  1. BUILD_DIR:=$(BUILD_DIR_BASE)/$(TARGET_DIR_NAME)
复制代码

其中,BUILD_DIR_BASE 的定义又为 BUILD_DIR_BASE:=$(TOPDIR)/build_dir ,由此可见,编译根目录下的 build_dir 是一个编译自定义程序的一个上层目录,在编译完后,我们到该目录下也可以看到相应的生成,如下图所示:



再接着,又包含了一个规则文件 include $(INCLUDE_DIR)/package.mk,如果没有这个,那么最后一行的编译命令 $(eval $(call BuildPackage,hello)) 就无法得到执行。

接着,开始制定 hello 的一些相关信息了,这些信息都在几个 define .. endef 中。

第一个 define 是 Package/hello ,前面的 Package 表示该定义块是用来描述软件包在 menuconfig 和 ipkg 中的信息的。

SECTION 表示软件包类型,可用可不用。

CATEGORY 在 menuconfig 中所属的一级目录,如 Utilities ,Network 等。

TITLE 定义了软件包的标题。


再看第二个 define 快,这个 Build/Prepare 是个可选项,它一组解包源代码和打补丁的命令,一般不需要。但在我们这里,我们需要将程序源码复制到 build 目录下(默认是用 PKG_SOURCE_URL 和 PKG_SOURCE 来定义的,但我们这里只是本地处理,不需要从 web 上下载软件源码包)。这个 define 块做了一件很简单的事,建了一个编译目录,然后将源码拷贝过去。

这里,我们的要编译的东西已经够简单,因此不需要使用 Build/Configure 和 Build/Compile 这两个指令。

接下来,我们指定要如何去安装该程序。我们这个项目只生成一个 hello 的程序,我们打算将它安装到 /bin 目录下。在第 3 个 define 块中,Package/hello/install 这个指令,中间是程序名,后面的 install 表示此处定义的是如何安装该程序。这里涉及到两个变量,$(INSTALL_DIR) 和 $(INSTALL_BIN) ,它们都在 rules.mk 中定义:
INSTALL_BIN:=install -m0755
INSTALL_DIR:=install -d -m0755

其中,install 是一个 linux 命令,它的用途是拷贝文件并且设置其属性,具体使用请参考 man 手册。那么这里,$(INSTALL_DIR) 实际上是建立一个安装目录,如果它不存在的话;$(INSTALL_BIN) 是将程序从当前位置拷贝到目的地。


上述的指定信息都说完了,最后一条重要的命令就是真正用来编译程序的了。Makefile 语法,最权威说法还是得参考官网 wiki,地址是:http://wiki.openwrt.org/doc/devel/packages


OK,如果一切顺利的话,你会在下面的目录看到生成的 ipk 程序包:
beyes@ubuntu:~/OPSDK/bin/ar71xx/packages/base$ ls
hello_1_ar71xx.ipk  Packages  Packages.gz

最后,用 scp 将该包拷贝到你的机器上,opkg install ,后面的就不用说了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 02:59 , Processed in 0.077066 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表