本文主要介绍基于debian9平台的openwrt打包创建自己的ipk,并且能在路由器中运行。
自己在实践中,也遇到了更多的坑,后面都一一解决。可能在不同版本的操作系统,不同版本的openwrt可能都有一些意料之外的坑等着大家,不过不用担心,一切问题找度娘,实在不行问谷哥,问题总能解决。
使用非root用户登录到~/openwrt根目录
1 2 | $ cd /usr/myopenwrt/openwrt/ $ make menuconfig |
根据自己的机型选择Target System、Subtarget以及Target Profile后,选中图中的Build the OpenWrt SDK(前面打星号)
1 | $ make V=99 |
如无意外,510分钟即可编译完成,在/openwrt/bin/targets/ramips/mt76x8目录下生成xz格式的压缩文件
openwrt-sdk-ramips-mt76x8_gcc-7.3.0_musl.Linux-x86_64.tar.xz
该文件即为openwrt sdk,可以用来编译ipk软件包
复制上面编译后的文件到其他目录下,如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,就不会出现下面的错误了。
终于进入正题了,直接照搬参考链接里面的步骤,然后后面的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了一下,正常。
进入 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
`-- Makefilepackage/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_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填了很多坑,但是在不同的编译环境下,还是会出现一些意料之外的问题,这时候就需要善于思考和实践了。
联系客服