当前位置: 首页 > Linux

创建OpenWrt软件包

时间:2023-04-06 11:22:03 Linux

一、OpenWrt目??录结构1.1根目录tools、toolchain、include、scripts、target、package、directories是OpenWrt解压后系统自带的目录。bin、build_dir、staging_dir、dl、feeds目录是执行相关命令后自动从网络和编译好的目录下载的。1.feeds扩展包目录。#执行该命令后,自动创建feeds目录,相关文件下载到该目录下。$./scripts/feedsupdate-a2,dl编译前通过网络将原始软件代码包下载到该目录下。#编译时,下载每个软件包并保存到dl目录下$make3,package待构建软件包的源代码或补丁文件。创建自定义包时,应将其保存到该目录。标准软件包目录结构:目录名是否可选表示必须选择MakefileOpenWrt构建文件src必须选择Makefile或CMakefile工程目录文件可选配置文件和初始化文件patches可选补丁文件4、build_dir自定义软件包会被复制到这个目录的target-mipsel_mips32_musl目录下,不同的构建架构目录名称不同。#将package目录下的src包复制到该路径下,进行编译安装操作。$build_dir/target-mipsel_mips32_musl/你的软件包src目录下的内容5.staging_dir软件包编译后的安装目录,包括开发板的根目录路径。#开发板根目录路径$staging_dir/target-mipsel_mips32_musl/root-brcm47xx/6,bin编译完成后生成的安装镜像文件和ipk安装包。7.config包括4个部分:全局编译设置、开发者编译设置、目标文件格式设置、内核编译设置。8.include包含准备环境、下载补丁脚本、编译Makefile和编译指令等脚本9.scripts包含准备环境脚本、下载补丁脚本、编译Makefile和编译指令等10.target是指嵌入式平台,包括特定嵌入式平台的内容。11、工具链编译器和C库等,例如包括编译工具gcc和glibc库。12、tools通用命令用于生成固定的辅助工具,如补丁工具patch、编译工具make、squashfs等。1.2重要目录#假设自定义项目名称为Hello###########################################Hello#-Makefile//OpenWrt构建文件#+src//Hello项目#-Makefile//Hello项目构建文件#-hello.c##openwrt根目录~/openwrt###########################################项目源码存放路径(手动)~/openwrt/package/Hello#工程源码构建路径(自动)~/openwrt/build_dir/target-mipsel_mips32_musl/Hello#工程目标安装路径(自动,移植后开发板根目录)~/openwrt/staging_dir/target-mipsel_mips32_musl/root-brcm47xx2.编译过程及软件包变量2.1编译命令及过程说明没有makepackage/hello/install命令。当执行makepackage/hello/compile命令时,会自动进行内部的编译安装操作。makeclean命令只能删除建好的文件夹,不能删除安装到root的文件夹2.2包变量openwrt是-brcm47xx目录下的文件。OpenWrtSDK根目录下的*表示包目录名。包变量变量名是可选的。意思是PKG_NAME是必需的。Required这个包Makefile的版本PKG_VERSIONOptional我们正在下载的上游版本号。PKG_BUILD_DIROptional编译原始源的位置PKG_SOURCEOOptional原始源的文件名PKG_SOURCE_URLOptional从哪里下载源PKG_MD5SUMoptionalAChecksumtovalidatethedownlaodPKG_CAToptionalHowtodecompressthesources(zcat,bzcat,unzip)PKG_BUILD_DEPENDSoptionalPackages需要在此包之前构建,但在运行时不需要。Package/*是否包描述名称是否可选DescriptionSECTION是当前未使用的包类型(可以自定义)CATEGORY需要在menuconfig中的包类别DESCRIPTION过时包的完整描述URL可选在哪里下载原始包MAINTAINER可以选择维护者信息,方便联系维护者DEPENDS可选指定编译包之前必须构建或安装的包conffiles包安装的可选配置文件列表,每个文件一行。Build/*包构建命令名称可选说明Build/Prepare可选解压或修补源文件的一系列命令,可以不定义。Build/Configure是一个可选的配置文件命令列表,可以不定义。Build/Compile是可选的,用于指定如何编译源文件,大多数情况下不需要定义。package/package-name/config可选,可以执行PACKAGE或CONFIG相关节点操作。包/包名称/安装是必需的。将编译后的文件从源码复制到ipkgPackage/package-name/preinst。可选地在打包/安装之前执行脚本。记住包含#!/bin/sh,返回false退出安装。Package/package-name/postinst可以选择性的执行Package/install后的脚本,记得包含#!/bin/sh。Package/package-name/prerm可选执行删除文件前的操作,规则类似Package/preinstPackage/package-name/postrm可选执行删除文件后的操作,规则类似Package/postrmOpenWrt系统变量变量名变量定义变量含义变量值$(TOPDIR)${CURDIR}OpenWrt根目录/openwrt$(DL_DIR)$(TOPDIR)/dl网络下载的标准软件包/openwrt/dl${OUTPUT_DIR}$(TOPDIR)/bin最后编译的ipk包/openwrt/bin${INCLUDE_DIR}$(TOPDIR)/includeinclude文件/openwrt/include$(SCRIPT_DIR)$(TOPDIR)/scripts脚本文件/openwrt/scripts$(BUILD_DIR_BASE)???$(TOPDIR)/build_dir/openwrt/build_dir$(PACKAGE_DIR)$(BIN_DIR)/packages2.3打包指令所有指令位于rules.mk文件指令名指令定义说明INSTALL_DIRinstall-d-m0755创建安装目录INSTALL_BINinstall-m0755安装可执行文件INSTALL_SUIDinstall-m4755-INSTALL_DATAinstall-m0644安装数据文件INSTALL_CONFinstall-m0600安装配置文件2.4编译命令所有软件包编译$makemenuconfig$...查看相关包并保存退出$makesinglepackagecompile#编译安装package$makepackage/${packageName}/compile编译选项#编译所有软件包,不输出详细信息,单线程编译$make#单线程编译(不带j,默认单线程)$make-j=1#多线程编译(指定个数)$make-j=2#多线程编译(根据硬件自动)$make-j#输出详细信息(默认不输出详细信息)$makeV=s#结合使用示例$makeV=s-j=2#解释:#1.多线程编译速度快,但编译出错时速度不快故障原因很容易定位#2,如果想快速编译,可以使用如下形式:make-j,不输出任何信息,根据CPU核数自动多线程编译。#3.如果要检查编译错误,可以使用如下形式:makeV=s或makeV=s-j1。#4.如果是第一次添加自定义包,必须先通过makemenuconfig构建,然后make。3.创建基于Makefile的软件包3.1文件结构和内容工程结构sprite/Makefileinclude$(TOPDIR)/rules.mkPKG_NAME:=spritePKG_RELEASE:=1PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)include$(INCLUDE_DIR)/package.mkdefinePackage/$(PKG_NAME)SECTION:=utilsCATEGORY:=SuningTITLE:=推广信息$(PKG_NAME).endefdefinePackage/$(PKG_NAME)/descriptionThisisaMakefileproject.endefdefinePackage/$(PKG_NAME)/安装$(INSTALL_DIR)$(1)/usr/bin$(INSTALL_BIN)$(PKG_BUILD_DIR)/$(PKG_NAME)$(1)/usr/bin/endef$(eval$(callBuildPackage,$(PKG_NAME)))符号等价值说明$(INSTALL_DIR)install-d-m0755创建/usr/bin目录,指定权限$(INSTALL_BIN)install-m0755修改文件权限,复制到/usr/bin目录下sprite/src/sprite.c#includeintmain(void){printf("HelloWorld!\n");return0;}sprite/src/MakefileCC=gccFLAG=-Wallsprite:$(CC)$(FLAG)sprite.c-osprite3.2Buildandclean编译安装#$(1)表示目标系统的根目录#或者通过menuconfig选择sprite选项,执行make命令$makepackage/sprite/compileV=sdelete复制的构建目录#delete~/openwrt/build_dir/target-mipsel_mips32_musl/sprite$makepackage/sprite/clean3.3构建结果自动创建的构建目录构建生成的可执行文件构建生成的安装包文件安装到目标系统根目录4.创建基于CMake的软件包4.1文件结构和内容工程结构clxye/Makefileinclude$(TOPDIR)/rules.mkPKG_NAME:=clxyPKG_RELEASE:=1PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)include$(INCLUDE_DIR)/package.mkinclude$(INCLUDE_DIR)/cmake。mkdefinePackage/${PKG_NAME}SECTION:=utilsCATEGORY:=SuningDEPENDS:=+libstdcpp+libpthreadTITLE:=推广信息${PKG_NAME}.endefdefinePackage/${PKG_NAME}/descriptionThisisaCMakeproject.endefdefinePackage/${PKG_NAME}/install$(INSTALL_DIR)$(1)/usr/bin$(INSTALL_BIN)$(PKG_BUILD_DIR)/${PKG_NAME}$(1)/usr/bin/endef$(eval$(callBuildPackage,${PKG_NAME}))1.CMake项目必须包含include$(INCLUDE_DIR)/cmake.mk2。C++项目必须包含libstdcppclxye/src/clxye.cpp#include#includeintmain(void){std::threadt([](){std::cout<<"HelloWorld!"<