4. 添加新软件包
任务说明
本案例目标是将一个自定义的C语言程序(系统信息读取工具)打包为OpenWrt软件包,并安装到运行OpenWrt的设备上。你需要完成:编写程序源码、编写OpenWrt软件包Makefile、在OpenWrt源码树中构建该包、将生成的.ipk文件安装到设备。
实现步骤
1. 创建程序源码
首先创建一个简单的C程序,用于读取并打印系统基本信息(内核版本、内存总量、空闲内存)。该程序不依赖任何第三方库,仅使用标准C库和Linux系统接口。
// sysinfo.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/utsname.h>
#include <sys/sysinfo.h>
int main(void) {
struct utsname uts;
struct sysinfo si;
if (uname(&uts) != 0) {
perror("uname");
return 1;
}
if (sysinfo(&si) != 0) {
perror("sysinfo");
return 1;
}
printf("Kernel: %s %s\n", uts.sysname, uts.release);
printf("Machine: %s\n", uts.machine);
printf("Total RAM: %lu MB\n", si.totalram * si.mem_unit / (1024 * 1024));
printf("Free RAM: %lu MB\n", si.freeram * si.mem_unit / (1024 * 1024));
return 0;
}
2. 编写OpenWrt软件包Makefile
在OpenWrt源码树的package/目录下创建名为sysinfo的文件夹,在其中创建Makefile。该Makefile遵循OpenWrt软件包构建规范,定义包元数据、依赖和构建规则。
# package/sysinfo/Makefile
include $(TOPDIR)/rules.mk
PKG_NAME:=sysinfo
PKG_VERSION:=1.0
PKG_RELEASE:=1
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/sysinfo
SECTION:=utils
CATEGORY:=Utilities
TITLE:=System information reader
DEPENDS:=+libc
endef
define Package/sysinfo/description
A simple tool to display kernel version and memory usage.
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
cp ./src/sysinfo.c $(PKG_BUILD_DIR)/
endef
define Build/Compile
$(TARGET_CC) $(TARGET_CFLAGS) -o $(PKG_BUILD_DIR)/sysinfo \
$(PKG_BUILD_DIR)/sysinfo.c
endef
define Package/sysinfo/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/sysinfo $(1)/usr/bin/
endef
$(eval $(call BuildPackage,sysinfo))
3. 目录结构
在OpenWrt源码树中,完整的目录结构如下:
package/sysinfo/
├── Makefile
└── src/
└── sysinfo.c
4. 构建软件包
在OpenWrt源码根目录执行以下命令构建软件包:
make package/sysinfo/compile V=s
构建完成后,生成的.ipk文件位于bin/packages/<架构>/base/目录下,文件名类似sysinfo_1.0-1_<架构>.ipk。
5. 安装到设备
将生成的.ipk文件拷贝到OpenWrt设备上,然后执行安装命令:
opkg install sysinfo_1.0-1_*.ipk
验证方法
安装完成后,在设备终端执行以下命令验证软件包是否正常工作:
sysinfo
预期输出应包含类似以下内容(具体数值取决于设备实际状态):
Kernel: Linux 5.4.238
Machine: mips
Total RAM: 128 MB
Free RAM: 87 MB
同时可通过以下命令确认软件包已正确安装:
opkg list-installed | grep sysinfo
若输出包含sysinfo - 1.0-1,则说明安装成功。
判定标准
- 软件包能够成功编译生成.ipk文件,无编译错误;
- 安装到设备后,
sysinfo命令可执行并正确输出系统信息; - 通过
opkg remove sysinfo可正常卸载软件包。