分享

debian9上的openwrt创建自己的IPK软件 | 码农家园

 yydy1983 2022-11-16 发布于中国香港

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(前面打星号)
在这里插入图片描述
保存退出后,开始编译

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软件包

二、安装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填了很多坑,但是在不同的编译环境下,还是会出现一些意料之外的问题,这时候就需要善于思考和实践了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多