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  
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。