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