OpenWrt中,软件包是通过Makefile进行管理和构建的。Makefile是一个定义了一系列规则的文件,用于构建软件包。
OpenWrt package Makefile详解
示例Makefile
include $(TOPDIR)/rules.mk
PKG_NAME:=hello-world
PKG_VERSION:=1.0
PKG_RELEASE:=1
include $(INCLUDE_DIR)/package.mk
define Package/hello-world
SECTION:=utils
CATEGORY:=Utilities
TITLE:=Hello World Example
DEPENDS:=+libc
endef
define Package/hello-world/description
This is an example package that prints "Hello World".
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
define Package/hello-world/install
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/hello-world $(1)/bin/
endef
$(eval $(call BuildPackage,hello-world))
Makefile解释
include $(TOPDIR)/rules.mk
PKG_NAME:=hello-world
PKG_VERSION:=1.0
PKG_RELEASE:=1
include $(INCLUDE_DIR)/package.mk
这个部分包含了Makefile所需的基本配置信息,比如TOPDIR(OpenWrt根目录的路径),以及软件包的名称、版本和发布版本号。
define Package/hello-world
SECTION:=utils
CATEGORY:=Utilities
TITLE:=Hello World Example
DEPENDS:=+libc
endef
这个部分定义了软件包的元数据信息,比如所属的部门、类别、标题和依赖项。
define Package/hello-world/description
This is an example package that prints "Hello World".
endef
这个部分定义了软件包的描述信息。
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
这个部分定义了如何准备软件包构建所需的文件。在这个例子中,使用mkdir命令创建了一个目录,并使用cp命令将./src目录中的所有文件复制到该目录中。
define Package/hello-world/install
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/hello-world $(1)/bin/
endef
这个部分定义了如何安装软件包。在这个例子中,使用$(INSTALL_DIR)和$(INSTALL_BIN)命令将hello-world可执行文件复制到目标系统的/bin目录中。
$(eval $(call BuildPackage,hello-world))
这个部分使用了OpenWrt提供的BuildPackage宏来构建软件包。
构建一个C语言package
编写代码
在OpenWrt中,构建一个C语言包可以通过以下步骤完成:
创建软件包目录:在OpenWrt根目录下的package目录下创建一个目录,例如:package/helloworld。
创建Makefile:在软件包目录下创建一个名为Makefile的文件,并编写如下内容:
include $(TOPDIR)/rules.mk
PKG_NAME:=helloworld
PKG_VERSION:=1.0
PKG_RELEASE:=1
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/helloworld
SECTION:=My Apps
CATEGORY:=My Apps
DEPENDS:=
TITLE:=helloworld app
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
cp -rf ./src/* $(PKG_BUILD_DIR)
endef
define Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR)/ \
CC="$(TARGET_CROSS)gcc" \
CFLAGS="$(TARGET_CFLAGS)" \
LIBS="$(TARGET_LDFLAGS) -lm" \
all
endef
define Build/Compile/Default
endef
define Package/$(PKG_NAME)/description
hello world
endef
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/usr/bin
endef
$(eval $(call BuildPackage,$(PKG_NAME)))
在这个Makefile中,首先定义了软件包的名称、版本和发布版本号等信息。然后定义了软件包的元数据信息,包括部门、类别、标题和描述等。接下来定义了软件包的构建和安装过程,其中Build/Configure部分为空,Build/Compile部分使用CC命令来编译helloworld.c文件,然后将生成的可执行文件复制到目标系统的/usr/bin目录中。
现在我们还需要创建源码目录,一般命名为src,目录结构package/helloworld/src
在package/helloworld/src
目录下创建一个名为helloworld.c的源代码文件,并编写如下内容:
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello World!\n");
return 0;
}
在“package/helloworld/src`中创建一个编译C文件的Makefile,内容如下
OBJS:=helloworld.o
EXEC:=helloworld
all: $(OBJS)
$(CC) -o $(EXEC) $(OBJS) $(LIBS)
clean:
rm $(EXEC) *.o
目录结构
最终目录结构如下:
package
└──helloworld
├── src
│ ├── helloworld.c
│ └── Makefile
└──Makefile
编译
首先我们需要在OpenWrt源码根目录执行make menuconfig
开启helloworld package编译
在菜单首页可以看到My Apps选项,这就是我们前面Makefile指定的名称
进入My Apps选项按空格选择helloworld开启package编译,然后保存后退出
为了确定配置已经保存,可以在.config文件中查询是否存在helloworld package信息
grep helloworld .config
如果存在则查询结果会输出以下内容:
CONFIG_PACKAGE_helloworld=y
除了通过make menuconfig开启package编译,我们还可以直接修改.config,加入CONFIG_PACKAGE_helloworld=y
即可 比如通过vim或者cat命令操作,make menuconfig
只是为了可视化,更直观。
现在就可以开始编译了,执行以下命令:
make package/helloworld/compile V=s
其中helloworld为我们新建的package目录名称,如果是编译其他package,更换名称即可,格式为make package/$name/compile V=s
编译完成后会生成二进制文件和ipk包,ipk在bin目录,注意不同芯片方案的ipk子目录不一样,可以通过以下命令查找ipk文件
find bin/ -name “helloworld*” 以下为场景的芯片架构C应用软件包目录:
bin/packages/x86_64/base
bin/packages/mipsel_24kc/base
bin/packages/aarch64_cortex-a53/base
bin/packages/aarch64_generic/base
上传
这里给大家介绍下我们开发过程中常用的上传方式
- winscp工具 winscp是一款支持ssh传输的工具,在协议中选择scp,填写目标ip和密码即可和ssh服务器连接,然后目标系统和windows就可以相互上传下载文件了,非常方便。注意前提是目标系统开启了ssh服务,而OpenWrt系统默认是开启了的,也可以通过手动开启OpenWrt ssh服务,命令为
/etc/init.d/dropbear restart
- scp命令 scp类似于winscp工具,只是linux下实现ssh传输功能,上传命令格式
scp $filename root@192.168.1.1:/tmp
- 页面上传 也可以通过OpenWrt软件包web管理页面直接上传
安装运行
opkg install helloworld_1.0-1_$arch.ipk
卸载
opkg remove helloworld
评论(0)