diff options
author | Gary Houston <ghouston@arglist.com> | 2001-11-22 22:03:43 +0000 |
---|---|---|
committer | Gary Houston <ghouston@arglist.com> | 2001-11-22 22:03:43 +0000 |
commit | c08a1190cf41160c5cb8be20dfb2426a2a16febe (patch) | |
tree | 67f4824675f0524ff7740d132b32037ba12ce530 /HACKING | |
parent | 80074d779928496901d42dbbb3ba8410c1b0d17c (diff) |
HACKING, README, ANON-CVS: updates.
Diffstat (limited to 'HACKING')
-rw-r--r-- | HACKING | 637 |
1 files changed, 0 insertions, 637 deletions
@@ -1,637 +0,0 @@ --*-text-*- -Guile Hacking Guide -Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001 Free software Foundation, Inc. - - Permission is granted to anyone to make or distribute verbatim copies - of this document as received, in any medium, provided that the - copyright notice and permission notice are preserved, - and that the distributor grants the recipient permission - for further redistribution as permitted by this notice. - - Permission is granted to distribute modified versions - of this document, or of portions of it, - under the above conditions, provided also that they - carry prominent notices stating who last changed them, - and that any new or changed statements about the activities - of the Free Software Foundation are approved by the Foundation. - - -What to Hack ========================================================= - -You can hack whatever you want, thank GNU. - -However, to see what others have indicated as their interest (and avoid -potential wasteful duplication of effort), see file TODO. Note that -the version you find may be out of date; a CVS checkout is recommended: -see below for details (see also file SNAPSHOTS). - -It's also a good idea to join the guile-devel@gnu.org mailing list. -See http://www.gnu.org/software/guile/mail/mail.html for more info. - - -Hacking It Yourself ================================================== - -When Guile is obtained from CVS, a few extra steps must be taken -before the usual configure, make, make install. You will need to have -up-to-date versions of the tools listed below, correctly installed. -i.e., they must be found in the current PATH and not shadowed or -otherwise broken by files left behind from older versions. - -"up-to-date" means the latest released versions at the time that Guile -was obtained from CVS. Sometimes older versions will work. - -Then you must run the autogen.sh script, as described below. - -In case of problems, it may be worth getting a fresh copy of Guile -from CVS: synchronisation problems have been known to occur -occasionally. - -Autoconf --- a system for automatically generating `configure' - scripts from templates which list the non-portable features a - program would like to use. Available in - "ftp://ftp.gnu.org/pub/gnu/autoconf" - -Automake --- a system for automatically generating Makefiles that - conform to the (rather Byzantine) GNU coding standards. The - nice thing is that it takes care of hairy targets like 'make - dist' and 'make distclean', and automatically generates - Makefile dependencies. Automake is available in - "ftp://ftp.gnu.org/pub/gnu/automake" - -libtool --- a system for managing the zillion hairy options needed - on various systems to produce shared libraries. Available in - "ftp://ftp.gnu.org/pub/gnu/libtool" - -flex --- a scanner generator. It's probably not essential to have the - latest version. - -One false move and you will be lost in a little maze of automatically -generated files, all different. - - -Sample GDB Initialization File========================================= - -Here is a sample .gdbinit posted by Bill Schottstaedt (modified to -use `set' instead of `call' in some places): - - define gp - set gdb_print($arg0) - print gdb_output - end - document gp - Executes (object->string arg) - end - - define ge - call gdb_read($arg0) - call gdb_eval(gdb_result) - set gdb_print(gdb_result) - print gdb_output - end - document ge - Executes (print (eval (read arg))): ge "(+ 1 2)" => 3 - end - - define gh - call g_help(scm_str2symbol($arg0), 20) - set gdb_print($1) - print gdb_output - end - document gh - Prints help string for arg: gh "enved-target" - end - -Bill further writes: - - so in gdb if you see something useless like: - - #32 0x081ae8f4 in scm_primitive_load (filename=1112137128) at load.c:129 - - You can get the file name with gp: - - (gdb) gp 1112137128 - $1 = 0x40853fac "\"/home/bil/test/share/guile/1.5.0/ice-9/session.scm\"" - - -Contributing Your Changes ============================================ - -- If you have put together a change that meets the coding standards -described below, we encourage you to submit it to Guile. The best -place to post it is guile-devel@gnu.org. Please don't send it -directly to me; I often don't have time to look things over. If you -have tested your change, then you don't need to be shy. - -- Please submit patches using either context or unified diffs (diff -c -or diff -u). Don't include a patch for ChangeLog; such patches don't -apply cleanly, since we've probably changed the top of ChangeLog too. -Instead, provide the unaltered text at the top of your patch. - -- For proper credit, also make sure you update the AUTHORS file -(for new files for which you've assigned copyright to the FSF), or -the THANKS file (for everything else). - -Please don't include patches for generated files like configure, -aclocal.m4, or any Makefile.in. Such patches are often large, and -we're just going to regenerate those files anyway. - - -CVS conventions ====================================================== - -- We use CVS to manage the Guile sources. The repository lives on -subversions.gnu.org, in /cvs; you will need an -account on that machine to access the repository. Also, for security -reasons, subversions presently only supports CVS connections via the SSH -protocol, so you must first install the SSH client. Then, you should -set your CVS_RSH environment variable to ssh, and use the following as -your CVS root: - - :ext:USER@subversions.gnu.org:/cvs - -Either set your CVSROOT environment variable to that, or give it as -the value of the global -d option to CVS when you check out a working -directory. - -For more information on SSH, see http://www.cs.hut.fi/ssh. - -The Guile sources live in several modules: - - - guile-core --- the interpreter, QuickThreads, and ice-9 - - guile-tcltk --- the Guile/Tk interface - - guile-tk --- the new Guile/Tk interface, based on STk's modified Tk - - guile-rgx-ctax --- the Guile/Rx interface, and the ctax implementation - - guile-scsh --- the port of SCSH to guile, talk to Gary Houston - - guile-www --- A Guile module for making HTTP requests. - - guile-statprof --- an experimental statistical profiler. - -There is a mailing list for CVS commit messages; see README for details. - -- The guile-core tree is now versioned similarly to the Linux kernel. -Guile now always uses three numbers to represent the version, -i.e. "1.6.5". The first number, 1, is the major version number, the -second number, 6, is the minor version number, and the third number, -5, is the micro version number. Changes in major version number -indicate major changes in Guile. - -Minor version numbers that are even denote stable releases, and odd -minor version numbers denote development versions (which may be -unstable). The micro version number indicates a minor sub-revision of -a given MAJOR.MINOR release. - -- A default CVS checkout will get the current unstable development -tree. However, for each stable release, a CVS branch is created so -that release (and ongoing maintenance) of the stable version can -proceed independent of the development of the next unstable version. -To check out a particular stable branch, you just need to specify "-r -branch_release-X-Y" to your CVS checkout command (or to any update). -For example, if you wanted to check out the 1.6 stable branch, you -would specify "-r branch_release-1-6". - -So, for example, during a normal development cycle, work will proceed -on an unstable version, say 1.5.X, until it is decided that it's time -for a stable release. At that point, a branch named -branch_release-1-6 will be created, and the version numbers on the -HEAD of the CVS tree (the trunk, i.e. what you get by default), will -be changed to reflect the new unstable version 1.7.X. Then unstable -development will proceed on the unstable version, while the stable -1.5.X branch is fixed up for the eventual 1.6.0 release. - -Anytime you want to yank an existing checked out tree to the stable -branch, you can run a command like this: - - cvs -z3 update -r branch_release-1-6 -Pd - -This will yank the working directory over on to the stable release -branch. Note that this directory will track that branch from then on -unless you do something to yank it back to the main (unstable) trunk. - -To go back to the unstable branch, you can use - - cvs -z3 update -A -Pd - -Note that in either case, you should probably make sure you've -commited or removed all local changes before running the commands or -you're likely to have some unexpected results. - -Finally note that one approach, should you need to work on both -branches, is to keep two trees checked out, one stable, the other -unstable and you can work in whichever is appropriate. - -To save some initial bandwidth, you can check out either the stable -tree or the unstable tree, and then do something like this: - - cp -a core-unstable core-1.5 - cd core-1.5 - cvs -z3 update -r branch_release-1-6 -Pd - -- The stable and unstable CVS trees are distinct, and no changes will -automatically propagate between them. If you make changes that need -to show up both places, you'll need to apply the changes both places. -You *might* be able to do this with a cvs command, but often you'll -probably need to apply the changes by hand or risk migrating -superfluous modifications between the two versions. This is -particularly important when moving a change from the unstable branch -to the stable branch. - -- In general, please don't be adventurous with the stable branch. We -mostly want bugfixes, documentation improvements, build improvements, -etc., though exceptions will doubtless exist. - -- There are a few CVS tagging conventions which follow the Scheme -convention that dashes are used to separate words within a single -symbol, and so dashes bind more tightly than underscores. This means -that foo-bar_baz-bax indicates that foo-bar is somehow separate from -baz-bax. The conventions are as follows: - - Branch root tags: - ----------------- - anytime just before you create a branch it's a good - idea to create a normal tag so that you can refer to the branch point - on the main trunk as well as on the branch. So please use a tag of - the form - - branch-root-release-1-X - - or more generally, for other non-release branches: - - branch-root_FOO - - Branch tags: - ------------ - for the branch tag itself please use - - branch_release-1-6 - - or more generally, for other non-release branches: - - branch_FOO - - Merge tags: - ----------- - Whenever you're merging a branch back into the trunk (or into another - branch repeatedly) you need to tag the branch each time you merge. If - you don't do that, you won't be able to merge repeatedly without - possibly tedious conflicts. For those tags, we suggest: - - branch-merge_SOME-FOO_to_SOME-BAR_1 - branch-merge_SOME-FOO_to_SOME-BAR_2 - .. - - As an example, SOME-BAR might be trunk, or even perhaps another branch - like branch-mvo-super-fixes :> - - More mundanely, you might have - - branch-merge_release-1-6_to_trunk_1 - - (Merging the stable branch to the trunk like this - will probably be much more common, when it happens, than the - reverse for the reasons mentioned above. - - Release tags: - ------------- - When releasing a new version of guile, please use: - - release_X-Y-Z - - i.e. - - release_1-6-0 - -- If you hack on a stable branch, please apply any relevant patches or -fixes to the current unstable version (the main CVS trunk) as well. -Similarly, please back-port any important fixes to the unstable CVS -tree to the current stable branch. - -- We check Makefile.am and configure.in files into CVS, but the -"autogen.sh" script must be run from the top-level to generate the -actual "configure" script that then must be run to create the various -Makefile-s to build guile. The general rule is that you should be able -to check out a working directory of Guile from CVS, and then type -"./autogen.sh", then "configure", and finally "make". No -automatically generated files should be checked into the CVS -repository. - -- The .cvsignore file is contained in the repository, to provide a -reasonable list of auto-generated files that should not be checked in. -This, however, prohibits one from having local additions to the -.cvsignore file (yes, you can modify it and never check it in, but -that doesn't seem to be a good solution to me). To get around this -problem, you might want to patch your cvs program so that it uses a -.cvsignore-local file (say) instead of the one from the repository. A -patch for this can be found at the very end of this file. - -- (Automake 1.4 only) Be sure to run automake at the top of the tree -with no arguments. Do not use `automake Makefile' to regenerate -specific Makefile.in files, and do not trust the Makefile rules to -rebuild them when they are out of date. Automake 1.4 will add -extraneous rules to the top-level Makefile if you specify specific -Makefiles to rebuild on the command line. Running the command -`autoreconf --force' should take care of everything correctly. - -- Make sure your changes compile and work, at least on your own -machine, before checking them into the main branch of the Guile -repository. If you really need to check in untested changes, make a -branch. - -- Include each log entry in both the ChangeLog and in the CVS logs. -If you're using Emacs, the pcl-cvs interface to CVS has features to -make this easier; it checks the ChangeLog, and generates good default -CVS log entries from that. - - -Coding standards ===================================================== - -- Before contributing larger amounts of code to Guile, please read the -documents in `guile-core/devel/policy' in the CVS source tree. - -- As for any part of Project GNU, changes to Guile should follow the -GNU coding standards. The standards are available via anonymous FTP -from prep.ai.mit.edu, as /pub/gnu/standards/standards.texi and -make-stds.texi. - -- The Guile tree should compile without warnings under the following -GCC switches, which are the default in the current configure script: - - -O2 -Wall -Wpointer-arith -Wmissing-prototypes - -To make sure of this, you can use the --enable-error-on-warning option -to configure. This option will make GCC fail if it hits a warning. - -Note that the warnings generated vary from one version of GCC to the -next, and from one architecture to the next (apparently). To provide -a concrete common standard, Guile should compile without warnings from -GCC 2.7.2.3 in a Red Hat 5.2 i386 Linux machine. Furthermore, each -developer should pursue any additional warnings noted by on their -compiler. This means that people using more stringent compilers will -have more work to do, and assures that everyone won't switch to the -most lenient compiler they can find. :) - -Note also that EGCS (as of November 3 1998) doesn't handle the -`noreturn' attribute properly, so it doesn't understand that functions -like scm_error won't return. This may lead to some silly warnings -about uninitialized variables. You should look into these warnings to -make sure they are indeed spurious, but you needn't correct warnings -caused by this EGCS bug. - -- If you add code which uses functions or other features that are not -entirely portable, please make sure the rest of Guile will still -function properly on systems where they are missing. This usually -entails adding a test to configure.in, and then adding #ifdefs to your -code to disable it if the system's features are missing. - -- The normal way of removing a function, macro or variable is to mark -it as "deprecated", keep it for a while, and remove it in a later -release. If a function or macro is marked as "deprecated" it -indicates that people shouldn't use it in new programs, and should try -to remove it in old. Make sure that an alternative exists unless it -is our purpose to remove functionality. Don't deprecate definitions -if it is unclear when they will be removed. (This is to ensure that a -valid way of implementing some functionality always exists.) - -When deprecating a definition, always follow this procedure: - -1. Mark the definition using - - #if (SCM_DEBUG_DEPRECATED == 0) - ... - #endif - - or, for Scheme code, wrap it using - - (begin-deprecated - ...) - -2. Make the deprecated code issue a warning when it is used, by using - scm_c_issue_deprecation_warning (in C) or issue-deprecation-warning - (in Scheme). - -3. Write a comment at the definition explaining how a programmer can - manage without the deprecated definition. - -4. Add an entry that the definition has been deprecated in NEWS and - explain what do do instead. - -5. In file TODO, there is a list of releases with reminders about what - to do at each release. Add a reminder about the removal of the - deprecated defintion at the appropriate release. - -- Please write log entries for functions written in C under the -functions' C names, and write log entries for functions written in -Scheme under the functions' Scheme names. Please don't do this: - - * procs.c, procs.h (procedure-documentation): Moved from eval.c. - -Entries like this make it harder to search the ChangeLogs, because you -can never tell which name the entry will refer to. Instead, write this: - - * procs.c, procs.h (scm_procedure_documentation): Moved from eval.c. - -Changes like adding this line are special: - - SCM_PROC (s_map_in_order, "map-in-order", 2, 0, 1, scm_map); - -Since the change here is about the name itself --- we're adding a new -alias for scm_map that guarantees the order in which we process list -elements, but we're not changing scm_map at all --- it's appropriate -to use the Scheme name in the log entry. - -- There's no need to keep a change log for a ChangeLog file. For any -other kind of file (including documentation, since our documentation -is indeed precisely engineered -- we surpass GNU standards here), add -an appropriate ChangeLog entry when you change it. Simple! - -- Make sure you have papers from people before integrating their -changes or contributions. This is very frustrating, but very -important to do right. From maintain.texi, "Information for -Maintainers of GNU Software": - - When incorporating changes from other people, make sure to follow the - correct procedures. Doing this ensures that the FSF has the legal - right to distribute and defend GNU software. - - For the sake of registering the copyright on later versions ofthe - software you need to keep track of each person who makes significant - changes. A change of ten lines or so, or a few such changes, in a - large program is not significant. - - *Before* incorporating significant changes, make sure that the person - has signed copyright papers, and that the Free Software Foundation has - received them. - -If you receive contributions you want to use from someone, let me know -and I'll take care of the administrivia. Put the contributions aside -until we have the necessary papers. - -Once you accept a contribution, be sure to keep the files AUTHORS and -THANKS uptodate. - -- When you make substantial changes to a file, add the current year to -the list of years in the copyright notice at the top of the file. - -- When you get bug reports or patches from people, be sure to list -them in THANKS. - - -Naming conventions ================================================= - -We use certain naming conventions to structure the considerable number -of global identifiers. All identifiers should be either all lower -case or all upper case. Syllables are separated by underscores `_'. -All non-static identifiers should start with scm_ or SCM_. Then might -follow zero or more syllables giving the category of the identifier. -The currently used category identifiers are - - t - type name - - c,C - something with a interface suited for C use. This is used - to name functions that behave like Scheme primitives but - have a more C friendly calling convention. - - i,I - internal to libguile. It is global, but not considered part - of the libguile API. - - f - a SCM variable pointing to a Scheme function object. - - F - a bit mask for a flag. - - m - a macro transformer procedure - - n,N - a count of something - - s - a constant C string - - k - a SCM variable pointing to a keyword. - - sym - a SCM variable pointing to a symbol. - - var - a SCM variable pointing to a variable object. - -The follwing syllables also have a technical meaning: - - str - this denotes a zero terminated C string - - mem - a C string with an explicit count - - -See also the file `devel/names.text'. - - -Helpful hints ======================================================== - -- [From Mikael Djurfeldt] When working on the Guile internals, it is -quite often practical to implement a scheme-level procedure which -helps you examine the feature you're working on. - -Examples of such procedures are: pt-size, debug-hand and -current-pstate. - -I've now put #ifdef GUILE_DEBUG around all such procedures, so that -they are not compiled into the "normal" Guile library. Please do the -same when you add new procedures/C functions for debugging purpose. - -You can define the GUILE_DEBUG flag by passing --enable-guile-debug to -the configure script. - -- You'll see uses of the macro SCM_P scattered throughout the code; -those are vestiges of a time when Guile was meant to compile on -pre-ANSI compilers. Guile now requires ANSI C, so when you write new -functions, feel free to use ANSI declarations, and please provide -prototypes for everything. You don't need to use SCM_P in new code. - - -Jim Blandy, and others - - -Patches =========================================================== - -This one makes cvs-1.10 consider the file $CVSDOTIGNORE instead of -.cvsignore when that environment variable is set. - -=== patch start === -diff -r -u cvs-1.10/src/cvs.h cvs-1.10.ignore-hack/src/cvs.h ---- cvs-1.10/src/cvs.h Mon Jul 27 04:54:11 1998 -+++ cvs-1.10.ignore-hack/src/cvs.h Sun Jan 23 12:58:09 2000 -@@ -516,7 +516,7 @@ - - extern int ign_name PROTO ((char *name)); - void ign_add PROTO((char *ign, int hold)); --void ign_add_file PROTO((char *file, int hold)); -+int ign_add_file PROTO((char *file, int hold)); - void ign_setup PROTO((void)); - void ign_dir_add PROTO((char *name)); - int ignore_directory PROTO((char *name)); -diff -r -u cvs-1.10/src/ignore.c cvs-1.10.ignore-hack/src/ignore.c ---- cvs-1.10/src/ignore.c Mon Sep 8 01:04:15 1997 -+++ cvs-1.10.ignore-hack/src/ignore.c Sun Jan 23 12:57:50 2000 -@@ -99,9 +99,9 @@ - /* - * Open a file and read lines, feeding each line to a line parser. Arrange - * for keeping a temporary list of wildcards at the end, if the "hold" -- * argument is set. -+ * argument is set. Return true when the file exists and has been handled. - */ --void -+int - ign_add_file (file, hold) - char *file; - int hold; -@@ -149,8 +149,8 @@ - if (fp == NULL) - { - if (! existence_error (errno)) -- error (0, errno, "cannot open %s", file); -- return; -+ error (0, errno, "cannot open %s", file); -+ return 0; - } - while (getline (&line, &line_allocated, fp) >= 0) - ign_add (line, hold); -@@ -159,6 +159,7 @@ - if (fclose (fp) < 0) - error (0, errno, "cannot close %s", file); - free (line); -+ return 1; - } - - /* Parse a line of space-separated wildcards and add them to the list. */ -@@ -375,6 +376,7 @@ - struct stat sb; - char *file; - char *xdir; -+ char *cvsdotignore; - - /* Set SUBDIRS if we have subdirectory information in ENTRIES. */ - if (entries == NULL) -@@ -397,7 +399,10 @@ - if (dirp == NULL) - return; - -- ign_add_file (CVSDOTIGNORE, 1); -+ cvsdotignore = getenv("CVSDOTIGNORE"); -+ if (cvsdotignore == NULL || !ign_add_file (cvsdotignore, 1)) -+ ign_add_file (CVSDOTIGNORE, 1); -+ - wrap_add_file (CVSDOTWRAPPER, 1); - - while ((dp = readdir (dirp)) != NULL) -=== patch end === - -This one is for pcl-cvs-2.9.2, so that `i' adds to the local -.cvsignore file. - -=== patch start === ---- pcl-cvs.el~ Mon Nov 1 12:33:46 1999 -+++ pcl-cvs.el Tue Jan 25 21:46:27 2000 -@@ -1177,7 +1177,10 @@ - "Append the file in FILEINFO to the .cvsignore file. - Can only be used in the *cvs* buffer." - (save-window-excursion -- (set-buffer (find-file-noselect (expand-file-name ".cvsignore" dir))) -+ (set-buffer (find-file-noselect -+ (expand-file-name (or (getenv "CVSDOTIGNORE") -+ ".cvsignore") -+ dir))) - (goto-char (point-max)) - (unless (zerop (current-column)) (insert "\n")) - (insert str "\n") -=== patch end === |