*** empty log message ***
[bpt/guile.git] / HACKING
1 Guile Hacking Guide
2 Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001 Free software Foundation, Inc.
3
4 Permission is granted to anyone to make or distribute verbatim copies
5 of this document as received, in any medium, provided that the
6 copyright notice and permission notice are preserved,
7 and that the distributor grants the recipient permission
8 for further redistribution as permitted by this notice.
9
10 Permission is granted to distribute modified versions
11 of this document, or of portions of it,
12 under the above conditions, provided also that they
13 carry prominent notices stating who last changed them,
14 and that any new or changed statements about the activities
15 of the Free Software Foundation are approved by the Foundation.
16
17
18 What to Hack =========================================================
19
20 You can hack whatever you want, thank GNU.
21
22 However, to see what others have indicated as their interest (and avoid
23 potential wasteful duplication of effort), see file TODO. Note that
24 the version you find may be out of date; a CVS checkout is recommended
25 (see also file SNAPSHOTS).
26
27 It's also a good idea to join the guile-devel@gnu.org mailing list.
28 See http://www.gnu.org/software/guile/mail/mail.html for more info.
29
30
31 Hacking It Yourself ==================================================
32
33 As distributed, Guile needs only an ANSI C compiler and a Unix system
34 to compile. However, Guile's makefiles, configuration scripts, and a
35 few other files are automatically generated, not written by hand. If
36 you want to make changes to the system (which we encourage!) you will
37 find it helpful to have the tools we use to develop Guile. They
38 are the following:
39
40 Autoconf 2.50 --- a system for automatically generating `configure'
41 scripts from templates which list the non-portable features a
42 program would like to use. Available in
43 "ftp://ftp.gnu.org/pub/gnu/autoconf"
44
45 Automake 1.4-p2 --- a system for automatically generating Makefiles that
46 conform to the (rather Byzantine) GNU coding standards. The
47 nice thing is that it takes care of hairy targets like 'make
48 dist' and 'make distclean', and automatically generates
49 Makefile dependencies. Automake is available in
50 "ftp://ftp.gnu.org/pub/gnu/automake"
51
52 Before using automake, you may need to copy `threads.m4' and
53 `guile.m4' from the top directory of the Guile core disty to
54 `/usr/local/share/aclocal.
55
56 libtool 1.4 --- a system for managing the zillion hairy options needed
57 on various systems to produce shared libraries. Available in
58 "ftp://ftp.gnu.org/pub/gnu/libtool"
59
60 flex 2.5.4 (or newer) --- a scanner generator. earlier versions will
61 most probably work too.
62
63 You are lost in a little maze of automatically generated files, all
64 different.
65
66
67 Contributing Your Changes ============================================
68
69 - If you have put together a change that meets the coding standards
70 described below, we encourage you to submit it to Guile. The best
71 place to post it is guile-devel@gnu.org. Please don't send it
72 directly to me; I often don't have time to look things over. If you
73 have tested your change, then you don't need to be shy.
74
75 - Please submit patches using either context or unified diffs (diff -c
76 or diff -u). Don't include a patch for ChangeLog; such patches don't
77 apply cleanly, since we've probably changed the top of ChangeLog too.
78 Instead, provide the unaltered text at the top of your patch.
79
80 Please don't include patches for generated files like configure,
81 aclocal.m4, or any Makefile.in. Such patches are often large, and
82 we're just going to regenerate those files anyway.
83
84
85 CVS conventions ======================================================
86
87 - We use CVS to manage the Guile sources. The repository lives on
88 subversions.gnu.org, in /cvs; you will need an
89 account on that machine to access the repository. Also, for security
90 reasons, subversions presently only supports CVS connections via the SSH
91 protocol, so you must first install the SSH client. Then, you should
92 set your CVS_RSH environment variable to ssh, and use the following as
93 your CVS root:
94
95 :ext:USER@subversions.gnu.org:/cvs
96
97 Either set your CVSROOT environment variable to that, or give it as
98 the value of the global -d option to CVS when you check out a working
99 directory.
100
101 For more information on SSH, see http://www.cs.hut.fi/ssh.
102
103 The Guile sources live in several modules:
104
105 - guile-core --- the interpreter, QuickThreads, and ice-9
106 - guile-tcltk --- the Guile/Tk interface
107 - guile-tk --- the new Guile/Tk interface, based on STk's modified Tk
108 - guile-rgx-ctax --- the Guile/Rx interface, and the ctax implementation
109 - guile-scsh --- the port of SCSH to guile, talk to Gary Houston
110 - guile-www --- A Guile module for making HTTP requests.
111
112 There is a mailing list for CVS commit messages; see README for details.
113
114 - We check Makefile.am and configure.in files into CVS, but the
115 "autogen.sh" script must be run from the top-level to generate the
116 actual "configure" script that then must be run to create the various
117 Makefile-s to build guile. The general rule is that you should be able
118 to check out a working directory of Guile from CVS, and then type
119 "./autogen.sh", then "configure", and finally "make". No
120 automatically generated files should be checked into the CVS
121 repository.
122
123 - The .cvsignore file is contained in the repository, to provide a
124 reasonable list of auto-generated files that should not be checked in.
125 This, however, prohibits one from having local additions to the
126 .cvsignore file (yes, you can modify it and never check it in, but
127 that doesn't seem to be a good solution to me). To get around this
128 problem, you might want to patch your cvs program so that it uses a
129 .cvsignore-local file (say) instead of the one from the repository. A
130 patch for this can be found at the very end of this file.
131
132 - (Automake 1.4 only) Be sure to run automake at the top of the tree
133 with no arguments. Do not use `automake Makefile' to regenerate
134 specific Makefile.in files, and do not trust the Makefile rules to
135 rebuild them when they are out of date. Automake 1.4 will add
136 extraneous rules to the top-level Makefile if you specify specific
137 Makefiles to rebuild on the command line. Running the command
138 `autoreconf --force' should take care of everything correctly.
139
140 - Make sure your changes compile and work, at least on your own
141 machine, before checking them into the main branch of the Guile
142 repository. If you really need to check in untested changes, make a
143 branch.
144
145 - Include each log entry in both the ChangeLog and in the CVS logs.
146 If you're using Emacs, the pcl-cvs interface to CVS has features to
147 make this easier; it checks the ChangeLog, and generates good default
148 CVS log entries from that.
149
150
151 Coding standards =====================================================
152
153 - Before contributing larger amounts of code to Guile, please read the
154 documents in `guile-core/devel/policy' in the CVS source tree.
155
156 - As for any part of Project GNU, changes to Guile should follow the
157 GNU coding standards. The standards are available via anonymous FTP
158 from prep.ai.mit.edu, as /pub/gnu/standards/standards.texi and
159 make-stds.texi.
160
161 - The Guile tree should compile without warnings under the following
162 GCC switches, which are the default in the current configure script:
163
164 -O2 -Wall -Wpointer-arith -Wmissing-prototypes
165
166 Note that the warnings generated vary from one version of GCC to the
167 next, and from one architecture to the next (apparently). To provide
168 a concrete common standard, Guile should compile without warnings from
169 GCC 2.7.2.3 in a Red Hat 5.2 i386 Linux machine. Furthermore, each
170 developer should pursue any additional warnings noted by on their
171 compiler. This means that people using more stringent compilers will
172 have more work to do, and assures that everyone won't switch to the
173 most lenient compiler they can find. :)
174
175 Note also that EGCS (as of November 3 1998) doesn't handle the
176 `noreturn' attribute properly, so it doesn't understand that functions
177 like scm_error won't return. This may lead to some silly warnings
178 about uninitialized variables. You should look into these warnings to
179 make sure they are indeed spurious, but you needn't correct warnings
180 caused by this EGCS bug.
181
182 - If you add code which uses functions or other features that are not
183 entirely portable, please make sure the rest of Guile will still
184 function properly on systems where they are missing. This usually
185 entails adding a test to configure.in, and then adding #ifdefs to your
186 code to disable it if the system's features are missing.
187
188 - The normal way of removing a function, macro or variable is to mark
189 it as "deprecated", keep it for a while, and remove it in a later
190 release. If a function or macro is marked as "deprecated" it
191 indicates that people shouldn't use it in new programs, and should try
192 to remove it in old. Make sure that an alternative exists unless it
193 is our purpose to remove functionality. Don't deprecate definitions
194 if it is unclear when they will be removed. (This is to ensure that a
195 valid way of implementing some functionality always exists.)
196
197 When deprecating a definition, always follow this procedure:
198
199 1. Mark the definition using
200
201 #if (SCM_DEBUG_DEPRECATED == 0)
202 ...
203 #endif
204
205 or, for Scheme code, wrap it using
206
207 (begin-deprecated
208 ...)
209
210 2. Make the deprecated code issue a warning when it is used, by using
211 scm_c_issue_deprecation_warning (in C) or issue-deprecation-warning
212 (in Scheme).
213
214 3. Write a comment at the definition explaining how a programmer can
215 manage without the deprecated definition.
216
217 4. Add an entry that the definition has been deprecated in NEWS and
218 explain what do do instead.
219
220 5. In file TODO, there is a list of releases with reminders about what
221 to do at each release. Add a reminder about the removal of the
222 deprecated defintion at the appropriate release.
223
224 - When you make a user-visible change (i.e. one that should be
225 documented, and appear in NEWS, put an asterisk in column zero of the
226 start of the ChangeLog entry, like so:
227
228 Sat Aug 3 01:27:14 1996 Gary Houston <ghouston@actrix.gen.nz>
229
230 * * fports.c (scm_open_file): don't return #f, throw error.
231
232 When you've written a NEWS entry and updated the documentation, go
233 ahead and remove the asterisk. I will use the asterisks to find and
234 document changes that haven't been dealt with before a release.
235
236 - Please write log entries for functions written in C under the
237 functions' C names, and write log entries for functions written in
238 Scheme under the functions' Scheme names. Please don't do this:
239
240 * procs.c, procs.h (procedure-documentation): Moved from eval.c.
241
242 Entries like this make it harder to search the ChangeLogs, because you
243 can never tell which name the entry will refer to. Instead, write this:
244
245 * procs.c, procs.h (scm_procedure_documentation): Moved from eval.c.
246
247 Changes like adding this line are special:
248
249 SCM_PROC (s_map_in_order, "map-in-order", 2, 0, 1, scm_map);
250
251 Since the change here is about the name itself --- we're adding a new
252 alias for scm_map that guarantees the order in which we process list
253 elements, but we're not changing scm_map at all --- it's appropriate
254 to use the Scheme name in the log entry.
255
256 - There's no need to keep a change log for documentation files. This
257 is because documentation is not susceptible to bugs that are hard to
258 fix. Documentation does not consist of parts that must interact in a
259 precisely engineered fashion; to correct an error, you need not know
260 the history of the erroneous passage. (This is copied from the GNU
261 coding standards.)
262
263 - Make sure you have papers from people before integrating their
264 changes or contributions. This is very frustrating, but very
265 important to do right. From maintain.texi, "Information for
266 Maintainers of GNU Software":
267
268 When incorporating changes from other people, make sure to follow the
269 correct procedures. Doing this ensures that the FSF has the legal
270 right to distribute and defend GNU software.
271
272 For the sake of registering the copyright on later versions ofthe
273 software you need to keep track of each person who makes significant
274 changes. A change of ten lines or so, or a few such changes, in a
275 large program is not significant.
276
277 *Before* incorporating significant changes, make sure that the person
278 has signed copyright papers, and that the Free Software Foundation has
279 received them.
280
281 If you receive contributions you want to use from someone, let me know
282 and I'll take care of the administrivia. Put the contributions aside
283 until we have the necessary papers.
284
285 Once you accept a contribution, be sure to keep the files AUTHORS and
286 THANKS uptodate.
287
288 - When you make substantial changes to a file, add the current year to
289 the list of years in the copyright notice at the top of the file.
290
291 - When you get bug reports or patches from people, be sure to list
292 them in THANKS.
293
294
295 Naming conventions =================================================
296
297 We use certain naming conventions to structure the considerable number
298 of global identifiers. All identifiers should be either all lower
299 case or all upper case. Syllables are separated by underscores `_'.
300 All non-static identifiers should start with scm_ or SCM_. Then might
301 follow zero or more syllables giving the category of the identifier.
302 The currently used category identifiers are
303
304 t - type name
305
306 c,C - something with a interface suited for C use. This is used
307 to name functions that behave like Scheme primitives but
308 have a more C friendly calling convention.
309
310 i,I - internal to libguile. It is global, but not considered part
311 of the libguile API.
312
313 f - a SCM variable pointing to a Scheme function object.
314
315 F - a bit mask for a flag.
316
317 m - a macro transformer procedure
318
319 n,N - a count of something
320
321 s - a constant C string
322
323 k - a SCM variable pointing to a keyword.
324
325 sym - a SCM variable pointing to a symbol.
326
327 var - a SCM variable pointing to a variable object.
328
329 The follwing syllables also have a technical meaning:
330
331 str - this denotes a zero terminated C string
332
333 mem - a C string with an explicit count
334
335
336 See also the file `devel/names.text'.
337
338
339 Helpful hints ========================================================
340
341 - [From Mikael Djurfeldt] When working on the Guile internals, it is
342 quite often practical to implement a scheme-level procedure which
343 helps you examine the feature you're working on.
344
345 Examples of such procedures are: pt-size, debug-hand and
346 current-pstate.
347
348 I've now put #ifdef GUILE_DEBUG around all such procedures, so that
349 they are not compiled into the "normal" Guile library. Please do the
350 same when you add new procedures/C functions for debugging purpose.
351
352 You can define the GUILE_DEBUG flag by passing --enable-guile-debug to
353 the configure script.
354
355 - You'll see uses of the macro SCM_P scattered throughout the code;
356 those are vestiges of a time when Guile was meant to compile on
357 pre-ANSI compilers. Guile now requires ANSI C, so when you write new
358 functions, feel free to use ANSI declarations, and please provide
359 prototypes for everything. You don't need to use SCM_P in new code.
360
361
362 Jim Blandy, and others
363
364
365 Patches ===========================================================
366
367 This one makes cvs-1.10 consider the file $CVSDOTIGNORE instead of
368 .cvsignore when that environment variable is set.
369
370 === patch start ===
371 diff -r -u cvs-1.10/src/cvs.h cvs-1.10.ignore-hack/src/cvs.h
372 --- cvs-1.10/src/cvs.h Mon Jul 27 04:54:11 1998
373 +++ cvs-1.10.ignore-hack/src/cvs.h Sun Jan 23 12:58:09 2000
374 @@ -516,7 +516,7 @@
375
376 extern int ign_name PROTO ((char *name));
377 void ign_add PROTO((char *ign, int hold));
378 -void ign_add_file PROTO((char *file, int hold));
379 +int ign_add_file PROTO((char *file, int hold));
380 void ign_setup PROTO((void));
381 void ign_dir_add PROTO((char *name));
382 int ignore_directory PROTO((char *name));
383 diff -r -u cvs-1.10/src/ignore.c cvs-1.10.ignore-hack/src/ignore.c
384 --- cvs-1.10/src/ignore.c Mon Sep 8 01:04:15 1997
385 +++ cvs-1.10.ignore-hack/src/ignore.c Sun Jan 23 12:57:50 2000
386 @@ -99,9 +99,9 @@
387 /*
388 * Open a file and read lines, feeding each line to a line parser. Arrange
389 * for keeping a temporary list of wildcards at the end, if the "hold"
390 - * argument is set.
391 + * argument is set. Return true when the file exists and has been handled.
392 */
393 -void
394 +int
395 ign_add_file (file, hold)
396 char *file;
397 int hold;
398 @@ -149,8 +149,8 @@
399 if (fp == NULL)
400 {
401 if (! existence_error (errno))
402 - error (0, errno, "cannot open %s", file);
403 - return;
404 + error (0, errno, "cannot open %s", file);
405 + return 0;
406 }
407 while (getline (&line, &line_allocated, fp) >= 0)
408 ign_add (line, hold);
409 @@ -159,6 +159,7 @@
410 if (fclose (fp) < 0)
411 error (0, errno, "cannot close %s", file);
412 free (line);
413 + return 1;
414 }
415
416 /* Parse a line of space-separated wildcards and add them to the list. */
417 @@ -375,6 +376,7 @@
418 struct stat sb;
419 char *file;
420 char *xdir;
421 + char *cvsdotignore;
422
423 /* Set SUBDIRS if we have subdirectory information in ENTRIES. */
424 if (entries == NULL)
425 @@ -397,7 +399,10 @@
426 if (dirp == NULL)
427 return;
428
429 - ign_add_file (CVSDOTIGNORE, 1);
430 + cvsdotignore = getenv("CVSDOTIGNORE");
431 + if (cvsdotignore == NULL || !ign_add_file (cvsdotignore, 1))
432 + ign_add_file (CVSDOTIGNORE, 1);
433 +
434 wrap_add_file (CVSDOTWRAPPER, 1);
435
436 while ((dp = readdir (dirp)) != NULL)
437 === patch end ===
438
439 This one is for pcl-cvs-2.9.2, so that `i' adds to the local
440 .cvsignore file.
441
442 === patch start ===
443 --- pcl-cvs.el~ Mon Nov 1 12:33:46 1999
444 +++ pcl-cvs.el Tue Jan 25 21:46:27 2000
445 @@ -1177,7 +1177,10 @@
446 "Append the file in FILEINFO to the .cvsignore file.
447 Can only be used in the *cvs* buffer."
448 (save-window-excursion
449 - (set-buffer (find-file-noselect (expand-file-name ".cvsignore" dir)))
450 + (set-buffer (find-file-noselect
451 + (expand-file-name (or (getenv "CVSDOTIGNORE")
452 + ".cvsignore")
453 + dir)))
454 (goto-char (point-max))
455 (unless (zerop (current-column)) (insert "\n"))
456 (insert str "\n")
457 === patch end ===