]> cygwin.com Git - cygwin-apps/cygutils.git/blob - HOW-TO-CONTRIBUTE
Adapt to DLL version of cygipc
[cygwin-apps/cygutils.git] / HOW-TO-CONTRIBUTE
1 So, you have a utility that you believe would
2 be a good addition to cygutils, do you? You
3 probably want to know how you could contribute it,
4 don't you? Well, first:
5
6 Not every spiffy utility belongs in cygutils. We
7 don't want cygutils to become a huge grab bag of
8 hundreds of small programs...in many cases, your
9 spiffy new program should become a standalone package
10 and a full-fledged member of the cygwin distribution.
11 (Don't worry -- that's not hard. It's probably
12 easier than integrating your spiffy program into
13 cygutils).
14
15 So, your first step is to post a message to the
16 cygwin-apps mailing list, present your program, and
17 ASK if it should be included in cygutils, or turned
18 into a standalong package. If you believe it should
19 become part of cygutils, explain why. I will not
20 add any program to cygutils without a consensus
21 from the cygwin-apps list.
22
23 In the body of your email, describe what your program
24 does, why it's needed, and why you think it should be
25 added to the cygutils package. Also explain why (or
26 state that) existing tools will not meet the need your
27 program does.
28
29 Second, once you're obtained agreement that yourfile.c
30 should be added to cygutils:
31
32 Don't just send me yourfile.c and expect me to
33 do all the integration work.
34
35 You need to do more than merely insure that it builds
36 on your machine with a simple
37
38 gcc -o yourfile.exe yourfile.c -lthislibrary -lthatlibrary
39
40 In addition to that, you need to check out the cygutils
41 source and integrate yourfile into the whole system. Instructions
42 follow below. However, you'll notice that it's quite a bit
43 of work. Again, are you SURE you want it to become part
44 of cygutils? Making a standalone program is a lot easier...
45
46 Also, note that I will not fix your bugs. If, at some time
47 after your program is accepted into cygutils, I (as cygutils
48 maintainer) get a bug report on your program, I will forward
49 it to you. If you don't fix it or respond within a reasonable
50 time, I will remove it from the distribution.
51
52 ------------------------------------------------------
53
54 Okay, now that we're past that unpleasantness, here's how to
55 integrate your spiffy new utility. First, let's assume that
56 your spiffy utility is called 'foo', and its source is in 'foo.c'.
57
58 The simple 12 step program:
59 ---------------------------
60
61 1) Get the cygutils source
62
63 cvs -d:pserver:anoncvs@sources.redhat.com:/cvs/cygwin-apps login
64 use 'anoncvs' as the password
65 cvs -z3 -d:pserver:anoncvs@sources.redhat.com:/cvs/cygwin-apps co cygutils
66
67 you now have a 'cygutils' directory with the existing source.
68
69 2) License information
70
71 make sure that all .c and .h files in your contribution
72 have license information: preferably GPL, but other
73 open licenses are acceptable, too. See the top of
74 src/lpr/lpr.c for an example.
75
76 a) if your license is not GPL or BSD-no-advert, then
77 you must also include a copy of the ENTIRE license
78 in the licenses subdirectory. (Most of the time,
79 the blurb in the .c or .h file is just that: a short
80 blurb, with a reference to the full text elsewhere)
81
82 You should also add it to the licenses variable in
83 the toplevel Makefile.am: e.g.
84
85 licenses = ... licenses/COPYING.MPL ...
86
87 3) Make a home
88
89 create a new directory for your contribution underneath 'src'
90 In our case, we will do this:
91 cd cygutils/src
92 mkdir foo
93
94 copy your source into the new directory
95 cp <location>/foo.c <cygutils>/src/foo/
96
97 4) Modify your source code
98
99 Add the following snippet to the beginning of your .c and .h(*)
100 files, just after the license information:
101
102 #if HAVE_CONFIG_H
103 #include "config.h"
104 #endif
105 #include "common.h"
106
107 a) If your contribution has its own .h file(s), the entire .h file
108 should be "guarded" as follows:
109
110 /* license information */
111 #ifndef _FOO_H
112 #define _FOO_H
113 /* the config.h/common.h stuff */
114 /* your header stuff */
115 #endif /* !_FOO_H */
116
117 the "_FOO_H" identifier should be changed to match the filename
118 of your header file. Thus, "bob.h" would be guarded with _BOB_H.
119
120 Naturally, the header files should also be copied into src/foo/.
121
122 5) Modify cygutils/Makefile.am
123
124 a) Add your program to the list of progs to be built. If your
125 program will build on non-windows platforms in addition to cygwin,
126 then you can add your program to the "bin_PROGRAMS" variable:
127
128 bin_PROGRAMS = ... src/foo/foo ...
129
130 If your contribution is windows-specific, then you should add it
131 to BOTH the "windows_progs" and the EXTRA_PROGRAMS variables:
132
133 windows_progs = ... src/foo/foo ...
134 EXTRA_PROGRAMS = ... src/foo/foo ...
135
136 b) Special link libraries
137
138 If you need to link to special *WINDOWS* libraries, then obviously
139 your program is windows-specific, but also you should add a line
140 in your Makefile.am like this:
141
142 src_foo_foo_LDADD = -lwinlib
143
144 Where "src_foo_foo" is the path to your program, where the '/'
145 characters are replaced with '_' characters. Yes, it looks a little
146 funny -- but because our subdirectory has the same name as our
147 program, we get double foo's... Also, 'winlib' is the library
148 that you need. See the src_lpr_lpr_LDADD variable in Makefile.am
149 for an example.
150
151 If, on the other hand, you need to link to some other (cygwin)
152 library that is also more generally available -- like libreadline
153 or libncurses -- then you'll need to do a little more work.
154 For your initial submission, just create an LDADD variable in
155 Makefile.am with -lreadline (or whatever). We'll figure out how
156 to handle it better further down the road. However, make sure
157 to let me know about your special link requirements.
158
159 src_foo_foo_LDADD = -lreadline
160
161 One special case is the gettext internationalization libraries.
162 If your program must link with -lintl, then all you need to
163 do is create an LDADD variable as follows:
164
165 src_foo_foo_LDADD = @LIBINTL@
166
167 The configuration process will replace @LIBINTL@ with the
168 appropriate -lintl -liconv invocation.
169
170 Note that you do NOT need to include the popt library in
171 a 'src_foo_foo_LDADD' line; -lpopt will be added automatically...
172
173 If your app depends on IPC functions, then add @IPCLIBS@
174 to the 'src_foo_foo_LDADD' line.
175
176 c) man pages and other documentation
177
178 If you got 'em, copy 'em to your src/foo directory, and add the
179 manpage to the man_MANS variable in Makefile.am like this:
180
181 man_MANS = ... src/foo/foo.1 ...
182
183 If there are non-man-page documentation files, you should those
184 files to the extra_docs variable (which gets automatically
185 included in EXTRA_DIST)
186
187 extra_docs = ... src/foo/foo.README ...
188
189 However, there is no provisiion for actually INSTALLING these
190 additional documentation files. At least not yet.
191
192 d) Extra files
193
194 If your contribution consists of more source files than a single
195 .c, then you need to add a variable to Makefile.am that lists all
196 of them:
197
198 src_foo_foo_SOURCES = foo.c otherfoo.c foo.h
199
200 Note that this variable should NOT be specified if your program
201 consists merely of a single .c file whose name is the same as
202 your program + '.c'.
203
204 If there are .h files in your SOURCES list, then you need to
205 add those .h files to the noinst_HEADERS variable, or the headers
206 would get installed into /usr/include/src/foo/ -- and we don't
207 want that!
208
209 noinst_HEADERS = ... src/foo/foo.h ...
210
211 If you have other questions about the Makefile.am file, try to
212 follow the "patterns" established in it by the other programs,
213 or (gasp) read the automake documentation.
214
215 6) Simplify your #includes.
216
217 Take a good look at the #include statements in your .c and .h
218 files. If the dependencies are listed in <cygutils>/common.h,
219 then you shouldn't re-include them. If a dependency is NOT
220 listed in common.h, then leave it in your .h/.c file -- for
221 now. We may choose to add them to common.h and add new tests
222 to configure.ac, or we may choose to let your .c file
223 include it directly. However, anything that's already in
224 common.h, remove from your .c/.h file. It's okay to just
225 comment them out, rather than deleting them entirely, if
226 you prefer.
227
228 7) Add information to cygutils documentation files:
229
230 Add a short blurb about your app to <cygutils>/PROGLIST
231 Add your app to the list at the end of the README file
232 Add your name to the AUTHORS file.
233
234 8) Bootstrap
235
236 (You need to have autoconf, autoconf-devel, automake, and
237 automake-devel installed for this to work). Change dir
238 to the top of your checked-out source, and run bootstrap:
239
240 cd <cygutils>
241 ./bootstrap
242
243 If you haven't made any mistakes, you should (a) see no
244 errors, and (b) see some new rules in Makefile.in that
245 correspond to your program.
246
247 9) Build and test
248
249 Now, just run './configure ; make' as usual. Somewhere
250 amongst the flurry of messages, you should see your application
251 being built. If so, you're almost done. If not, then you
252 need to figure out why. Time to read the auto* documentation...
253
254 10) Create a patch and ChangeLog entry
255
256 a) PATCH
257
258 cd <cygutils>
259 cvs diff -u > foo.patch
260
261 If you've already edited the ChangeLog file, make sure to
262 *remove* that chunk from foo.patch. I don't want a PATCH
263 for the ChangeLog, I want the ChangeLog entry itself (ChangeLog
264 patches rarely apply cleanly; it's easier to cut-n-paste. More
265 below).
266
267 b) NEW FILES
268
269 However, you'll notice that none of the files in your src/foo
270 directory are represented in the patch. That's normal. Remove
271 any .o and .exe files from src/foo, and then just make a tarball
272
273 cd <cygutils>
274 tar cvjf foo.tar.bz2 src/foo
275
276 c) CHANGELOG
277
278 You should also create a ChangeLog entry. Don't actually edit
279 the ChangeLog itself; create a new file (foo.changelog?) and
280 put your stuff there. It should look like this:
281
282 2002-03-02 Your Name <your_email_address@domain.com>
283
284 * src/foo: new directory
285 * src/foo/foo.c: new file
286 * Makefile.am: add program 'foo'
287 * Makefile.in: regenerate
288 * AUTHORS: add yourname for foo
289 * PROGLIST: add foo
290 * README: add foo
291
292 Don't list src/foo/Makefile. Do list every original
293 file in src/foo/ (like your man pages, or extra documentation
294 files, or headers)
295
296 11) Send a notice email to cygwin-apps@cygwin.com, that says "Hey, I
297 finished the integration work neceesary to include 'foo' in the
298 'cygutils' package, as previously agreed on this list." Paste
299 the ChangeLog into that notice. But do NOT send the patch or
300 tarball to the mailing list.
301
302 Instead, send that to ME, cwilson@ece.gatech.edu. The patch
303 and tarball should be attachments, but paste the ChangeLog entry
304 into the body of the message. Do NOT paste your patch into the
305 body of the email; most mail programs will horrendously distort
306 it if you do). Also, be sure and warn of any special link
307 requirements (cf. section 5a and 5b above).
308
309 12) Bask in the glow of a job well done.
310
311 --
312 Chuck Wilson
313 cygutils maintainer
314
315 Note to self: how to commit contributions:
316 apply the patch
317 untar the contribution
318 Add the Changelog entry
319 ./bootstrap
320 cvs add src/directory
321 cvs add src/directory/srcfiles
322 cvs commit -m "Add foo contribution"
323 ./bootstrap
324 cvs diff | grep Index > foo
325 >>> use 'foo' to add another Changelog entry
326 cvs commit -m "Add foo contribution"
327 cvs tag something
328
This page took 0.05255 seconds and 6 git commands to generate.