busybox是如何工作的 busybox是什么意思( 三 )


$ make allyesconfig$ make$
命令中支持的选项
中的命令并不支持所有可用选项 , 不过这些命令都包含了常用的选项 。如果我们需要知道一个命令可以支持哪些选项 , 可以使用 --help 选项来调用这个命令:
$ ./busybox wc --helpBusyBox v1.1.1 (2006.04.09-15:27+0000) multi-call binaryUsage: wc [OPTION]... [FILE]...Print line, word, and byte counts for each FILE, and a total line ifmore than one FILE is specified. With no FILE, read standard input.Options: -c print the byte counts -l print the newline counts -L print the length of the longest line -w print the word counts$
这些特定的数据只有在启用了选项时才可以使用 。如果没有这个选项 , 我们就无法获得这些详细数据 , 但是这样可以节省大约 13 KB 的空间 。
向中添加新命令
向添加一个新命令非常简单 , 这是因为它具有良好定义的体系结构 。第一个步骤是为新命令的源代码选择一个位置 。我们要根据命令的类型(网络 , shell 等)来选择位置 , 并与其他命令保持一致 。
这一点非常重要 , 因为这个新命令最终会在的配置菜单中出现(在下面的例子中 , 是菜单) 。
对于这个例子来说 , 我将这个新命令称为  , 并将它放到了 ./ 目录中 。这个新命令的源代码如下:
#include "busybox.h"int newcmd_main( int argc, char *argv[] ){ int i; printf("newcmd called:\n"); for (i = 0 ; i < argc ; i++) { printf("arg[%d] = %s\n", i, argv[i]); } return 0;}
接下来 , 我们要将这个新命令的源代码添加到所选子目录中的 .in 中 。在本例中 , 我更新了 .//.in 文件 。请按照字母顺序来添加新命令 , 以便维持与现有命令的一致性:
MISCUTILS-$(CONFIG_MT) += mt.oMISCUTILS-$(CONFIG_NEWCMD) += newcmd.oMISCUTILS-$(CONFIG_RUNLEVEL) += runlevel.o
接下来再次更新 ./ 目录中的配置文件 , 以便让新命令在配置过程中是可见的 。这个文件名为 .in , 新命令是按照字母顺序添加的:
config CONFIG_NEWCMD bool "newcmd" default n help newcmd is a new test command.
这个结构定义了一个新配置项(通过关键字)以及一个配置选项() 。新命令可以启用 , 也可以禁用 , 因此我们对配置的菜单属性使用了 bool ()值 。
这个命令默认是禁用的(n 表示 No) , 我们可以最后放上一个简短的 Help 描述 。在源代码树的 .///-.txt 文件中 , 我们可以看到配置语法的完整文法 。
接下来需要更新 .//.h 文件 , 使其包含这个新命令 。将下面这行内容添加到这个文件中 , 记住要按照字母顺序 。维护这个次序非常重要 , 否则我们的命令就会找不到 。
将命令添加到 .h 中:
USE_NEWCMD(APPLET(newcmd, newcmd_main, _BB_DIR_USER_BIN, _BB_SUID_NEVER))
这定义了命令名() , 它在源代码中的函数名() , 应该在哪里会为这个新命令创建链接(在这种情况中 , 它在 /usr/bin 目录中) , 最后这个命令是否有权设置用户 id(在本例中是 no) 。
倒数第二个步骤是向 .//usage.h 文件中添加详细的帮助信息 。正如您可以从这个文件的例子中看到的一样 , 使用信息可能非常详细 。在本例中 , 我只添加了一点信息 , 这样就可以编译这个新命令了:
向 usage.h 添加帮助信息:
#define newcmd_trivial_usage "None"#define newcmd_full_usage "None"
最后一个步骤是启用新命令(通过 make  , 然后在菜单中启用这个选项)然后使用 make 来编译。