|
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 文件,其内容为:
- include $(TOPDIR)/rules.mk
- PKG_NAME:=hello
- PKG_RELEASE:=1
- PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
- include $(INCLUDE_DIR)/package.mk
- define Package/hello
- SECTION:=utils
- CATEGORY:=Utilities
- TITLE:=HelloWorld
- endef
- define Build/Prepare
- mkdir -p $(PKG_BUILD_DIR)
- $(CP) ./src/* $(PKG_BUILD_DIR)/
- endef
- define Package/hello/install
- $(INSTALL_DIR) $(1)/bin/
- $(INSTALL_BIN) $(PKG_BUILD_DIR)/hello $(1)/bin/hello
- endef
- $(eval $(call BuildPackage,hello))
复制代码
其中,
include $(TOPDIR)/rules.mk 这个包含是必须的,不然没有相应的编译规则可依。
PKG_NAME 是软件包的名字, 在 menuconfig 和 ipkg 中显示。
PKG_RELEASE 该 Makefile 的版本。
PKG_BUILD_DIR:= $(BUILD_DIR)/$(PKG_NAME) 定义了我们将要在哪里编译这个程序。BUILD_DIR 定义为:
- 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
|