annotate man/emodules.texi @ 3648:3e7493e76dc7

[xemacs-hg @ 2006-11-01 20:25:48 by adrian] fix for ffap crash on Windows (was: [Bug: 21.5-b27] [CRASH] (file-name-directory "1:")) -------------------- ChangeLog entries follow: -------------------- src/ChangeLog addition: 2006-11-01 Adrian Aichner <adrian@xemacs.org> * sysdep.c (wcslen): Check for NULL pointer. * sysdep.c (strlwr): Ditto. * nt.c (mswindows_getdcwd): Ditto (actual cause of reported crash). * intl-win32.c (wcscmp): Ditto. * intl-win32.c (wcslen): Ditto. * intl-win32.c (wcsncpy): Ditto. * intl-win32.c (wcscpy): Ditto. * intl-win32.c (wcsdup): Ditto. * fileio.c (Ffile_name_directory): Return Qnil when mswindows_getdcwd returns NULL working directory.
author adrian
date Wed, 01 Nov 2006 20:25:50 +0000
parents 2b58b7fd831c
children 1094d6d400fb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 \input texinfo @c -*-texinfo-*-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 @c %**start of header
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 @setfilename ../info/emodules.info
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 @settitle Extending Emacs using C Modules
721
f72a191f8ecf [xemacs-hg @ 2002-01-02 20:56:32 by adrian]
adrian
parents: 625
diff changeset
6 @direntry
f72a191f8ecf [xemacs-hg @ 2002-01-02 20:56:32 by adrian]
adrian
parents: 625
diff changeset
7 * Emodules: (emodules). XEmacs dynamically loadable module support.
f72a191f8ecf [xemacs-hg @ 2002-01-02 20:56:32 by adrian]
adrian
parents: 625
diff changeset
8 @end direntry
f72a191f8ecf [xemacs-hg @ 2002-01-02 20:56:32 by adrian]
adrian
parents: 625
diff changeset
9 @c footnotestyle separate
f72a191f8ecf [xemacs-hg @ 2002-01-02 20:56:32 by adrian]
adrian
parents: 625
diff changeset
10 @c paragraphindent 2
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 @c %**end of header
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 @c
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 @c Use some macros so that we can format for either XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 @c or (shudder) GNU Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 @c
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 @ifset XEMACS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 @set emacs XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 @clear EMACS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 @set HAVE-EMACS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 @end ifset
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 @ifset EMACS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 @set emacs Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 @clear XEMACS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 @set HAVE-EMACS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 @end ifset
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 @ifclear HAVE-EMACS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 @set XEMACS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 @set emacs XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 @end ifclear
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 This file documents the module loading technology of @value{emacs}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 Copyright @copyright{} 1998 J. Kean Johnston.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 Permission is granted to make and distribute verbatim copies of this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 manual provided the copyright notice and this permission notice are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 preserved on all copies.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 @ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 Permission is granted to process this file through TeX and print the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 results, provided the printed document carries copying permission notice
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 identical to this one except for the removal of this paragraph (this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 paragraph not being relevant to the printed manual).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 @end ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 Permission is granted to copy and distribute modified versions of this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 manual under the conditions for verbatim copying, provided that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 entire resulting derived work is distributed under the terms of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 permission notice identical to this one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 Permission is granted to copy and distribute translations of this manual
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 into another language, under the above conditions for modified versions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 except that this permission notice may be stated in a translation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 approved by the Foundation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 Permission is granted to copy and distribute modified versions of this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 manual under the conditions for verbatim copying, provided also that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 section entitled ``GNU General Public License'' is included exactly as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 in the original, and provided that the entire resulting derived work is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 distributed under the terms of a permission notice identical to this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 Permission is granted to copy and distribute translations of this manual
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 into another language, under the above conditions for modified versions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 except that the section entitled ``GNU General Public License'' may be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 included in a translation approved by the Free Software Foundation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 instead of in the original English.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 @c Combine indices.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 @syncodeindex fn cp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 @syncodeindex vr cp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 @syncodeindex ky cp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 @syncodeindex pg cp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 @syncodeindex tp cp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 @setchapternewpage odd
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 @finalout
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 @titlepage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 @title Extending @value{emacs} using C and C++
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 @subtitle Version 1.0, September 1998
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 @author J. Kean Johnston
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 @page
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 @vskip 0pt plus 1fill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 Copyright @copyright{} 1998 J. Kean Johnston. @*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 @sp 2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 Version 1.0 @*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 September, 1998.@*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 Permission is granted to make and distribute verbatim copies of this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 manual provided the copyright notice and this permission notice are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 preserved on all copies.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 Permission is granted to copy and distribute modified versions of this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 manual under the conditions for verbatim copying, provided also that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 section entitled ``GNU General Public License'' is included
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 exactly as in the original, and provided that the entire resulting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 derived work is distributed under the terms of a permission notice
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 identical to this one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 Permission is granted to copy and distribute translations of this manual
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 into another language, under the above conditions for modified versions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 except that the section entitled ``GNU General Public License'' may be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 included in a translation approved by the Free Software Foundation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 instead of in the original English.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 @end titlepage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 @page
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 @node Top, Introduction, (dir), (dir)
721
f72a191f8ecf [xemacs-hg @ 2002-01-02 20:56:32 by adrian]
adrian
parents: 625
diff changeset
121 This Info file contains v1.0 of the @value{emacs} dynamically loadable
f72a191f8ecf [xemacs-hg @ 2002-01-02 20:56:32 by adrian]
adrian
parents: 625
diff changeset
122 module support documentation.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 * Introduction:: Introducing Emacs Modules
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
125 * Anatomy of a Module:: Basic module layout and technology
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 * Using ellcc:: How to use the module compiler
2972
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
127 * Distribution with XEmacs:: Adding your module to the distribution
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 * Defining Functions:: Creating new Lisp primitives
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 * Defining Variables:: Creating new Lisp variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 * Index:: Concept Index
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 --- The Detailed Node Listing ---
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
134 Anatomy of a Module
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 * Required Header File:: Always include <emodules.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 * Required Functions:: Functions you must always provide
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 * Required Variables:: Variables whose values you must provide
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
139 * Loading other Modules:: How to load dependent modules
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 Using @code{ellcc}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 * Compile Mode:: Compiling modules using ellcc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 * Initialization Mode:: Generating documentation and variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 * Link Mode:: Creating the final loadable module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 * Other ellcc options:: Other useful options
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 * Environment Variables:: How to control ellcc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 Defining Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 * Using DEFUN:: Using the DEFUN macro to define functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 * Declaring Functions:: Declaring functions to the Lisp reader
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
157 @node Introduction, Anatomy of a Module, Top, Top
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 @chapter Introduction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 @value{emacs} is a powerful, extensible editor. The traditional way of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 extending the functionality of @value{emacs} is to use its built-in Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 language (called Emacs Lisp, or Elisp for short). However, while Elisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 is a full programming language and capable of extending @value{emacs} in more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 ways than you can imagine, it does have its short-comings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 Firstly, Elisp is an interpreted language, and this has serious speed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 implications. Like all other interpreted languages (like Java), Elisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 is often suitable only for certain types of application or extension.
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
169 So although Elisp is a general purpose language, and very high level,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
170 there are times when it is desirable to descend to a lower level compiled
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 language for speed purposes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 Secondly, Elisp (or Lisp in general) is not a very common language any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 more, except for certain circles in the computer industry. C is a far
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
175 more commonly known language, and because it is compiled, more suited to
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 a wider range of applications, especially those that require low level
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 access to a system or need to be as quick as possible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 @cindex Emacs Modules
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 @cindex DLL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 @cindex DSO
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 @cindex shared object
721
f72a191f8ecf [xemacs-hg @ 2002-01-02 20:56:32 by adrian]
adrian
parents: 625
diff changeset
183 This manual describes a new way of extending @value{emacs}, by using
f72a191f8ecf [xemacs-hg @ 2002-01-02 20:56:32 by adrian]
adrian
parents: 625
diff changeset
184 dynamically loadable modules (also known as dynamically loadable
f72a191f8ecf [xemacs-hg @ 2002-01-02 20:56:32 by adrian]
adrian
parents: 625
diff changeset
185 libraries (DLLs), dynamic shared objects (DSOs) or just simply shared
f72a191f8ecf [xemacs-hg @ 2002-01-02 20:56:32 by adrian]
adrian
parents: 625
diff changeset
186 objects), which can be written in C or C++ and loaded into @value{emacs}
f72a191f8ecf [xemacs-hg @ 2002-01-02 20:56:32 by adrian]
adrian
parents: 625
diff changeset
187 at any time. I sometimes refer to this technology as @dfn{CEmacs},
f72a191f8ecf [xemacs-hg @ 2002-01-02 20:56:32 by adrian]
adrian
parents: 625
diff changeset
188 which is short for @dfn{C Extensible Emacs}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 @value{emacs} modules are configured into and installed with @value{emacs} by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 default on all systems that support loading of shared objects. From a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 users perspective, the internals of @value{emacs} modules are irrelevant.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 All a user will ever need to know about shared objects is the name of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 the shared object when they want to load a given module. From a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 developers perspective though, a lot more is provided.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 @pindex ellcc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 @cindex compiler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 @cindex linker
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 Of primary interest is the @code{ellcc} program. This program is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 created during compile time, and is intended to abstract compiler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 specific characteristics from the developer. This program is called to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 compile and link all objects that will make up the final shared object,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 and accepts all common C compiler flags. @code{ellcc} also sets up the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 correct environment for compiling modules by enabling any special
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
208 compiler modes (such as PIC mode), setting the correct include paths for
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 the location of @value{emacs} internal header files etc. The program will also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 invoke the linker correctly to created the final shared object which is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 loaded into @value{emacs}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 @cindex header files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 CEmacs also makes all of the relevant @value{emacs} internal header files
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
216 available for module authors to use. This is often required to get data
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 structure definitions and external variable declarations. The header
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 files installed include the module specific header file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 @file{emodules.h}. Due to the nature of dynamic modules, most of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 internals of @value{emacs} are exposed.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
221 @xref{Top,,,internals,@value{emacs} Internals Manual}, for a
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
222 more complete discussion on how to extend and understand @value{emacs}. All of
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 the rules for C modules are discussed there.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 @cindex samples
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 Part of the @value{emacs} distribution is a set of sample modules. These are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 not installed when @value{emacs} is, but remain in the @value{emacs} source tree.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 These modules live in the directory @file{modules}, which is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 sub-directory of the main @value{emacs} source code directory. Please look at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 the samples carefully, and maybe even use them as a basis for making
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 your own modules. Most of the concepts required for writing extension
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 modules are covered in the samples.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 @cindex documentation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 @cindex help
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 Last, but not least is this manual. This can be viewed from within
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 @value{emacs}, and it can be printed out as well. It is the intention of this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 document that it will describe everything you need to know about
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 extending @value{emacs} in C. If you do not find this to be the case, please
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 contact the author(s).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 The rest of this document will discuss the actual mechanics of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 @value{emacs} modules and work through several of the samples. Please be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 sure that you have read the @value{emacs} Internals Manual and understand
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 everything in it. The concepts there apply to all modules. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 document may have some overlap, but it is the internals manual which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 should be considered the final authority. It will also help a great
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 deal to look at the actual @value{emacs} source code to see how things are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 done.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
254 @node Anatomy of a Module, Using ellcc, Introduction, Top
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
255 @chapter Anatomy of a Module
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
256 @cindex anatomy
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 @cindex module skeleton
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 @cindex skeleton, module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 @cindex module format
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 @cindex format, module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
262 Each dynamically loadable @value{emacs} extension (hereafter referred to as a
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
263 module) has a certain compulsory format, and must contain several
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
264 pieces of information and several mandatory functions. This chapter
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 describes the basic layout of a module, and provides a very simple
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 sample. The source for this sample can be found in the file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 @file{modules/simple/sample.c} in the main @value{emacs} source code tree.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 * Required Header File:: Always include <emodules.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 * Required Functions:: Functions you must always provide
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 * Required Variables:: Variables whose values you must provide
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
273 * Loading other Modules:: How to load dependent modules
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
276 @node Required Header File, Required Functions, Anatomy of a Module, Anatomy of a Module
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 @section Required Header File
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 @cindex required header
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 @cindex include files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 @cindex emodules.h
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 @cindex config.h
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 Every module must include the file @file{<emodules.h>}. This
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
284 will include several other @value{emacs} internal header files, and will set up
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 certain vital macros. One of the most important files included by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 @file{emodules.h} is the generated @file{config.h} file, which contains
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 all of the required system abstraction macros and definitions. Most
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 modules will probably require some pre-processor conditionals based on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 constants defined in @file{config.h}. Please read that file to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 familiarize yourself with the macros defined there.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
292 Depending on exactly what your module will be doing, you will probably
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 need to include one or more of the @value{emacs} internal header files. When
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
294 you @code{#include <emodules.h>}, you will get a few of the most important
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 @value{emacs} header files included automatically for you. The files included
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 are:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 @table @file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 @item lisp.h
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
300 This file contains most of the macros required for declaring Lisp object
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 types, macros for accessing Lisp objects, and global variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 declarations.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 @item sysdep.h
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
305 All system dependent declarations and abstraction macros live here. You
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 should never call low level system functions directly. Rather, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 should use the abstraction macros provided in this header file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 @item window.h
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 This header file defines the window structures and Lisp types, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 provides functions and macros for manipulating multiple @value{emacs} windows.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 @item buffer.h
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 All macros and function declarations for manipulating internal and user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 visible buffers appear in this file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 @item insdel.h
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 This header provides the information required for performing text
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 insertion and deletion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 @item frame.h
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 Provides the required structure, macro and function definitions for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 manipulating @value{emacs} frames.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
326 @node Required Functions, Required Variables, Required Header File, Anatomy of a Module
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 @section Required Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 @cindex initialization
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 @cindex functions, required
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 @cindex required functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 Every module requires several initialization functions. It is the
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
333 responsibility of these functions to load in any dependent modules, and to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
334 declare all variables and functions which are to be made visible to the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 @value{emacs} Lisp reader. Each of these functions performs a very specific
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 task, and they are executed in the correct order by @value{emacs}. All of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 these functions are @code{void} functions which take no arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 Here, briefly, are the required module functions. Note that the actual
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 function names do not end with the string @code{_module}, but rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 they end with the abbreviated module name by which the module is known.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 More on the module name and its importance later. Just bear in mind
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 that the text @code{_module} in the functions below is simply a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 place-holder, not an actual function name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 @item syms_of_module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 @findex syms_of_module
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
348 This required function is responsible for introducing to the Lisp reader
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 all functions that you have defined in your module using
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 @code{DEFUN()}. Note that @emph{only} functions are declared here, using
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 the @code{DEFSUBR()} macro. No variables are declared.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 @item vars_of_module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 @findex vars_of_module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 This required function contains calls to macros such as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 @code{DEFVAR_LISP()}, @code{DEFVAR_BOOL()} etc, and its purpose is to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 declare and initialize all and any variables that your module defines.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 They syntax for declaring variables is identical to the syntax used for
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 442
diff changeset
359 all internal @value{emacs} source code. If the module is intended to be
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 442
diff changeset
360 usable statically linked into XEmacs, the actions of this function are
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 442
diff changeset
361 severely restricted. @xref{General Coding Rules,,,internals,
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 442
diff changeset
362 @value{emacs} Internals Manual}. Also see the comments in
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 442
diff changeset
363 @file{src/emacs.c} (@code{main_1}). Modules which perform
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 442
diff changeset
364 initializations not permitted by these rules will probably work, but
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 442
diff changeset
365 dual-use (dynamic loading and static linking) modules will require very
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 442
diff changeset
366 careful, and possibly fragile, coding.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 @item modules_of_module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 @findex modules_of_module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 This optional function should be used to load in any modules which your
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
371 module depends on. The @value{emacs} module loading code makes sure that the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 same module is not loaded twice, so several modules can safely call the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 module load function for the same module. Only one copy of each module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 (at a given version) will ever be loaded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 @item docs_of_module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 @findex docs_of_module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 This is a required function, but not one which you need ever write.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 This function is created automatically by @code{ellcc} when the module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 initialization code is produced. It is required to document all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 functions and variables declared in your module.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
384 @node Required Variables, Loading other Modules, Required Functions, Anatomy of a Module
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 @section Required Variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 @cindex initialization
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 @cindex variables, required
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 @cindex required variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 Not only does a module need to declare the initialization functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 mentioned above, it is also required to provide certain variables which
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
392 the module loading code searches for in order to determine the viability
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 of a module. You are @emph{not} required to provide these variables in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 your source files. They are automatically set up in the module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 initialization file by the @code{ellcc} compiler. These variables are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 discussed here simply for the sake of completeness.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 @item emodules_compiler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 This is a variable of type @code{long}, and is used to indicate the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 version of the @value{emacs} loading technology that was used to produce the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 module being loaded. This version number is completely unrelated to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 the @value{emacs} version number, as a given module may quite well work
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
404 regardless of the version of @value{emacs} that was installed at the time the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 module was created.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 The @value{emacs} modules version is used to differentiate between major
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 changes in the module loading technology, not versions of @value{emacs}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 @item emodules_name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 This is a short (typically 10 characters or less) name for the module,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 and it is used as a suffix for all of the required functions. This is
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
413 also the name by which the module is recognized when loading dependent
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 modules. The name does not necessarily have to be the same as the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 physical file name, although keeping the two names in sync is a pretty
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
416 good idea. The name must not be empty, and it must be a valid part of a
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
417 C function name. The value of this variable is appended to the function
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 names @code{syms_of_}, @code{vars_of_}, @code{modules_of_} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 @code{docs_of_} to form the actual function names that the module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 loading code looks for when loading a module.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 This variable is set by the @code{--mod-name} argument to @code{ellcc}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 @item emodules_version
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 This string variable is used to load specific versions of a module.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 Rarely will two or more versions of a module be left lying around, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 just in case this does happen, this variable can be used to control
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 exactly which module should be loaded. See the Lisp function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 @code{load-module} for more details. This variable is set by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 @code{--mod-version} argument to @code{ellcc}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 @item emodules_title
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 This is a string which describes the module, and can contain spaces or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 other special characters. It is used solely for descriptive purposes,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 and does not affect the loading of the module. The value is set by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 @code{--mod-title} argument to @code{ellcc}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
439 @node Loading other Modules, , Required Variables, Anatomy of a Module
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 @section Loading other Modules
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
441 @cindex dependencies
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 @findex modules_of_module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 @findex emodules_load
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 During the loading of a module, it is the responsibility of the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 @code{modules_of_module} to load in any modules which the current module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 depends on. If the module is stand-alone, and does not depend on other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 modules, then this function can be left empty or even undeclared.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
449 However, if it does have dependencies, it must call
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 @code{emodules_load}:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 @cartouche
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
454 int emodules_load (const char *module,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
455 const char *modname,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
456 const char *modver)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 @end cartouche
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
460 The first argument @var{module} is the name of the actual shared object
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 or DLL. You can omit the @file{.so}, @file{.ell} or @file{.dll}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 extension of you wish. If you do not specify an absolute path name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 then the same rules as apply to loading Lisp modules are applied when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 searching for the module. If the module cannot be found in any of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 standard places, and an absolute path name was not specified,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
466 @code{emodules_load} will signal an error and loading of the module
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 will stop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 The second argument (@var{modname}) is the module name to load, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 must match the contents of the variable @var{emodule_name} in the
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
471 module to be loaded. A mis-match will cause the module load to fail. If
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 this parameter is @code{NULL} or empty, then no checks are performed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 against the target module's @var{emodule_name} variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 The last argument, @var{modver}, is the desired version of the module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 to load, and is compared to the target module's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 @var{emodule_version} value. If this parameter is not @code{NULL}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 or empty, and the match fails, then the load of the module will fail.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 @code{emodules_load} can be called recursively. If, at any point
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
481 during the loading of modules a failure is encountered, then all modules
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 that were loaded since the top level call to @code{emodules_load}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 will be unloaded. This means that if any child modules fail to load,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 then their parents will also fail to load. This does not include
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 previous successful calls to @code{emodules_load} at the top level.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486
880
beddd25fe24a [xemacs-hg @ 2002-06-24 22:00:17 by youngs]
youngs
parents: 775
diff changeset
487 @strong{Warning:} Modules are @emph{not} loaded with the
beddd25fe24a [xemacs-hg @ 2002-06-24 22:00:17 by youngs]
youngs
parents: 775
diff changeset
488 @code{RTLD_GLOBAL} flag. The practical upshot is that individual
beddd25fe24a [xemacs-hg @ 2002-06-24 22:00:17 by youngs]
youngs
parents: 775
diff changeset
489 modules do not have access to each other's C symbols. One module cannot
beddd25fe24a [xemacs-hg @ 2002-06-24 22:00:17 by youngs]
youngs
parents: 775
diff changeset
490 make a C function call to a function defined in another module, nor can
beddd25fe24a [xemacs-hg @ 2002-06-24 22:00:17 by youngs]
youngs
parents: 775
diff changeset
491 it read or set a C variable in another module. All interaction between
beddd25fe24a [xemacs-hg @ 2002-06-24 22:00:17 by youngs]
youngs
parents: 775
diff changeset
492 modules must, therefore, take place at the Lisp level. This is by
beddd25fe24a [xemacs-hg @ 2002-06-24 22:00:17 by youngs]
youngs
parents: 775
diff changeset
493 design. Other projects have attempted to use @code{RTLD_GLOBAL}, only
beddd25fe24a [xemacs-hg @ 2002-06-24 22:00:17 by youngs]
youngs
parents: 775
diff changeset
494 to find that spurious symbol name clashes were the result. Helper
beddd25fe24a [xemacs-hg @ 2002-06-24 22:00:17 by youngs]
youngs
parents: 775
diff changeset
495 functions often have simple names, increasing the probability of such a
beddd25fe24a [xemacs-hg @ 2002-06-24 22:00:17 by youngs]
youngs
parents: 775
diff changeset
496 clash. If you really need to share symbols between modules, create a
beddd25fe24a [xemacs-hg @ 2002-06-24 22:00:17 by youngs]
youngs
parents: 775
diff changeset
497 shared library containing those symbols, and link your modules with
beddd25fe24a [xemacs-hg @ 2002-06-24 22:00:17 by youngs]
youngs
parents: 775
diff changeset
498 that library. Otherwise, interactions between modules must take place
beddd25fe24a [xemacs-hg @ 2002-06-24 22:00:17 by youngs]
youngs
parents: 775
diff changeset
499 via Lisp function calls and Lisp variables accesses.
beddd25fe24a [xemacs-hg @ 2002-06-24 22:00:17 by youngs]
youngs
parents: 775
diff changeset
500
2972
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
501 @node Using ellcc, Distribution with XEmacs, Anatomy of a Module, Top
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 @chapter Using @code{ellcc}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 @cindex @code{ellcc}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 @cindex module compiler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 Before discussing the anatomy of a module in greater detail, you should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 be aware of the steps required in order to correctly compile and link a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 module for use within @value{emacs}. There is little difference between
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 compiling normal C code and compiling a module. In fact, all that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 changes is the command used to compile the module, and a few extra
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 arguments to the compiler.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 @value{emacs} now ships with a new user utility, called @code{ellcc}. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 is the @dfn{Emacs Loadable Library C Compiler}. This is a wrapper
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 program that will invoke the real C compiler with the correct arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 to compile and link your module. With the exception of a few command
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 line options, this program can be considered a replacement for your C
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 compiler. It accepts all of the same flags and arguments that your C
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 compiler does, so in many cases you can simply set the @code{make}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 variable @code{CC} to @code{ellcc} and your code will be compiled as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 an Emacs module rather than a static C object.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 @code{ellcc} has three distinct modes of operation. It can be run in
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
524 compile, link or initialization mode. These modes are discussed in more
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 detail below. If you want @code{ellcc} to show the commands it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 executing, you can specify the option @code{--mode=verbose} to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 @code{ellcc}. Specifying this option twice will enable certain extra
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 debugging messages to be displayed on the standard output.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 * Compile Mode:: Compiling modules using ellcc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 * Initialization Mode:: Generating documentation and variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 * Link Mode:: Creating the final loadable module
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 * Other ellcc options:: Other useful options
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 * Environment Variables:: How to control ellcc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 @node Compile Mode, Initialization Mode, Using ellcc, Using ellcc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 @section Compile Mode
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 @cindex compiling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 By default, @code{ellcc} is in @dfn{compile} mode. This means that it
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
543 assumes that all of the command line arguments are C compiler arguments,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 and that you want to compile the specified source file or files. You
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 can force compile mode by specifying the @code{--mode=compile} argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 to @code{ellcc}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 In this mode, @code{ellcc} is simply a front-end to the same C compiler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 that was used to create the @value{emacs} binary itself. All @code{ellcc}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 does in this mode is insert a few extra command line arguments before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 the arguments you specify to @code{ellcc} itself. @code{ellcc} will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 then invoke the C compiler to compile your module, and will return the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 same exit codes and messages that your C compiler does.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 By far the easiest way to compile modules is to construct a
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
556 @file{Makefile} as you would for a normal program, and simply insert, at
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 some appropriate place something similar to:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 @cartouche
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 CC=ellcc --mode=compile
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 .c.o:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 $(CC) $(CFLAGS) -c $<
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 @end cartouche
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 After this, all you need to do is provide simple @code{make} rules for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 compiling your module source files. Since modules are most useful when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 they are small and self-contained, most modules will have a single
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 source file, aside from the module specific initialization file (see
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 below for details).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 @node Initialization Mode, Link Mode, Compile Mode, Using ellcc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 @section Initialization Mode
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 @cindex initialization
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 @cindex documentation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 @value{emacs} uses a rather bizarre way of documenting variables and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 functions. Rather than have the documentation for compiled functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 and variables passed as static strings in the source code, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 documentation is included as a C comment. A special program, called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 @file{make-docfile}, is used to scan the source code files and extract
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
584 the documentation from these comments, producing the @value{emacs} @file{DOC}
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 file, which the internal help engine scans when the documentation for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 function or variable is requested.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 Due to the internal construction of Lisp objects, subrs and other such
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 things, adding documentation for a compiled function or variable in a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 compiled module, at any time after @value{emacs} has been @dfn{dumped} is
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
591 somewhat problematic. Fortunately, as a module writer you are insulated
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 from the difficulties thanks to your friend @code{ellcc} and some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 internal trickery in the module loading code. This is all done using
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 the @dfn{initialization} mode of @code{ellcc}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 The result of running @code{ellcc} in initialization mode is a C source
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 file which you compile with (you guessed it) @code{ellcc} in compile
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 mode. Initialization mode is where you set the module name, version,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
599 title and gather together all of the documentation strings for the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
600 functions and variables in your module. There are several options that
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 you are required to pass @code{ellcc} in initialization mode, the first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 of which is the mode switch itself, @code{--mode=init}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 Next, you need to specify the name of the C source code file that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 @code{ellcc} will produce, and you specify this using the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 @code{--mod-output=FILENAME} argument. @var{FILENAME} is the name of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 the C source code file that will contain the module variables and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 @code{docs_of_module} function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 As discussed previously, each module requires a short @dfn{handle} or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 module name. This is specified with the @code{--mod-name=NAME} option,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 where @var{NAME} is the abbreviated module name. This @var{NAME} must
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 consist only of characters that are valid in C function and variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 names.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 The module version is specified using @code{--mod-version=VERSION}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 argument, with @var{VERSION} being any arbitrary version string. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 version can be passed as an optional second argument to the Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 function @code{load-module}, and as the third argument to the internal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 module loading command @code{emodules_load}. This version string is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 used to distinguish between different versions of the same module, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 to ensure that the module is loaded at a specific version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 Last, but not least, is the module title. Specified using the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 @code{--mod-title=TITLE} option, the specified @var{TITLE} is used when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 the list of loaded modules is displayed. The module title serves no
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 purpose other than to inform the user of the function of the module.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 This string should be brief, as it has to be formatted to fit the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 screen.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 Following all of these parameters, you need to provide the list of all
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
632 source code modules that make up your module. These are the files which
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
633 are scanned by @file{make-docfile}, and provide the information required
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 to populate the @code{docs_of_module} function. Below is a sample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 @file{Makefile} fragment which indicates how all of this is used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 @cartouche
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 CC=ellcc --mode=compile
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 LD=ellcc --mode=link
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 MODINIT=ellcc --mode=init
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 CFLAGS=-O2 -DSOME_STUFF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 .c.o:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 $(CC) $(CFLAGS) -c $<
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 MODNAME=sample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 MODVER=1.0.0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 MODTITLE="Small sample module"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 SRCS=modfile1.c modfile2.c modfile3.c
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 OBJS=$(SRCS:.c=.o)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 all: sample.ell
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 clean:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 rm -f $(OBJS) sample_init.o sample.ell
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 install: all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 mkdir `ellcc --mod-location`/mymods > /dev/null
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 cp sample.ell `ellcc --mod-location`/mymods/sample.ell
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 sample.ell: $(OBJS) sample_init.o
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 $(LD) --mod-output=$@ $(OBJS) sample_init.o
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 sample_init.o: sample_init.c
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 sample_init.c: $(SRCS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 $(MODINIT) --mod-name=$(MODNAME) --mod-version=$(MODVER) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 --mod-title=$(MODTITLE) --mod-output=$@ $(SRCS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 @end cartouche
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 The above @file{Makefile} is, in fact, complete, and would compile the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 sample module, and optionally install it. The @code{--mod-location}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 argument to @code{ellcc} will produce, on the standard output, the base
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 location of the @value{emacs} module directory. Each sub-directory of that
625
33f0f28b945c [xemacs-hg @ 2001-07-02 20:45:03 by adrian]
adrian
parents: 450
diff changeset
676 directory is automatically searched for modules when they are loaded with
33f0f28b945c [xemacs-hg @ 2001-07-02 20:45:03 by adrian]
adrian
parents: 450
diff changeset
677 @code{load-module}. An alternative location would be
33f0f28b945c [xemacs-hg @ 2001-07-02 20:45:03 by adrian]
adrian
parents: 450
diff changeset
678 @file{/usr/local/lib/xemacs/site-modules}. That path can change depending
33f0f28b945c [xemacs-hg @ 2001-07-02 20:45:03 by adrian]
adrian
parents: 450
diff changeset
679 on the options the person who compiled @value{emacs} chose, so you can
33f0f28b945c [xemacs-hg @ 2001-07-02 20:45:03 by adrian]
adrian
parents: 450
diff changeset
680 always determine the correct site location using the
33f0f28b945c [xemacs-hg @ 2001-07-02 20:45:03 by adrian]
adrian
parents: 450
diff changeset
681 @code{--mod-site-location} option. This directory is treated the same way
33f0f28b945c [xemacs-hg @ 2001-07-02 20:45:03 by adrian]
adrian
parents: 450
diff changeset
682 as the main module directory. Each sub-directory within it is searched for
33f0f28b945c [xemacs-hg @ 2001-07-02 20:45:03 by adrian]
adrian
parents: 450
diff changeset
683 a given module when the user attempts to load it. The valid extensions that
33f0f28b945c [xemacs-hg @ 2001-07-02 20:45:03 by adrian]
adrian
parents: 450
diff changeset
684 the loader attempts to use are @file{.so}, @file{.ell} and @file{.dll}. You
33f0f28b945c [xemacs-hg @ 2001-07-02 20:45:03 by adrian]
adrian
parents: 450
diff changeset
685 can use any of these extensions, although @file{.ell} is the preferred
33f0f28b945c [xemacs-hg @ 2001-07-02 20:45:03 by adrian]
adrian
parents: 450
diff changeset
686 extension.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 @node Link Mode, Other ellcc options, Initialization Mode, Using ellcc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 @section Link Mode
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 @cindex linking
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 Once all of your source code files have been compiled (including the
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
693 generated init file) you need to link them all together to create the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 loadable module. To do this, you invoke @code{ellcc} in link mode, by
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 442
diff changeset
695 passing the @code{--mode=link} option. You need to specify the final
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
696 output file using the @code{--mod-output=NAME} option, but other than
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 that all other arguments are passed on directly to the system compiler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 or linker, along with any other required arguments to create the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 loadable module.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 The module has complete access to all symbols that were present in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 dumped @value{emacs}, so you do not need to link against libraries that were
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 linked in with the main executable. If your library uses some other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 extra libraries, you will need to link with those. There is nothing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 particularly complicated about link mode. All you need to do is make
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 sure you invoke it correctly in the @file{Makefile}. See the sample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 @file{Makefile} above for an example of a well constructed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 @file{Makefile} that invoked the linker correctly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 @node Other ellcc options, Environment Variables, Link Mode, Using ellcc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 @section Other @code{ellcc} options
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 @cindex paths
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 Aside from the three main @code{ellcc} modes described above,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 @code{ellcc} can accept several other options. These are typically used
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
716 in a @file{Makefile} to determine installation paths. @code{ellcc} also
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 allows you to over-ride several of its built-in compiler and linker
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 options using environment variables. Here is the complete list of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 options that @code{ellcc} accepts.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 @item --mode=compile
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 Enables compilation mode. Use this to compile source modules.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 @item --mode=link
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 Enabled link edit mode. Use this to create the final module.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 @item --mode=init
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 Used to create the documentation function and to initialize other
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
730 required variables. Produces a C source file that must be compiled with
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 @code{ellcc} in compile mode before linking the final module.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 @item --mode=verbose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 Enables verbose mode. This will show you the commands that are being
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
735 executed, as well as the version number of @code{ellcc}. If you specify
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 this option twice, then some extra debugging information is displayed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 @item --mod-name=NAME
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
739 Sets the short internal module @var{NAME} to the string specified,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 which must consist only of valid C identifiers. Required during
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 initialization mode.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 @item --mod-version=VERSION
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 Sets the internal module @var{VERSION} to the specified string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 Required during initialization mode.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 @item --mod-title=TITLE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 Sets the module descriptive @var{TITLE} to the string specified. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 string can contain any printable characters, but should not be too
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 long. It is required during initialization mode.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 @item --mod-output=FILENAME
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 Used to control the output file name. This is used during
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 initialization mode to set the name of the C source file that will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 created to @var{FILENAME}. During link mode, it sets the name of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 final loadable module to @var{FILENAME}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 @item --mod-location
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
759 This will print the name of the standard module installation path on the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 standard output and immediately exit @code{ellcc}. Use this option to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 determine the directory prefix of where you should install your modules.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 @item --mod-site-location
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 This will print the name of the site specific module location and exit.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 @item --mod-archdir
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
767 Prints the name of the root of the architecture-dependent directory that
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
768 @value{emacs} searches for architecture-dependent files.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 @item --mod-config
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
771 Prints the name of the configuration for which @value{emacs} and @code{ellcc}
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 were compiled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 @node Environment Variables, , Other ellcc options, Using ellcc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 @section Environment Variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 @cindex environment variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 During its normal operation, @code{ellcc} uses the compiler and linker
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 flags that were determined at the time @value{emacs} was configured. In
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
781 certain rare circumstances you may wish to over-ride the flags passed to
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 the compiler or linker, and you can do so using environment variables.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
783 The table below lists all of the environment variables that @code{ellcc}
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
784 recognizes.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 @item ELLCC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 @cindex @code{ELLCC}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 This is used to over-ride the name of the C compiler that is invoked by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 @code{ellcc}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 @item ELLLD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 @cindex @code{ELLLD}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 Sets the name of the link editor to use to created the final module.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 @item ELLCFLAGS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 @cindex @code{ELLCFLAGS}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 Sets the compiler flags passed on when compiling source modules. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 only sets the basic C compiler flags. There are certain hard-coded
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 flags that will always be passed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 @item ELLLDFLAGS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 @cindex @code{ELLLDFLAGS}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 Sets the flags passed on to the linker. This does @strong{not} include
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 the flags for enabling PIC mode. This just sets basic linker flags.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 @item ELLDLLFLAGS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 @cindex @code{ELLDLLFLAGS}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 Sets the flags passed to the linker that are required to created shared
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 and loadable objects.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 @item ELLPICFLAGS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 @cindex @code{ELLPICFLAGS}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 Sets the C compiler option required to produce an object file that is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 suitable for including in a shared library. This option should turn on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 PIC mode, or the moral equivalent thereof on the target system.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 @item ELLMAKEDOC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 @cindex @code{ELLMAKEDOC}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 Sets the name of the @file{make-docfile} program to use. Usually
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 @code{ellcc} will use the version that was compiled and installed with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 @value{emacs}, but this option allows you to specify an alternative path.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 Used during the compile phase of @value{emacs} itself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825
2972
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
826 @node Distribution with XEmacs, Defining Functions, Using ellcc, Top
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
827 @chapter Adding Modules to the XEmacs Distribution
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
828 @cindex XEmacs integration
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
829 @cindex integration, XEmacs
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
830 @cindex modules and configure.ac
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
831 @cindex configure.ac, modules and
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
832 @cindex modules and Makefiles
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
833 @cindex Makefiles, modules and
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
834
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
835 #### This section needs to be filled out.
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
836
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
837 @strong{Warning: The procedure described in the section is subject to
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
838 change, as it is very stylized and thus a good candidate for further
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
839 automation.}
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
840
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
841 Modules distributed with XEmacs are placed in the @file{modules}
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
842 subdirectory of the root of the source tree. Each module's code is
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
843 placed in a separate subdirectory. The build infrastructure for a
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
844 module consists of a @file{Makefile.in.in}, a @file{configure.ac}, and
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
845 @file{install-sh}. @file{install-sh} is a constant, and may simply be
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
846 copied from an existing module.
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
847
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
848 Most of the job of building a module is encapsulated in
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
849 @file{modules/common/Makefile.common} and in @file{ellcc}. The module's
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
850 @file{Makefile.in.in} normally needs only to define module name and
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
851 version information, and include @file{modules/common/Makefile.common}.
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
852 The @file{configure.ac} is very module-specific, and little can be said
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
853 about its contents. However, since no logic that depends on XEmacs
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
854 itself or other modules needs to be present, it is easier to write and
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
855 maintain than if it were contained in the XEmacs distribution's
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
856 @file{configure.ac}.
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
857
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
858 Modules can usually be trivially built in to the XEmacs binary. To make
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
859 this work, you need to duplicate the detection logic for any resources
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
860 the module requires in the top-level @file{configure.ac}. Since module
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
861 objects may be linked into modules or into @file{xemacs}, instead of
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
862 adding library path and library information directly to some
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
863 @file{@var{subsystem}_libs} variable, you should add them to a
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
864 @file{@var{module}_libs} variable, which in turn must be added to
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
865 @code{ld_libs_module} in the section ``Compute SUBST-itutable variables.''
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
866
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
867 Furthermore, in @file{src/Makefile.in.in} you add rules to build the
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
868 object without the module wrapper, and conditionalize these and the
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
869 addition of the object to @code{objs} on @code{HAVE_SHLIB}. The right
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
870 way to do this is somewhat indirect. Study the integration of LDAP and
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
871 PostgreSQL for the details.
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
872
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
873
2b58b7fd831c [xemacs-hg @ 2005-10-04 17:00:32 by stephent]
stephent
parents: 880
diff changeset
874 @node Defining Functions, Defining Variables, Distribution with XEmacs, Top
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 @chapter Defining Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 @cindex defining functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 One of the main reasons you would ever write a module is to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 provide one or more @dfn{functions} for the user or the editor to use.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
880 The term
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 @dfn{function} is a bit overloaded here, as it refers to both a C
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 function and the way it appears to Lisp, which is a @dfn{subroutine}, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 simply a @dfn{subr}. A Lisp subr is also known as a Lisp primitive, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 that term applies less to dynamic modules. @xref{Writing Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 Primitives,,,internals,@value{emacs} Internals Manual}, for details on how to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 declare functions. You should familiarize yourself with the
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
887 instructions there. The format of the function declaration is identical
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 in modules.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
890 Normal Lisp primitives document the functions they defining by including
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 the documentation as a C comment. During the build process, a program
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 called @file{make-docfile} is run, which will extract all of these
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 comments, build up a single large documentation file, and will store
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 pointers to the start of each documentation entry in the dumped @value{emacs}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 This, of course, will not work for dynamic modules, as they are loaded
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 long after @value{emacs} has been dumped. For this reason, we require a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 special means for adding documentation for new subrs. This is what the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 macro @code{CDOCSUBR} is used for, and this is used extensively during
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 @code{ellcc} initialization mode.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 When using @code{DEFUN} in normal @value{emacs} C code, the sixth
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 ``parameter'' is a C comment which documents the function. For a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 dynamic module, we of course need to convert the C comment to a usable
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
904 string, and we need to set the documentation pointer of the subr to this
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 string. As a module programmer, you don't actually need to do any work
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 for this to happen. It is all taken care of in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 @code{docs_of_module} function created by @code{ellcc}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 * Using DEFUN:: Using the DEFUN macro to define functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 * Declaring Functions:: Declaring functions to the Lisp reader
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 @node Using DEFUN, Declaring Functions, Defining Functions, Defining Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 @section Using @code{DEFUN}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 @cindex subrs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 @findex DEFUN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 @cindex functions, Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 @cindex functions, defining
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920
775
7d972c3de90a [xemacs-hg @ 2002-03-14 11:50:12 by stephent]
stephent
parents: 721
diff changeset
921 The full syntax of a function declaration is discussed in the
7d972c3de90a [xemacs-hg @ 2002-03-14 11:50:12 by stephent]
stephent
parents: 721
diff changeset
922 @value{emacs} internals manual in greater depth. @ref{Writing Lisp
7d972c3de90a [xemacs-hg @ 2002-03-14 11:50:12 by stephent]
stephent
parents: 721
diff changeset
923 Primitives,,,internals,@value{emacs} Internals Manual}. What follows is
7d972c3de90a [xemacs-hg @ 2002-03-14 11:50:12 by stephent]
stephent
parents: 721
diff changeset
924 a brief description of how to define and implement a new Lisp primitive
7d972c3de90a [xemacs-hg @ 2002-03-14 11:50:12 by stephent]
stephent
parents: 721
diff changeset
925 in a module. This is done using the @code{DEFUN} macro. Here is a
7d972c3de90a [xemacs-hg @ 2002-03-14 11:50:12 by stephent]
stephent
parents: 721
diff changeset
926 small example:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 @cartouche
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 DEFUN ("my-function", Fmy_function, 1, 1, "FFile name: ", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 Sample Emacs primitive function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
933 The specified FILE is frobnicated before it is fnozzled.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 (file))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 @{
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 char *filename;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 if (NILP(file))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 filename = (char *)XSTRING_DATA(file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 frob(filename);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 return Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 @}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946 @end cartouche
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 The first argument is the name of the function as it will appear to the
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
950 Lisp reader. This must be provided as a string. The second argument is
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 the name of the actual C function that will be created. This is
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
952 typically the Lisp function name with a preceding capital @code{F}, with
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 hyphens converted to underscores. This must be a valid C function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 name. Next come the minimum and maximum number of arguments,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 respectively. This is used to ensure that the correct number of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 arguments are passed to the function. Next is the @code{interactive}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 definition. If this function is meant to be run by a user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 interactively, then you need to specify the argument types and prompts
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 in this string. Please consult the @value{emacs} Lisp manual for more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 details. Next comes a C comment that is the documentation for this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 function. This comment @strong{must} exist. Last comes the list of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 function argument names, if any.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 @node Declaring Functions, , Using DEFUN, Defining Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 @section Declaring Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 @findex DEFSUBR
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 @cindex functions, declaring
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 Simply writing the code for a function is not enough to make it
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
970 available to the Lisp reader. You have to, during module
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 initialization, let the Lisp reader know about the new function. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 is done by calling @code{DEFSUBR} with the name of the function. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 is the sole purpose of the initialization function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 @code{syms_of_module}. @xref{Required Functions}, for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 Each call to @code{DEFSUBR} takes as its only argument the name of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 function, which is the same as the second argument to the call to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 @code{DEFUN}. Using the example function above, you would insert the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 following code in the @code{syms_of_module} function:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 @cartouche
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 DEFSUBR(Fmy_function);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 @end cartouche
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 This call will instruct @value{emacs} to make the function visible to the Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 reader and will prepare for the insertion of the documentation into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 the right place. Once this is done, the user can call the Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 function @code{my-function}, if it was defined as an interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 function (which in this case it was).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 Thats all there is to defining and announcing new functions. The rules
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 for what goes inside the functions, and how to write good modules, is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 beyond the scope of this document. Please consult the @value{emacs}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 internals manual for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 @node Defining Variables, Index, Defining Functions, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999 @chapter Defining Variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 @cindex defining variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 @cindex defining objects
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 @findex DEFVAR_LISP
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 @findex DEFVAR_BOOL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 @findex DEFVAR_INT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 @cindex variables, Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 @cindex variables, defining
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 @cindex objects, defining
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 @cindex objects, Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 Rarely will you write a module that only contains functions. It is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 common to also provide variables which can be used to control the
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1012 behavior of the function, or store the results of the function being
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 executed. The actual C variable types are the same for modules
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 and internal @value{emacs} primitives, and the declaration of the variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 is identical.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1017 @xref{Adding Global Lisp Variables,,,internals,XEmacs Internals Manual},
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 for more information on variables and naming conventions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 Once your variables are defined, you need to initialize them and make
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 the Lisp reader aware of them. This is done in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 @code{vars_of_module} initialization function using special @value{emacs}
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1023 macros such as @code{DEFVAR_LISP}, @code{DEFVAR_BOOL}, @code{DEFVAR_INT}
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1024 etc. The best way to see how to use these macros is to look at existing
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 source code, or read the internals manual.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 One @emph{very} important difference between @value{emacs} variables and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 module variables is how you use pure space. Simply put, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 @strong{never} use pure space in @value{emacs} modules. The pure space
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1030 storage is of a limited size, and is initialized properly during the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 dumping of @value{emacs}. Because variables are being added dynamically to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 an already running @value{emacs} when you load a module, you cannot use pure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 space. Be warned: @strong{do not use pure space in modules. Repeat, do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 not use pure space in modules.} Once again, to remove all doubts:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 @strong{DO NOT USE PURE SPACE IN MODULES!!!}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 Below is a small example which declares and initializes two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 variables. You will note that this code takes into account the fact
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 that this module may very well be compiled into @value{emacs} itself. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 is a prudent thing to do.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 @cartouche
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 Lisp_Object Vsample_string;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 int sample_boolean;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 vars_of_module()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 @{
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 DEFVAR_LISP ("sample-string", &Vsample_string /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 This is a sample string, declared in a module.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 Nothing magical about it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 */);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 DEFVAR_BOOL("sample-boolean", &sample_boolean /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 *Sample user-settable boolean.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 */);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 sample_boolean = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 Vsample_string = build_string("My string");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 @}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 @end cartouche
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 @c Print the tables of contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 @contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 @c That's all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 @node Index, , Defining Variables, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 @unnumbered Index
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 @printindex cp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 @bye
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076