docs: update new-applet-HOWTO.txt
This patch adds some information about the gen_build_files.sh script and how it allows to keep the Kbuild, Config.in etc. declarations in .c files. Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
109ee5d336
commit
9dbe4d0547
@ -16,10 +16,10 @@ Initial Write
|
|||||||
|
|
||||||
First, write your applet. Be sure to include copyright information at the top,
|
First, write your applet. Be sure to include copyright information at the top,
|
||||||
such as who you stole the code from and so forth. Also include the mini-GPL
|
such as who you stole the code from and so forth. Also include the mini-GPL
|
||||||
boilerplate. Be sure to name the main function <applet>_main instead of main.
|
boilerplate and Config.in/Kbuild/usage/applet.h snippets (more on that below
|
||||||
And be sure to put it in <applet>.c. Usage does not have to be taken care of by
|
in this document). Be sure to name the main function <applet>_main instead
|
||||||
your applet.
|
of main. And be sure to put it in <applet>.c. Make sure to #include "libbb.h"
|
||||||
Make sure to #include "libbb.h" as the first include file in your applet.
|
as the first include file in your applet.
|
||||||
|
|
||||||
For a new applet mu, here is the code that would go in mu.c:
|
For a new applet mu, here is the code that would go in mu.c:
|
||||||
|
|
||||||
@ -41,6 +41,23 @@ For a new applet mu, here is the code that would go in mu.c:
|
|||||||
#include "libbb.h"
|
#include "libbb.h"
|
||||||
#include "other.h"
|
#include "other.h"
|
||||||
|
|
||||||
|
//config:config MU
|
||||||
|
//config: bool "MU"
|
||||||
|
//config: default n
|
||||||
|
//config: help
|
||||||
|
//config: Returns an indeterminate value.
|
||||||
|
|
||||||
|
//kbuild:lib-$(CONFIG_MU) += mu.o
|
||||||
|
//applet:IF_MU(APPLET(mu, BB_DIR_USR_BIN, BB_SUID_DROP))
|
||||||
|
|
||||||
|
//usage:#define mu_trivial_usage
|
||||||
|
//usage: "-[abcde] FILES"
|
||||||
|
//usage:#define mu_full_usage
|
||||||
|
//usage: "Returns an indeterminate value.\n\n"
|
||||||
|
//usage: "Options:\n"
|
||||||
|
//usage: "\t-a\t\tfirst function\n"
|
||||||
|
//usage: "\t-b\t\tsecond function\n"
|
||||||
|
|
||||||
int mu_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
int mu_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||||
int mu_main(int argc, char **argv)
|
int mu_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -90,6 +107,8 @@ Make a new file named <function_name>.c
|
|||||||
#include "libbb.h"
|
#include "libbb.h"
|
||||||
#include "other.h"
|
#include "other.h"
|
||||||
|
|
||||||
|
//kbuild:lib-y += function.o
|
||||||
|
|
||||||
int function(char *a)
|
int function(char *a)
|
||||||
{
|
{
|
||||||
return *a;
|
return *a;
|
||||||
@ -97,9 +116,7 @@ int function(char *a)
|
|||||||
|
|
||||||
----end example code------
|
----end example code------
|
||||||
|
|
||||||
Add <function_name>.o in the right alphabetically sorted place
|
Remember about the kbuild snippet.
|
||||||
in libbb/Kbuild.src. You should look at the conditional part of
|
|
||||||
libbb/Kbuild.src as well.
|
|
||||||
|
|
||||||
You should also try to find a suitable place in include/libbb.h for
|
You should also try to find a suitable place in include/libbb.h for
|
||||||
the function declaration. If not, add it somewhere anyway, with or without
|
the function declaration. If not, add it somewhere anyway, with or without
|
||||||
@ -109,41 +126,55 @@ You can look at libbb/Config.src and try to find out if the function is
|
|||||||
tunable and add it there if it is.
|
tunable and add it there if it is.
|
||||||
|
|
||||||
|
|
||||||
|
Kbuild/Config.in/usage/applets.h snippets in .c files
|
||||||
|
-----------------------------------------------------
|
||||||
|
|
||||||
|
The old way of adding new applets was to put all the information needed by the
|
||||||
|
configuration and build system into appropriate files (namely: Kbuild.src and
|
||||||
|
Config.src in new applet's directory) and to add the applet declaration and
|
||||||
|
usage info text to include/applets.src.h and include/usage.src.h respectively.
|
||||||
|
|
||||||
|
Since the scripts/gen_build_files.sh script had been introduced, the preferred
|
||||||
|
way is to have all these declarations contained within the applet .c files.
|
||||||
|
|
||||||
|
Every line intended to be processed by gen_build_files.sh should start as a
|
||||||
|
comment without any preceding whitespaces and be followed by an appropriate
|
||||||
|
keyword - kbuild, config, usage or applet - and a colon, just like shown in the
|
||||||
|
first example above.
|
||||||
|
|
||||||
|
|
||||||
Placement / Directory
|
Placement / Directory
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
Find the appropriate directory for your new applet.
|
Find the appropriate directory for your new applet.
|
||||||
|
|
||||||
Make sure you find the appropriate places in the files, the applets are
|
Add the kbuild snippet to the .c file:
|
||||||
sorted alphabetically.
|
|
||||||
|
|
||||||
Add the applet to Kbuild.src in the chosen directory:
|
//kbuild:lib-$(CONFIG_MU) += mu.o
|
||||||
|
|
||||||
lib-$(CONFIG_MU) += mu.o
|
Add the config snippet to the .c file:
|
||||||
|
|
||||||
Add the applet to Config.src in the chosen directory:
|
//config:config MU
|
||||||
|
//config: bool "MU"
|
||||||
config MU
|
//config: default n
|
||||||
bool "MU"
|
//config: help
|
||||||
default n
|
//config: Returns an indeterminate value.
|
||||||
help
|
|
||||||
Returns an indeterminate value.
|
|
||||||
|
|
||||||
|
|
||||||
Usage String(s)
|
Usage String(s)
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
Next, add usage information for you applet to include/usage.src.h.
|
Next, add usage information for your applet to the .c file.
|
||||||
This should look like the following:
|
This should look like the following:
|
||||||
|
|
||||||
#define mu_trivial_usage \
|
//usage:#define mu_trivial_usage
|
||||||
"-[abcde] FILES"
|
//usage: "-[abcde] FILES"
|
||||||
#define mu_full_usage \
|
//usage:#define mu_full_usage
|
||||||
"Returns an indeterminate value.\n\n" \
|
//usage: "Returns an indeterminate value.\n\n"
|
||||||
"Options:\n" \
|
//usage: "Options:\n"
|
||||||
"\t-a\t\tfirst function\n" \
|
//usage: "\t-a\t\tfirst function\n"
|
||||||
"\t-b\t\tsecond function\n" \
|
//usage: "\t-b\t\tsecond function\n"
|
||||||
...
|
//usage: ...
|
||||||
|
|
||||||
If your program supports flags, the flags should be mentioned on the first
|
If your program supports flags, the flags should be mentioned on the first
|
||||||
line (-[abcde]) and a detailed description of each flag should go in the
|
line (-[abcde]) and a detailed description of each flag should go in the
|
||||||
@ -154,15 +185,11 @@ currently exist in usage.src.h.)
|
|||||||
Header Files
|
Header Files
|
||||||
------------
|
------------
|
||||||
|
|
||||||
Next, add an entry to include/applets.src.h. Be *sure* to keep the list
|
Finally add the applet declaration snippet. Be sure to read the top of
|
||||||
in alphabetical order, or else it will break the binary-search lookup
|
applets.src.h before adding your applet - it contains important info
|
||||||
algorithm in busybox.c and the Gods of BusyBox smite you. Yea, verily:
|
on applet macros and conventions.
|
||||||
|
|
||||||
Be sure to read the top of applets.src.h before adding your applet.
|
//applet:IF_MU(APPLET(mu, BB_DIR_USR_BIN, BB_SUID_DROP))
|
||||||
|
|
||||||
/* all programs above here are alphabetically "less than" 'mu' */
|
|
||||||
IF_MU(APPLET(mu, BB_DIR_USR_BIN, BB_SUID_DROP))
|
|
||||||
/* all programs below here are alphabetically "greater than" 'mu' */
|
|
||||||
|
|
||||||
|
|
||||||
The Grand Announcement
|
The Grand Announcement
|
||||||
|
Loading…
Reference in New Issue
Block a user