Commit | Line | Data |
---|---|---|
009e2b30 NJ |
1 | @node Tools to automate adding libraries |
2 | @chapter Tools to automate adding libraries | |
3 | ||
4 | You want to ... | |
5 | ||
6 | The chapters @ref{Libguile -- high level interface} and @ref{Libguile -- | |
7 | SCM interface} showed how to make C libraries available from Scheme. | |
8 | Here I will describe some automated tools that the Guile team has made | |
9 | available. Some have been written especially for Guile (the Guile Magic | |
10 | Snarfer), and some are also in use with other languages (Python, Perl, | |
11 | ...) | |
12 | ||
13 | @menu | |
14 | * By hand with gh_:: | |
15 | * By hand with Guile Magic Snarfer:: | |
16 | * Automatically using libtool:: | |
17 | * Automatically using SWIG:: | |
18 | @end menu | |
19 | ||
20 | @node By hand with gh_ | |
21 | @section By hand with gh_ | |
22 | ||
23 | @node By hand with Guile Magic Snarfer | |
24 | @section By hand with Guile Magic Snarfer | |
25 | ||
26 | When writing C code for use with Guile, you typically define a set of C | |
27 | functions, and then make some of them visible to the Scheme world by | |
28 | calling the @code{scm_make_gsubr} function; a C functions published in | |
29 | this way is called a @dfn{subr}. If you have many subrs to publish, it | |
30 | can sometimes be annoying to keep the list of calls to | |
31 | @code{scm_make_gsubr} in sync with the list of function definitions. | |
32 | Frequently, a programmer will define a new subr in C, recompile his | |
33 | application, and then discover that the Scheme interpreter cannot see | |
34 | the subr, because he forgot to call @code{scm_make_gsubr}. | |
35 | ||
36 | Guile provides the @code{guile-snarf} command to manage this problem. | |
37 | Using this tool, you can keep all the information needed to define the | |
38 | subr alongside the function definition itself; @code{guile-snarf} will | |
39 | extract this information from your source code, and automatically | |
40 | generate a file of calls to @code{scm_make_gsubr} which you can | |
41 | @code{#include} into an initialization function. (The command name | |
42 | comes from the verb ``to snarf'', here meaning ``to unceremoniously | |
43 | extract information from a somewhat unwilling source.'') | |
44 | ||
45 | @menu | |
46 | * How guile-snarf works:: Using the @code{guile-snarf} command. | |
47 | * Macros guile-snarf recognizes:: How to mark up code for @code{guile-snarf}. | |
48 | @end menu | |
49 | ||
50 | @node How guile-snarf works | |
51 | @subsection How @code{guile-snarf} works | |
52 | ||
53 | For example, here is how you might define a new subr called | |
54 | @code{clear-image}, implemented by the C function @code{clear_image}: | |
55 | ||
56 | @example | |
57 | @group | |
58 | #include <libguile.h> | |
59 | ||
60 | @dots{} | |
61 | ||
62 | SCM_PROC (s_clear_image, "clear-image", 1, 0, 0, clear_image); | |
63 | ||
64 | SCM | |
65 | clear_image (SCM image_smob) | |
66 | @{ | |
67 | @dots{} | |
68 | @} | |
69 | ||
70 | @dots{} | |
71 | ||
72 | void | |
73 | init_image_type () | |
74 | @{ | |
75 | #include "image-type.x" | |
76 | @} | |
77 | @end group | |
78 | @end example | |
79 | ||
80 | The @code{SCM_PROC} declaration says that the C function | |
81 | @code{clear_image} implements a Scheme subr called @code{clear-image}, | |
82 | which takes one required argument, no optional arguments, and no tail | |
83 | argument. @code{SCM_PROC} also declares a static array of characters | |
84 | named @code{s_clear_image}, initialized to the string | |
85 | @code{"clear-image"}. The body of @code{clear_image} may use the array | |
86 | in error messages, instead of writing out the literal string; this may | |
87 | save string space on some systems. | |
88 | ||
89 | Assuming the text above lives in a file named @file{image-type.c}, you will | |
90 | need to execute the following command to compile this file: | |
91 | @example | |
92 | guile-snarf image-type.c > image-type.x | |
93 | @end example | |
94 | @noindent This scans @file{image-type.c} for @code{SCM_PROC} | |
95 | declarations, and sends the following output to the file | |
96 | @file{image-type.x}: | |
97 | @example | |
98 | scm_make_gsubr (s_clear_image, 1, 0, 0, clear_image); | |
99 | @end example | |
100 | When compiled normally, @code{SCM_PROC} is a macro which expands to a | |
101 | declaration of the @code{s_clear_image} string. | |
102 | ||
103 | In other words, @code{guile-snarf} scans source code looking for uses of | |
104 | the @code{SCM_PROC} macro, and generates C code to define the | |
105 | appropriate subrs. You need to provide all the same information you | |
106 | would if you were using @code{scm_make_gsubr} yourself, but you can | |
107 | place the information near the function definition itself, so it is less | |
108 | likely to become incorrect or out-of-date. | |
109 | ||
110 | If you have many files that @code{guile-snarf} must process, you should | |
111 | consider using a rule like the following in your Makefile: | |
112 | @example | |
113 | .SUFFIXES: .x | |
114 | .c.x: | |
115 | ./guile-snarf $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $< > $@ | |
116 | @end example | |
117 | This tells make to run @code{guile-snarf} to produce each needed | |
118 | @file{.x} file from the corresponding @file{.c} file. | |
119 | ||
120 | @code{guile-snarf} passes all its command-line arguments directly to the | |
121 | C preprocessor, which it uses to extract the information it needs from | |
122 | the source code. this means you can pass normal compilation flags to | |
123 | @code{guile-snarf} to define preprocessor symbols, add header file | |
124 | directories, and so on. | |
125 | ||
126 | ||
127 | ||
128 | @node Macros guile-snarf recognizes | |
129 | @subsection Macros @code{guile-snarf} recognizes | |
130 | ||
131 | Here are the macros you can use in your source code from which | |
132 | @code{guile-snarf} can construct initialization code: | |
133 | ||
134 | ||
135 | @defmac SCM_PROC (@var{namestr}, @var{name}, @var{req}, @var{opt}, @var{tail}, @var{c_func}) | |
136 | Declare a new Scheme primitive function, or @dfn{subr}. The new subr | |
137 | will be named @var{name} in Scheme code, and be implemented by the C | |
138 | function @var{c_func}. The subr will take @var{req} required arguments | |
139 | and @var{opt} optional arguments. If @var{tail} is non-zero, the | |
140 | function will accept any remaining arguments as a list. | |
141 | ||
142 | Use this macro outside all function bodies, preferably above the | |
143 | definition of @var{c_func} itself. When compiled, the @code{SCM_PROC} | |
144 | declaration will expand to a definition for the @var{namestr} array, | |
145 | initialized to @var{name}. The @code{guile-snarf} command uses this | |
146 | declaration to automatically generate initialization code to create the | |
147 | subr and bind it in the top-level environment. @xref{How guile-snarf | |
148 | works}, for more info. | |
149 | ||
150 | @xref{Subrs}, for details on argument passing and how to write | |
151 | @var{c_func}. | |
152 | @end defmac | |
153 | ||
154 | ||
155 | @defmac SCM_GLOBAL (@var{var}, @var{scheme_name}) | |
156 | Declare a global Scheme variable named @var{scheme_name}, and a static C | |
157 | variable named @var{var} to point to it. The value of the Scheme | |
158 | variable lives in the @sc{cdr} of the cell @var{var} points to. | |
159 | Initialize the variable to @code{#f}. | |
160 | ||
161 | Use this macro outside all function bodies. When compiled, the | |
162 | @code{SCM_GLOBAL} macro will expand to a definition for the variable | |
163 | @var{var}, initialized to an innocuous value. The @code{guile-snarf} | |
164 | command will use this declaration to automatically generate code to | |
165 | create a global variable named @var{scheme_name}, and store a pointer to | |
166 | its cell in @var{var}. | |
167 | @end defmac | |
168 | ||
169 | ||
170 | @defmac SCM_CONST_LONG (@var{var}, @var{scheme_name}, @var{value}) | |
171 | Like @code{SCM_GLOBAL}, but initialize the variable to @var{value}, | |
172 | which must be an integer. | |
173 | @end defmac | |
174 | ||
175 | ||
176 | @defmac SCM_SYMBOL (@var{var}, @var{name}) | |
177 | Declare a C variable of type @code{SCM} named @var{var}, and initialize | |
178 | it to the Scheme symbol object whose name is @var{name}. | |
179 | ||
180 | Use this macro outside all function bodies. When compiled, the | |
181 | @code{SCM_SYMBOL} macro will expand to a definition for the variable | |
182 | @var{var}, initialized to an innocuous value. The @code{guile-snarf} | |
183 | command will use this declaration to automatically generate code to | |
184 | create a symbol named @var{name}, and store it in @var{var}. | |
185 | @end defmac | |
186 | ||
187 | @node Automatically using libtool | |
188 | @section Automatically using libtool | |
189 | ||
190 | @node Automatically using SWIG | |
191 | @section Automatically using SWIG |