debian9上的openwrt创建自己的IPK软件
-
- # debian9上的openwrt创建自己的IPK软件
- 一、生成OpenWRT SDK
- 二、安装openwrt sdk
- 三、创建helloworld项目
- 四、创建helloworld包
- 五、验证helloworld*.ipk
# debian9上的openwrt创建自己的IPK软件
本文主要介绍基于debian9平台的openwrt打包创建自己的ipk,并且能在路由器中运行。 自己在实践中,也遇到了更多的坑,后面都一一解决。可能在不同版本的操作系统,不同版本的openwrt可能都有一些意料之外的坑等着大家,不过不用担心,一切问题找度娘,实在不行问谷哥,问题总能解决。
一、生成OpenWRT SDK
使用非root用户登录到~/openwrt根目录
1 2
| $ cd /usr/myopenwrt/openwrt/
$ make menuconfig |
根据自己的机型选择Target System、Subtarget以及Target Profile后,选中图中的Build the OpenWrt SDK(前面打星号) 保存退出后,开始编译
如无意外,510分钟即可编译完成,在/openwrt/bin/targets/ramips/mt76x8目录下生成xz格式的压缩文件 openwrt-sdk-ramips-mt76x8_gcc-7.3.0_musl.Linux-x86_64.tar.xz 该文件即为openwrt sdk,可以用来编译ipk软件包
二、安装openwrt sdk
复制上面编译后的文件到其他目录下,如myopenwrt/SDK下,使用xz压缩工具解压缩,改个短名。
1 2 3 4
| $ sudo cp bin/targets/ramips/mt76x8/openwrt-sdk-ramips-mt76x8_gcc-7.3.0_musl.Linux-x86_64.tar.xz /usr/myopenwrt/SDK/
$ sudo xz -d openwrt-sdk-ramips-mt76x8_gcc-7.3.0_musl.Linux-x86_64.tar.xz
$ sudo tar -xvf openwrt-sdk-ramips-mt76x8_gcc-7.3.0_musl.Linux-x86_64.tar
$ sudo mv openwrt-sdk-ramips-mt76x8_gcc-7.3.0_musl.Linux-x86_64 openwrt-sdk |
坑点1:第一次遇到xz压缩格式,还以为生成sdk出错了,有点懵逼,查了下才知道怎么回事,怒装xz-utils工具
1
| $ sudo aptitude install xz-utils |
解压xz文件后,变成tar文件,再用tar解压一次。有资料说tar可以直接解压xz文件,试过了debian下好像不行。
现在sdk的目录就是~/usr/myopenwrt/SDK/openwrt-sdk
参考文档里面说该目录结构与原openwrt结构差不多,然后就往下走进入正题了。注意,这里就是坑点2,可能与编译环境有关。比较一下该目录结构与openwrt目录结构会发现,sdk目录下没有key-built文件夹。还好这个坑点比较容易发现,编译ipk出错,提示找不到这个文件夹,直接copy过来就ok。不放心的话,可以空程序编译一下试试:make V=s,就不会出现下面的错误了。
三、创建helloworld项目
终于进入正题了,直接照搬参考链接里面的步骤,然后后面的Makefile文件直接换成正确的内容,感谢原作者填坑
其实,这里可以是任意我们想要加入的程序,库等。这里就以helloword为例。
在任意路径下,创建helloword项目。比如这里还是在 ~/Workspace/OpenWRT 目录下。
1 2 3 4
| $ cd ~/Workspace/OpenWRT
$ mkdir helloword
$ cd helloword
$ touch helloword.c Makefile |
在 ~/Workspace/OpenWRT/ 目录下创建了 helloword 目录,并生成 helloword.c与Makefile文件。
如下为 helloworld.c的内容:
1 2 3 4 5 6 7
| #include <stdio.h>
int main()
{<!-- -->
printf("This is my hello word!\n");
return 0;
} |
Makefile的内容:
1 2 3 4 5 6 7 8
| helloworld : helloworld.o
$(CC) $(LDFLAGS) helloworld.o -o helloworld
helloworld.o : helloworld.c
$(CC) $(CFLAGS) -c helloworld.c
clean :
rm *.o helloworld |
首先,确保在程序没问题,在本地能正常编过。为了检验一下,可以就地 make 一下,看程序本身有没有问题。
这个程序都如些之简单了,本人自己了make了一下,OK,再run了一下,正常。
四、创建helloworld包
进入 OpenWrt/Packages/ 并在该目录下创建 helloworld 目录,并进入该目录。
1 2 3
| $ cd ~/Workspace/OpenWrt/OpenWrt-SDK/package
$ mkdir helloworld
$ cd helloworld |
将我们第三步写的程序复制到这个目录下来,更名为src。再新建一个 Makefile 文件。
1 2
| $ cp -r ../../../helloworld src
$ touch Makefile |
整个过程下来,package目录结构如下:
1 2 3 4 5 6 7
| package
|-- helloworld
| |-- Makefile
| `-- src
| |-- helloworld.c
| `-- Makefile
`-- Makefile |
package/Makefile 不要去修改它。
我们要编写的是 package/helloworld/Makefile 这个文件。
在这个文件中,我们要描述 helloworld 包的信息,比如:如何配置、如何编译、如何打包、安装等等信息。 这个文件与一般的 Makefile 格式还不一样,详见OpenWrt上的说明文档:OpenWrt官网Packages说明
最终完整的 Makefile 文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| include $(TOPDIR)/rules.mk
PKG_NAME:=helloworld
PKG_RELEASE:=1
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/helloworld
SECTION:=utils
CATEGORY:=Utilities
TITLE:=Helloworld -- prints a snarky message
endef
define Package/helloworld/description
It's my first package demo.
endef
define Build/Prepare #已修正
echo "Here is Package/Prepare"
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
define Package/helloworld/install
echo "Here is Package/install"
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/
endef
$(eval $(call BuildPackage,helloworld)) #已去除逗号后面的空格 |
这次 make -j1 V=s 成功了。生成了 helloworld_1_ar71xx.ipk 。find 一下,看在哪里
好了,这一个步骤,我只能拷贝到这里了,因为这里编译的时候会出现2个坑:
坑点3,在Debian9-64位环境下,git clone最新的openwrt版本情况下,这里可能会出现编译不通过的情况,会出现错误: Package helloworld is missing dependencies for the following libraries: libc.so.6 解决办法是,修改 openwrt-sdk/staging_dir/target-mipsel_24kc_musl/pkginfo/libc.provides文件,添加libc.so.6到最后一行即可。
坑点4:Makefile文件以及helloworld.c源文件的每行的缩进,不能是空格,空格需要全部删掉,可以用tab代替。这个坑网上一搜一大把,实在是太坑,找了好久才知道是这个问题。
ok,这时候再编译就没有问题了,执行make -j1 V=s,生成了helloworld_1_mipsel_24kc.ipk文件,文件名会根据你的机器硬件不同而不同,不要在意。
1 2
| $ find -name helloworld*.ipk
./bin/packages/mipsel_24kc/base/helloworld_1_mipsel_24kc.ipk |
五、验证helloworld*.ipk
将生成的helloworld_1_mipsel_24kc.ipk文件拷贝到刷了openwrt的路由器上,文件比较小,非常快
1 2 3
| $ scp bin/packages/mipsel_24kc/base/helloworld_1_mipsel_24kc.ipk root@192.168.1.1:
root@192.168.1.1's password:
helloworld_1_mipsel_24kc.ipk 100% 1891 92.4KB/s 00:00 |
ssh登录到路由器,安装helloworld*.ipk,执行helloworld,可以看到成功打印结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| BusyBox v1.28.4 () built-in shell (ash)
_______ ________ __
| |.-----.-----.-----.| | | |.----.| |_
| - || _ | -__| || | | || _|| _|
|_______|| __|_____|__|__||________||__| |____|
|__| W I R E L E S S F R E E D O M
-----------------------------------------------------
OpenWrt SNAPSHOT, r7394-8722c52b41
-----------------------------------------------------
root@OpenWrt:~# ls -l
-rw-r--r-- 1 root root 1891 Jul 11 13:26 helloworld_1_mipsel_24kc.ipk
root@OpenWrt:~# opkg install helloworld_1_mipsel_24kc.ipk
Installing helloworld (1) to root...
Configuring helloworld.
root@OpenWrt:~# helloworld
This is my hello word!
root@OpenWrt:~# |
网上虽然有很多人对编译ipk填了很多坑,但是在不同的编译环境下,还是会出现一些意料之外的问题,这时候就需要善于思考和实践了。
|