- rename bareconfig to allbareconfig and emit "is not set" strings needed for
[oweals/busybox.git] / docs / new-applet-HOWTO.txt
1 How to Add a New Applet to BusyBox
2 ==================================
3
4 This document details the steps you must take to add a new applet to BusyBox.
5
6 Credits:
7 Matt Kraai - initial writeup
8 Mark Whitley - the remix
9 Thomas Lundquist - Added stuff for the new directory layout.
10
11 Initial Write
12 -------------
13
14 First, write your applet.  Be sure to include copyright information at the top,
15 such as who you stole the code from and so forth. Also include the mini-GPL
16 boilerplate. Be sure to name the main function <applet>_main instead of main.
17 And be sure to put it in <applet>.c. Usage does not have to be taken care of by
18 your applet.
19
20 For a new applet mu, here is the code that would go in mu.c:
21
22 ----begin example code------
23
24 /* vi: set sw=4 ts=4: */
25 /*
26  * Mini mu implementation for busybox
27  *
28  *
29  * Copyright (C) [YEAR] by [YOUR NAME] <YOUR EMAIL>
30  *
31  * This program is free software; you can redistribute it and/or modify
32  * it under the terms of the GNU General Public License as published by
33  * the Free Software Foundation; either version 2 of the License, or
34  * (at your option) any later version.
35  *
36  * This program is distributed in the hope that it will be useful,
37  * but WITHOUT ANY WARRANTY; without even the implied warranty of
38  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
39  * General Public License for more details.
40  *
41  * You should have received a copy of the GNU General Public License
42  * along with this program; if not, write to the Free Software
43  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
44  * 02111-1307 USA
45  *
46  */
47
48 #include "busybox.h"
49
50 int mu_main(int argc, char **argv)
51 {
52         int fd;
53         char mu;
54
55         if ((fd = open("/dev/random", O_RDONLY)) < 0)
56                 bb_perror_msg_and_die("/dev/random");
57
58         if ((n = safe_read(fd, &mu, 1)) < 1)
59                 bb_perror_msg_and_die("/dev/random");
60
61         return mu;
62 }
63
64 ----end example code------
65
66
67 Coding Style
68 ------------
69
70 Before you submit your applet for inclusion in BusyBox, (or better yet, before
71 you _write_ your applet) please read through the style guide in the docs
72 directory and make your program compliant.
73
74
75 Some Words on libbb
76 -------------------
77
78 As you are writing your applet, please be aware of the body of pre-existing
79 useful functions in libbb. Use these instead of reinventing the wheel.
80
81 Additionally, if you have any useful, general-purpose functions in your
82 applet that could be useful in other applets, consider putting them in libbb.
83
84
85 Placement / Directory
86 ---------------------
87
88 Find the appropriate directory for your new applet.
89
90 Make sure you find the appropriate places in the files, the applets are
91 sorted alphabetically.
92
93 Add the applet to Makefile.in in the chosen directory:
94
95 obj-$(CONFIG_MU)               += mu.o
96
97 Add the applet to Config.in in the chosen directory:
98
99 config CONFIG_MU
100         bool "MU"
101         default n
102         help
103           Returns an indeterminate value.
104
105
106 Usage String(s)
107 ---------------
108
109 Next, add usage information for you applet to include/usage.h.
110 This should look like the following:
111
112         #define mu_trivial_usage \
113                 "-[abcde] FILES"
114         #define mu_full_usage \
115                 "Returns an indeterminate value.\n\n" \
116                 "Options:\n" \
117                 "\t-a\t\tfirst function\n" \
118                 "\t-b\t\tsecond function\n" \
119                 ...
120
121 If your program supports flags, the flags should be mentioned on the first
122 line (-[abcde]) and a detailed description of each flag should go in the
123 mu_full_usage section, one flag per line. (Numerous examples of this
124 currently exist in usage.h.)
125
126
127 Header Files
128 ------------
129
130 Next, add an entry to include/applets.h.  Be *sure* to keep the list
131 in alphabetical order, or else it will break the binary-search lookup
132 algorithm in busybox.c and the Gods of BusyBox smite you. Yea, verily:
133
134         /* all programs above here are alphabetically "less than" 'mu' */
135         #ifdef CONFIG_MU
136                 APPLET("mu", mu_main, _BB_DIR_USR_BIN, mu_usage)
137         #endif
138         /* all programs below here are alphabetically "greater than" 'mu' */
139
140
141 Documentation
142 -------------
143
144 If you're feeling especially nice, you should also document your applet in the
145 docs directory (but nobody ever does that).
146
147 Adding some text to docs/Configure.help is a nice start.
148
149
150 The Grand Announcement
151 ----------------------
152
153 Then create a diff -urN of the files you added and/or modified. Typically:
154         <appletdir>/<applet>.c
155         include/usage.c
156         include/applets.h
157         <appletdir>/Makefile.in
158         <appletdir>/config.in
159 and send it to the mailing list:
160         busybox@busybox.net
161         http://busybox.net/mailman/listinfo/busybox
162
163 Sending patches as attachments is preferred, but not required.