OpenWRT开发之创建软件包

OpenWRT开发之创建软件包,第1张

OpenWRT二次开发时总免不了开发自己的软件包。本文介绍如何在OpenWRT中创建一个新的软件包。

首先创建软件包所在的目录,在openwrt根目录中执行:

这里的mypackages目录和helloworld目录都是新建的,helloworld就是我们本次新建的软件包的包名。我们后续可以将自己创建的包都放在mypackages目录下。

helloworld包的目录结构如下:

即软件包helloworld目录下的Makefile文件。例子以及注释如下:

上面的例子中没有定义define Build/Compile ,表示使用默认的Compile命令。默认的Compile行为就是在$(PKG_BUILD_DIR)目录下执行make命令。

helloworld.c内容如下:

与helloworld.c同目录的Makefile内容如下:

说明:这里的$(CC)、$(CFLAGS)、$(LDFLAGS)都是由OpenWRT的build系统赋值的,CC就是目标平台对应的交叉编译工具链里的gcc。

在OpenWRT根目录下运行make menuconfig,可以看到多出来一个”Examples —>”菜单,按回车进去后可以看到我们新建的”helloworld” 包。 (从这里也可以看出,在执行make menuconfig时,OpenWRT会自动扫描package目录以及其子目录下所有的包。)

选中这个”helloworld”包。然后再OpenWRT根目录下执行:

此命令即为OpenWRT单package编译命令。

通过log,可以看到我们的包编译成功。编译目录为 build_dir/target-XXXX/helloworld-1.0

如果要再次编译,可以执行:

本文源码见: https://github.com/jian-soft/openwrt-package-example

参考文章:

下面是Makefile中一些约定俗成的目标名称及其含义:

all

编译整个软件包,但不重建任何文档。一般此目标作为默认的终极目标。此目标一般对所有源程序的编译和连接使用"-g"选项,以使最终的可执行程序中包含调试信息。可使用 strip 程序去掉这些调试符号。

clean

清除当前目录下在 make 过程中产生的文件。它不能删除软件包的配置文件,也不能删除 build 时创建的那些文件。

distclean

类似于"clean",但增加删除当前目录下的的配置文件、build 过程产生的文件。

info

产生必要的 Info 文档。

check 或 test

完成所有的自检功能。在执行检查之前,应确保所有程序已经被创建(但可以尚未安装)。为了进行测试,需要实现在程序没有安装的情况下被执行的测试命令。

install

完成程序的编译并将最终的可执行程序、库文件等拷贝到指定的目录。此种安装一般不对可执行程序进行 strip *** 作。

install-strip

和"install"类似,但是会对复制到安装目录下的可执行文件进行 strip *** 作。

uninstall

删除所有由"install"安装的文件。

installcheck

执行安装检查。在执行安装检查之前,需要确保所有程序已经被创建并且被安装。

installdirs

创建安装目录及其子目录。它不能更改软件的编译目录,而仅仅是创建程序的安装目录。

下面是 Makefile 中一些约定俗成的变量名称及其含义:

这些约定俗成的变量分为三类。第一类代表可执行程序的名字,例如 CC 代表编译器这个可执行程序;第二类代表程序使用的参数(多个参数使用空格分开),例如 CFLAGS 代表编译器执行时使用的参数(一种怪异的做法是直接在 CC 中包含参数);第三类代表安装目录,例如 prefix 等等,含义简单,下面只列出它们的默认值。

AR 函数库打包程序,可创建静态库.a文档。默认是"ar"。

AS 汇编程序。默认是"as"。

CC C编译程序。默认是"cc"。

CXX C++编译程序。默认是"g++"。

CPP C/C++预处理器。默认是"$(CC) -E"。

FC Fortran编译器。默认是"f77"。

PC Pascal语言编译器。默认是"pc"。

YACC Yacc文法分析器。默认是"yacc"。

ARFLAGS 函数库打包程序的命令行参数。默认值是"rv"。

ASFLAGS 汇编程序的命令行参数。

CFLAGS C编译程序的命令行参数。

CXXFLAGS C++编译程序的命令行参数。

CPPFLAGS C/C++预处理器的命令行参数。

FFLAGS Fortran编译器的命令行参数。

PFLAGS Pascal编译器的命令行参数。

YFLAGS Yacc文法分析器的命令行参数。

LDFLAGS 链接器的命令行参数。

prefix /usr/local

exec_prefix $(prefix)

bindir $(exec_prefix)/bin

sbindir $(exec_prefix)/sbin

libexecdir $(exec_prefix)/libexec

datadir $(prefix)/share

sysconfdir $(prefix)/etc

sharedstatedir $(prefix)/com

localstatedir $(prefix)/var

libdir $(exec_prefix)/lib

infodir $(prefix)/info

includedir $(prefix)/include

oldincludedir $(prefix)/include

mandir $(prefix)/man

srcdir 需要编译的源文件所在的目录,无默认值

一般来说,在编译时,进行make menuconfig,可以选择你需要编译的包。工具粻甫纲晃蕺浩告彤梗廓会帮助你完成包依赖的处理,包括依赖包的下载以及编译)。 如果要手动编译一个包,则需要自己解决包依赖的问题。例如想编译一个nano的包,可以通过命令opkg info nano 来知道包依赖是什么 。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11606914.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存