1 | /* doc/configuration (in Emacs -*-outline-*- format). */ |
---|
2 | |
---|
3 | Copyright 2000, 2001, 2002 Free Software Foundation, Inc. |
---|
4 | |
---|
5 | This file is part of the GNU MP Library. |
---|
6 | |
---|
7 | The GNU MP Library is free software; you can redistribute it and/or modify |
---|
8 | it under the terms of the GNU Lesser General Public License as published by |
---|
9 | the Free Software Foundation; either version 2.1 of the License, or (at your |
---|
10 | option) any later version. |
---|
11 | |
---|
12 | The GNU MP Library is distributed in the hope that it will be useful, but |
---|
13 | WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
---|
14 | or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public |
---|
15 | License for more details. |
---|
16 | |
---|
17 | You should have received a copy of the GNU Lesser General Public License |
---|
18 | along with the GNU MP Library; see the file COPYING.LIB. If not, write to |
---|
19 | the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA |
---|
20 | 02111-1307, USA. |
---|
21 | |
---|
22 | |
---|
23 | |
---|
24 | * Adding a new file |
---|
25 | |
---|
26 | ** Adding a top-level file |
---|
27 | |
---|
28 | i) Add it to libgmp_la_SOURCES in Makefile.am. |
---|
29 | |
---|
30 | ii) If libmp.la needs it (usually doesn't), then add it to |
---|
31 | libmp_la_SOURCES too. |
---|
32 | |
---|
33 | ** Adding a subdirectory file |
---|
34 | |
---|
35 | For instance for mpz, |
---|
36 | |
---|
37 | i) Add file.c to libmpz_la_SOURCES in mpz/Makefile.am. |
---|
38 | |
---|
39 | ii) Add mpz/file$U.lo to MPZ_OBJECTS in the top-level Makefile.am |
---|
40 | |
---|
41 | iii) If for some reason libmp.la needs it (usually doesn't) then add |
---|
42 | mpz/file$U.lo to libmp_la_DEPENDENCIES in the top-level |
---|
43 | Makefile.am too. |
---|
44 | |
---|
45 | The same applies to mpf, mpq, scanf and printf. |
---|
46 | |
---|
47 | ** Adding an mpn file |
---|
48 | |
---|
49 | The way we build libmpn (in the `mpn' subdirectory) is quite special. |
---|
50 | |
---|
51 | Currently only mpn/mp_bases.c is truely generic and included in every |
---|
52 | configuration. All other files are linked at build time into the mpn |
---|
53 | build directory from one of the CPU specific sub-directories, or from |
---|
54 | the mpn/generic directory. |
---|
55 | |
---|
56 | There are four types of mpn source files. |
---|
57 | |
---|
58 | .asm Assembly code preprocessed with m4 |
---|
59 | .S Assembly code preprocessed with cpp |
---|
60 | .s Assembly code not preprocessed at all |
---|
61 | .c C code |
---|
62 | |
---|
63 | There are two types of .asm files. |
---|
64 | |
---|
65 | i) ``Normal'' files containing one function, though possibly with |
---|
66 | more than one entry point. |
---|
67 | |
---|
68 | ii) Multi-function files that generate one of a set of functions |
---|
69 | according to build options. |
---|
70 | |
---|
71 | To add a new implementation of an existing function, |
---|
72 | |
---|
73 | i) Put it in the appropriate CPU-specific mpn subdirectory, it'll be |
---|
74 | detected and used. |
---|
75 | |
---|
76 | ii) Any entrypoints tested by HAVE_NATIVE_func in other code must |
---|
77 | have PROLOGUE(func) for configure to grep. This is normal for |
---|
78 | .asm or .S files, but for .c files a dummy comment like the |
---|
79 | following will be needed. |
---|
80 | |
---|
81 | /* |
---|
82 | PROLOGUE(func) |
---|
83 | */ |
---|
84 | |
---|
85 | To add a new implementation using a multi-function file, in addition |
---|
86 | do the following, |
---|
87 | |
---|
88 | i) Use a MULFUNC_PROLOGUE(func1 func2 ...) in the .asm, declaring |
---|
89 | all the functions implemented, including carry-in variants. |
---|
90 | |
---|
91 | If there's a separate PROLOGUE(func) for each possible function, |
---|
92 | then MULFUNC_PROLOGUE isn't necessary (but this is usually not |
---|
93 | the case). |
---|
94 | |
---|
95 | To add a new style of multi-function file, in addition do the |
---|
96 | following, |
---|
97 | |
---|
98 | i) Add to the "case" statement in configure.in which lists each |
---|
99 | multi-function filename and what function files it can provide. |
---|
100 | |
---|
101 | To add a completely new mpn function file, do the following, |
---|
102 | |
---|
103 | i) Ensure the filename is a valid C identifier, due to the |
---|
104 | -DOPERATION_$* used to support multi-function files. This means |
---|
105 | "-" can't be used (but "_" can). |
---|
106 | |
---|
107 | ii) Add it to configure.in under one of the following |
---|
108 | |
---|
109 | a) `gmp_mpn_functions' if it exists for every target. This |
---|
110 | means there must be a C version in mpn/generic. (Eg. mul_1) |
---|
111 | |
---|
112 | b) `gmp_mpn_functions_optional' if it's a standard function, but |
---|
113 | doesn't need to exist for every target. Code wanting to use |
---|
114 | this will test HAVE_NATIVE_func to see if it's available. |
---|
115 | (Eg. copyi) |
---|
116 | |
---|
117 | c) `extra_functions' for some targets, if it's a special |
---|
118 | function that only ever needs to exist for certain targets. |
---|
119 | Code wanting to use it can test either HAVE_NATIVE_func or |
---|
120 | HAVE_HOST_CPU_foo, as desired. |
---|
121 | |
---|
122 | iii) Add `#undef HAVE_NATIVE_func' to acconfig.h. This is only |
---|
123 | actually necessary if that define is going to be used, but for |
---|
124 | consistency it's good to do it always. |
---|
125 | |
---|
126 | iv) Add file.c to nodist_libdummy_la_SOURCES in mpn/Makefile.am (in |
---|
127 | order to get an ansi2knr rule). If the file is only in |
---|
128 | assembler then this step is unnecessary, but do it anyway so as |
---|
129 | not to forget if later a .c version is added. |
---|
130 | |
---|
131 | v) If the function can be provided by a multi-function file, then |
---|
132 | add to the "case" statement in configure.in which lists each |
---|
133 | multi-function filename and what function files it can provide. |
---|
134 | |
---|
135 | |
---|
136 | ** Adding a test program |
---|
137 | |
---|
138 | i) Tests to be run early in the testing can be added to the main |
---|
139 | "tests" sub-directory. |
---|
140 | |
---|
141 | ii) Tests for mpn, mpz, mpq and mpf can be added under the |
---|
142 | corresponding tests subdirectory. |
---|
143 | |
---|
144 | iii) Generic tests for late in the testing can be added to |
---|
145 | "tests/misc". printf and scanf tests currently live there too. |
---|
146 | |
---|
147 | iv) Random number function tests can be added to "tests/rand". That |
---|
148 | directory has some development-time programs too. |
---|
149 | |
---|
150 | v) C++ test programs can be added to "tests/cxx". A line like the |
---|
151 | following must be added for each, since by default automake looks |
---|
152 | for a .c file. |
---|
153 | |
---|
154 | t_foo_SOURCES = t-foo.cc |
---|
155 | |
---|
156 | In all cases the name of the program should be added to check_PROGRAMS |
---|
157 | in the Makefile.am. TESTS is equal to check_PROGRAMS, so all those |
---|
158 | programs get run. |
---|
159 | |
---|
160 | "tests/devel" has a number of programs which are only for development |
---|
161 | purposes and are not for use in "make check". These should be listed |
---|
162 | in EXTRA_PROGRAMS to get Makefile rules created, but they're never |
---|
163 | built or run unless an explicit "make someprog" is used. |
---|
164 | |
---|
165 | ** Macos directory |
---|
166 | |
---|
167 | The macos/configure script will automatically pick up additions to |
---|
168 | gmp_mpn_functions, MPZ_OBJECTS, etc, but currently test programs need |
---|
169 | to be added to Makefile.in manually. |
---|
170 | |
---|
171 | When modifying the top-level configure.in ensure that it doesn't upset |
---|
172 | the macos/configure script heuristics. |
---|
173 | |
---|
174 | |
---|
175 | * Adding a new CPU |
---|
176 | |
---|
177 | In general it's policy to use proper names for each CPU type |
---|
178 | supported. If two CPUs are quite similar and perhaps don't have any |
---|
179 | actual differences in GMP then they're still given separate names, for |
---|
180 | example alphaev67 and alphaev68. |
---|
181 | |
---|
182 | Canonical names: |
---|
183 | |
---|
184 | i) Decide the canonical CPU names GMP will accept. |
---|
185 | |
---|
186 | ii) Add these to the config.sub wrapper if configfsf.sub doesn't |
---|
187 | already accept them. |
---|
188 | |
---|
189 | iii) Document the names in gmp.texi. |
---|
190 | |
---|
191 | Aliases (optional): |
---|
192 | |
---|
193 | i) Any aliases can be added to the config.sub wrapper, unless |
---|
194 | configfsf.sub already does the right thing with them. |
---|
195 | |
---|
196 | ii) Leave configure.in and everywhere else using only the canonical |
---|
197 | names. Aliases shouldn't appear anywhere except config.sub. |
---|
198 | |
---|
199 | iii) Document in gmp.texi, if desired. Usually this isn't a good |
---|
200 | idea, better encourage users to know just the canonical |
---|
201 | names. |
---|
202 | |
---|
203 | Configure: |
---|
204 | |
---|
205 | i) Add patterns to configure.in for the new CPU names. Include the |
---|
206 | following (see configure.in for the variables to set up), |
---|
207 | |
---|
208 | a) ABI choices (if any). |
---|
209 | b) Compiler choices. |
---|
210 | c) mpn path for CPU specific code. |
---|
211 | d) Good default CFLAGS for each likely compiler. |
---|
212 | d) Any special tests necessary on the compiler or assembler |
---|
213 | capabilities. |
---|
214 | |
---|
215 | ii) M4 macros to be shared by asm files in a CPU family are by |
---|
216 | convention in a foo-defs.m4 like mpn/x86/x86-defs.m4. They're |
---|
217 | likely to use settings from config.m4 generated by configure. |
---|
218 | |
---|
219 | |
---|
220 | * The configure system |
---|
221 | |
---|
222 | ** Installing tools |
---|
223 | |
---|
224 | The current versions of automake, autoconf and libtool in use can be |
---|
225 | checked in the ChangeLog. Look for "Update to ...". Patches may have |
---|
226 | been applied, look for "Regenerate ...". |
---|
227 | |
---|
228 | The GMP build system is in places somewhat dependent on the internals |
---|
229 | of the build tools. Obviously that's avoided as much as possible, but |
---|
230 | where it can't it creates a problem when upgrading or attempting to |
---|
231 | use different tools versions. |
---|
232 | |
---|
233 | ** Updating gmp |
---|
234 | |
---|
235 | The following files need to be updated when going to a new version of |
---|
236 | the build tools. Unfortunately the tools generally don't identify |
---|
237 | when an out-of-date version is present. |
---|
238 | |
---|
239 | aclocal.m4 is updated by running "aclocal -I mpfr". |
---|
240 | |
---|
241 | INSTALL.autoconf can be copied from INSTALL in autoconf. |
---|
242 | |
---|
243 | ltmain.sh comes from libtool. Remove it and run "libtoolize --copy", |
---|
244 | or just copy the file by hand. |
---|
245 | |
---|
246 | ansi2knr.c, ansi2knr.1, install.sh, mdate-sh and mkinstalldirs come |
---|
247 | from automake and can be updated by copying or by removing and running |
---|
248 | "automake --add-missing --copy". |
---|
249 | |
---|
250 | texinfo.tex can be updated from ftp.gnu.org. Check it still works |
---|
251 | with "make gmp.dvi" and "texi2pdf gmp.texi". |
---|
252 | |
---|
253 | configfsf.guess and configfsf.sub can be updated from ftp.gnu.org (or |
---|
254 | from the "config" cvs module at subversions.gnu.org). The gmp |
---|
255 | config.guess and config.sub wrappers are supposed to make such an |
---|
256 | update fairly painless. |
---|
257 | |
---|
258 | depcomp from automake is not needed because all Makefile.am files |
---|
259 | specify "no-dependencies". |
---|
260 | |
---|
261 | ** How it works |
---|
262 | |
---|
263 | During development: |
---|
264 | |
---|
265 | Input files Tool Output files |
---|
266 | ------------------------------------------ |
---|
267 | aclocal |
---|
268 | acinclude.m4 --------------> aclocal.m4 |
---|
269 | |
---|
270 | autoconf |
---|
271 | configure.in \ -------------> configure |
---|
272 | aclocal.m4 / |
---|
273 | |
---|
274 | automake |
---|
275 | Makefile.am \ -------------> Makefile.in |
---|
276 | configure.in / |
---|
277 | |
---|
278 | autoheader |
---|
279 | configure.in \ -------------> config.in |
---|
280 | aclocal.m4 | |
---|
281 | acconfig.h / |
---|
282 | |
---|
283 | When configured with --enable-maintainer-mode the necessary tools are |
---|
284 | re-run on changing the input files. This can end up running a lot |
---|
285 | more things than are really necessary, but that's too bad. |
---|
286 | |
---|
287 | At build time: |
---|
288 | |
---|
289 | Input files Tool Output files |
---|
290 | ------------------------------------------ |
---|
291 | |
---|
292 | Makefile.in \ configure / Makefile |
---|
293 | config.in | -------------> | config.h |
---|
294 | gmp-h.in | | config.m4 |
---|
295 | mp-h.in / | gmp.h |
---|
296 | \ mp.h |
---|
297 | |
---|
298 | ** C++ configuration |
---|
299 | |
---|
300 | It's intended that the contents of libgmp.la won't vary according to |
---|
301 | whether --enable-cxx is selected. This means that if C++ shared |
---|
302 | libraries don't work properly then a shared+static with --disable-cxx |
---|
303 | can be done for the C parts, then a static-only with --enable-cxx to |
---|
304 | get libgmpxx. |
---|
305 | |
---|
306 | libgmpxx.la uses some internals from libgmp.la, in order to share code |
---|
307 | between C and C++. It's intended that libgmpxx can only be expected |
---|
308 | to work with libgmp from the same version of GMP. If some of the |
---|
309 | shared internals change their interface, then it's proposed to rename |
---|
310 | them, for instance __gmp_doprint2 or the like, so as to provoke link |
---|
311 | errors rather than mysterious failures from a mismatch. |
---|
312 | |
---|
313 | * Development setups |
---|
314 | |
---|
315 | ** General |
---|
316 | |
---|
317 | --disable-shared will make builds go much faster, though of course |
---|
318 | shared or shared+static should be tested too. |
---|
319 | |
---|
320 | --enable-mpbsd grabs various bits of mpz, which might need to be |
---|
321 | adjusted if things in those routines are changed. Building mpbsd all |
---|
322 | the time doesn't cost much. |
---|
323 | |
---|
324 | --prefix to a dummy directory followed by "make install" will show |
---|
325 | what's installed. |
---|
326 | |
---|
327 | "make check" acts on the libgmp just built, and will ignore any other |
---|
328 | /usr/lib/libgmp, or at least it should do. Libtool does various hairy |
---|
329 | things to ensure it hits the just-built library. |
---|
330 | |
---|
331 | ** Debugging |
---|
332 | |
---|
333 | A build with maximum debugging can be made with |
---|
334 | |
---|
335 | ./configure --host=none --enable-assert --enable-alloca=debug |
---|
336 | |
---|
337 | Malloc memory leaks are always checked by the test programs. With |
---|
338 | alloca=debug any TMP_ALLOC leaks will be detected too. |
---|
339 | --enable-alloca=malloc-reentrant also has this effect. |
---|
340 | |
---|
341 | ** Long long limb testing |
---|
342 | |
---|
343 | On systems where gcc supports long long, but a limb is normally just a |
---|
344 | long, the following can be used to force long long for testing |
---|
345 | purposes. It will probably run quite slowly. |
---|
346 | |
---|
347 | ./configure --host=none ABI=longlong |
---|
348 | |
---|
349 | ** Function argument conversions |
---|
350 | |
---|
351 | When using gcc, configuring with something like |
---|
352 | |
---|
353 | ./configure CFLAGS="-g -Wall -Wconversion -Wno-sign-compare" |
---|
354 | |
---|
355 | can show where function parameters are being converted due to having |
---|
356 | function prototypes available, which won't happen in a K&R compiler. |
---|
357 | Doing this in combination with the long long limb setups above is |
---|
358 | good. |
---|
359 | |
---|
360 | Conversions between int and long aren't warned about by gcc when |
---|
361 | they're the same size, which is unfortunate because casts should be |
---|
362 | used in such cases, for the benefit of K&R compilers with int!=long |
---|
363 | and where the difference matters in function calls. |
---|
364 | |
---|
365 | ** K&R support |
---|
366 | |
---|
367 | Function definitions must be in the GNU stylized form to work. See |
---|
368 | the ansi2knr.1 man page. |
---|
369 | |
---|
370 | __GMP_PROTO is used for function prototypes, other ANSI / K&R |
---|
371 | differences are conditionalized in various places. |
---|
372 | |
---|
373 | Proper testing of the K&R support requires a compiler which gives an |
---|
374 | error for ANSI-isms. Configuring with --host=none is a good idea, to |
---|
375 | test all the generic C code. |
---|
376 | |
---|
377 | When using an ANSI compiler, the ansi2knr setups can be partially |
---|
378 | tested with |
---|
379 | |
---|
380 | ./configure am_cv_prog_cc_stdc=no |
---|
381 | |
---|
382 | This will test the use of $U and the like in the makefiles, but not |
---|
383 | much else. |
---|
384 | |
---|
385 | am_cv_prog_cc_stdc=no can be used with a compiler like HP C which is |
---|
386 | K&R by default but to which configure normally adds ANSI mode flags. |
---|
387 | This then should be a good full K&R test. |
---|
388 | |
---|
389 | |
---|
390 | |
---|
391 | Local variables: |
---|
392 | mode: outline |
---|
393 | fill-column: 70 |
---|
394 | End: |
---|
395 | /* eof doc/configuration */ |
---|