source: MondoRescue/branches/3.3/mindi-busybox/docs/new-applet-HOWTO.txt@ 3621

Last change on this file since 3621 was 3621, checked in by Bruno Cornec, 7 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

File size: 5.5 KB
Line 
1How to Add a New Applet to BusyBox
2==================================
3
4This document details the steps you must take to add a new applet to BusyBox.
5
6Credits:
7Matt Kraai - initial writeup
8Mark Whitley - the remix
9Thomas Lundquist - trying to keep it updated
10
11When doing this you should consider using the latest git HEAD.
12This is a good thing if you plan to getting it committed into mainline.
13
14Initial Write
15-------------
16
17First, write your applet. Be sure to include copyright information at the top,
18such as who you stole the code from and so forth. Also include the mini-GPL
19boilerplate and Config.in/Kbuild/usage/applet.h snippets (more on that below
20in this document). Be sure to name the main function <applet>_main instead
21of main. And be sure to put it in <applet>.c. Make sure to #include "libbb.h"
22as the first include file in your applet.
23
24For a new applet mu, here is the code that would go in mu.c:
25
26(libbb.h already includes most usual header files. You do not need
27#include <stdio.h> etc...)
28
29
30----begin example code------
31
32/* vi: set sw=4 ts=4: */
33/*
34 * Mini mu implementation for busybox
35 *
36 * Copyright (C) [YEAR] by [YOUR NAME] <YOUR EMAIL>
37 *
38 * Licensed under GPLv2, see file LICENSE in this source tree.
39 */
40
41#include "libbb.h"
42#include "other.h"
43
44//config:config MU
45//config: bool "MU"
46//config: default y
47//config: help
48//config: Returns an indeterminate value.
49
50//kbuild:lib-$(CONFIG_MU) += mu.o
51//applet:IF_MU(APPLET(mu, BB_DIR_USR_BIN, BB_SUID_DROP))
52
53//usage:#define mu_trivial_usage
54//usage: "[-abcde] FILE..."
55//usage:#define mu_full_usage
56//usage: "Returns an indeterminate value\n"
57//usage: "\n -a First function"
58//usage: "\n -b Second function"
59
60int mu_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
61int mu_main(int argc, char **argv)
62{
63 int fd;
64 ssize_t n;
65 char mu;
66
67 fd = xopen("/dev/random", O_RDONLY);
68
69 if ((n = safe_read(fd, &mu, 1)) < 1)
70 bb_perror_msg_and_die("/dev/random");
71
72 return mu;
73}
74
75----end example code------
76
77
78Coding Style
79------------
80
81Before you submit your applet for inclusion in BusyBox, (or better yet, before
82you _write_ your applet) please read through the style guide in the docs
83directory and make your program compliant.
84
85
86Some Words on libbb
87-------------------
88
89As you are writing your applet, please be aware of the body of pre-existing
90useful functions in libbb. Use these instead of reinventing the wheel.
91
92Additionally, if you have any useful, general-purpose functions in your
93applet that could be useful in other applets, consider putting them in libbb.
94
95And it may be possible that some of the other applets uses functions you
96could use. If so, you have to rip the function out of the applet and make
97a libbb function out of it.
98
99Adding a libbb function:
100------------------------
101
102Make a new file named <function_name>.c
103
104----start example code------
105
106#include "libbb.h"
107#include "other.h"
108
109//kbuild:lib-y += function.o
110
111int function(char *a)
112{
113 return *a;
114}
115
116----end example code------
117
118Remember about the kbuild snippet.
119
120You should also try to find a suitable place in include/libbb.h for
121the function declaration. If not, add it somewhere anyway, with or without
122ifdefs to include or not.
123
124You can look at libbb/Config.src and try to find out if the function is
125tunable and add it there if it is.
126
127
128Kbuild/Config.in/usage/applets.h snippets in .c files
129-----------------------------------------------------
130
131The old way of adding new applets was to put all the information needed by the
132configuration and build system into appropriate files (namely: Kbuild.src and
133Config.src in new applet's directory) and to add the applet declaration and
134usage info text to include/applets.src.h and include/usage.src.h respectively.
135
136Since the scripts/gen_build_files.sh script had been introduced, the preferred
137way is to have all these declarations contained within the applet .c files.
138
139Every line intended to be processed by gen_build_files.sh should start as a
140comment without any preceding whitespaces and be followed by an appropriate
141keyword - kbuild, config, usage or applet - and a colon, just like shown in the
142first example above.
143
144
145Placement / Directory
146---------------------
147
148Find the appropriate directory for your new applet.
149
150Add the kbuild snippet to the .c file:
151
152//kbuild:lib-$(CONFIG_MU) += mu.o
153
154Add the config snippet to the .c file:
155
156//config:config MU
157//config: bool "MU"
158//config: default y
159//config: help
160//config: Returns an indeterminate value.
161
162
163Usage String(s)
164---------------
165
166Next, add usage information for your applet to the .c file.
167This should look like the following:
168
169//usage:#define mu_trivial_usage
170//usage: "[-abcde] FILE..."
171//usage:#define mu_full_usage
172//usage: "Returns an indeterminate value\n"
173//usage: "\n -a First function"
174//usage: "\n -b Second function"
175//usage: ...
176
177If your program supports flags, the flags should be mentioned on the first
178line ([-abcde]) and a detailed description of each flag should go in the
179mu_full_usage section, one flag per line.
180
181
182Header Files
183------------
184
185Finally add the applet declaration snippet. Be sure to read the top of
186applets.src.h before adding your applet - it contains important info
187on applet macros and conventions.
188
189//applet:IF_MU(APPLET(mu, BB_DIR_USR_BIN, BB_SUID_DROP))
190
191
192The Grand Announcement
193----------------------
194
195Then create a diff by adding the new files to git (remember your libbb files)
196 git add <where you put it>/mu.c
197eventually also:
198 git add libbb/function.c
199then
200 git commit
201 git format-patch HEAD^
202and send it to the mailing list:
203 busybox@busybox.net
204 http://busybox.net/mailman/listinfo/busybox
205
206Sending patches as attachments is preferred, but not required.
Note: See TracBrowser for help on using the repository browser.