| version 1.1, 2000/09/09 14:12:20 |
version 1.1.1.2, 2003/08/25 16:06:11 |
|
|
| /* doc/configuration (in Emacs -*-outline-*- format). */ |
/* doc/configuration (in Emacs -*-outline-*- format). */ |
| |
|
| * How to add a new file |
Copyright 2000, 2001, 2002 Free Software Foundation, Inc. |
| |
|
| ** A file in the `mpn' subdirectory |
This file is part of the GNU MP Library. |
| |
|
| The way we build libmpn (in the `mpn' subdirectory) is quite special. |
The GNU MP Library is free software; you can redistribute it and/or modify |
| |
it under the terms of the GNU Lesser General Public License as published by |
| |
the Free Software Foundation; either version 2.1 of the License, or (at your |
| |
option) any later version. |
| |
|
| There is (currently) only one ``generic'' file, one that is truly |
The GNU MP Library is distributed in the hope that it will be useful, but |
| target independent. That is `mp_bases.c'. All other files are kept |
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
| in subdirectories of `mpn' with the subdirectory names indicating the |
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public |
| target processor. For example, in the `alpha' subdirectory, code |
License for more details. |
| specific to the Alpha processor is found. |
|
| |
|
| When running `configure', a bunch of symbolic links are made in the |
You should have received a copy of the GNU Lesser General Public License |
| `mpn' subdirectory. If the the build host doesn't support symlinks |
along with the GNU MP Library; see the file COPYING.LIB. If not, write to |
| then either hard links or copying is used. |
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA |
| |
02111-1307, USA. |
| |
|
| |
|
| |
|
| |
* Adding a new file |
| |
|
| |
** Adding a top-level file |
| |
|
| |
i) Add it to libgmp_la_SOURCES in Makefile.am. |
| |
|
| |
ii) If libmp.la needs it (usually doesn't), then add it to |
| |
libmp_la_SOURCES too. |
| |
|
| |
** Adding a subdirectory file |
| |
|
| |
For instance for mpz, |
| |
|
| |
i) Add file.c to libmpz_la_SOURCES in mpz/Makefile.am. |
| |
|
| |
ii) Add mpz/file$U.lo to MPZ_OBJECTS in the top-level Makefile.am |
| |
|
| |
iii) If for some reason libmp.la needs it (usually doesn't) then add |
| |
mpz/file$U.lo to libmp_la_DEPENDENCIES in the top-level |
| |
Makefile.am too. |
| |
|
| |
The same applies to mpf, mpq, scanf and printf. |
| |
|
| |
** Adding an mpn file |
| |
|
| |
The way we build libmpn (in the `mpn' subdirectory) is quite special. |
| |
|
| |
Currently only mpn/mp_bases.c is truely generic and included in every |
| |
configuration. All other files are linked at build time into the mpn |
| |
build directory from one of the CPU specific sub-directories, or from |
| |
the mpn/generic directory. |
| |
|
| There are four types of mpn source files. |
There are four types of mpn source files. |
| |
|
| .asm Assembly code preprocessed with m4 |
.asm Assembly code preprocessed with m4 |
| .S Assembly code preprocessed with CPP |
.S Assembly code preprocessed with cpp |
| .s Assembly code not preprocessed at all |
.s Assembly code not preprocessed at all |
| .c C code |
.c C code |
| |
|
| There are two types of .asm files. |
There are two types of .asm files. |
| |
|
| i) ``Normal'' files containing one function, possibly with more than |
i) ``Normal'' files containing one function, though possibly with |
| one entry point. |
more than one entry point. |
| |
|
| ii) Multi-function files that generate one of a set of functions |
ii) Multi-function files that generate one of a set of functions |
| according to build options. |
according to build options. |
| |
|
| |
To add a new implementation of an existing function, |
| |
|
| When adding a new implementation of an existing function, |
i) Put it in the appropriate CPU-specific mpn subdirectory, it'll be |
| |
detected and used. |
| |
|
| i) Put it in the appropriate mpn subdirectory. It'll be detected and |
ii) Any entrypoints tested by HAVE_NATIVE_func in other code must |
| used. |
have PROLOGUE(func) for configure to grep. This is normal for |
| |
.asm or .S files, but for .c files a dummy comment like the |
| |
following will be needed. |
| |
|
| ii) If it's a .asm or .S, be sure to have a PROLOGUE(func) entry |
/* |
| point since configure greps for that to set up the |
PROLOGUE(func) |
| HAVE_NATIVE_func defines in config.h. |
*/ |
| |
|
| When adding a new implementation using a multi-function file, in |
To add a new implementation using a multi-function file, in addition |
| addition do the following, |
do the following, |
| |
|
| i) Use a MULFUNC_PROLOGUE(func1 func2 ...) in the .asm, declaring |
i) Use a MULFUNC_PROLOGUE(func1 func2 ...) in the .asm, declaring |
| all the functions implemented, including carry-in variants. |
all the functions implemented, including carry-in variants. |
| Line 51 addition do the following, |
|
| Line 92 addition do the following, |
|
| then MULFUNC_PROLOGUE isn't necessary (but this is usually not |
then MULFUNC_PROLOGUE isn't necessary (but this is usually not |
| the case). |
the case). |
| |
|
| When adding a new style of multi-function file, in addition do the |
To add a new style of multi-function file, in addition do the |
| following, |
following, |
| |
|
| i) Add to the "case" statement in configure.in which lists each |
i) Add to the "case" statement in configure.in which lists each |
| multi-function filename and what function files it can provide. |
multi-function filename and what function files it can provide. |
| |
|
| When adding a completely new mpn function file, do the following, |
To add a completely new mpn function file, do the following, |
| |
|
| i) Add it to configure.in under one of the following |
i) Ensure the filename is a valid C identifier, due to the |
| |
-DOPERATION_$* used to support multi-function files. This means |
| |
"-" can't be used (but "_" can). |
| |
|
| a) `gmp_mpn_functions' if it exists for every target. This means |
ii) Add it to configure.in under one of the following |
| there must be a C version in mpn/generic. (Eg. add_n) |
|
| |
|
| b) `gmp_mpn_functions_optional' if it's a standard function, but |
a) `gmp_mpn_functions' if it exists for every target. This |
| doesn't need to exist for every target. Code wanting to use |
means there must be a C version in mpn/generic. (Eg. mul_1) |
| this will test HAVE_NATIVE_func to see if it's available. |
|
| (Eg. copyi) |
|
| |
|
| c) `extra_functions' for some targets, if it's a special function |
b) `gmp_mpn_functions_optional' if it's a standard function, but |
| that only ever needs to exist for certain targets. Code |
doesn't need to exist for every target. Code wanting to use |
| wanting to use it will generally look for the target, but |
this will test HAVE_NATIVE_func to see if it's available. |
| HAVE_NATIVE_func can be used if desired. |
(Eg. copyi) |
| |
|
| ii) If you want `HAVE_NATIVE_func' defined in config.h, add |
c) `extra_functions' for some targets, if it's a special |
| `#undef HAVE_NATIVE_func' to acconfig.h. |
function that only ever needs to exist for certain targets. |
| |
Code wanting to use it can test either HAVE_NATIVE_func or |
| |
HAVE_HOST_CPU_foo, as desired. |
| |
|
| iii) If the function can be provided by a multi-function file, |
iii) Add `#undef HAVE_NATIVE_func' to acconfig.h. This is only |
| then follow the directions above for them too. |
actually necessary if that define is going to be used, but for |
| |
consistency it's good to do it always. |
| |
|
| ** Add a file in any other directory |
iv) Add file.c to nodist_libdummy_la_SOURCES in mpn/Makefile.am (in |
| |
order to get an ansi2knr rule). If the file is only in |
| |
assembler then this step is unnecessary, but do it anyway so as |
| |
not to forget if later a .c version is added. |
| |
|
| When adding a top-level file, |
v) If the function can be provided by a multi-function file, then |
| |
add to the "case" statement in configure.in which lists each |
| |
multi-function filename and what function files it can provide. |
| |
|
| i) Add it to libgmp_la_SOURCES in Makefile.am. |
|
| |
|
| ii) If libmp.la needs it, then add it to libmp_la_SOURCES too. |
** Adding a test program |
| |
|
| When adding an mpz file, |
i) Tests to be run early in the testing can be added to the main |
| |
"tests" sub-directory. |
| |
|
| i) Add file.c to libmpz_la_SOURCES in mpz/Makefile.am. |
ii) Tests for mpn, mpz, mpq and mpf can be added under the |
| |
corresponding tests subdirectory. |
| |
|
| ii) Add mpz/file.lo to MPZ_OBJECTS in the top-level Makefile.am. |
iii) Generic tests for late in the testing can be added to |
| |
"tests/misc". printf and scanf tests currently live there too. |
| |
|
| If a multi-function mpz file is being added, |
iv) Random number function tests can be added to "tests/rand". That |
| |
directory has some development-time programs too. |
| |
|
| i) In mpz/Makefile.am, |
v) C++ test programs can be added to "tests/cxx". A line like the |
| |
following must be added for each, since by default automake looks |
| |
for a .c file. |
| |
|
| a) Add the file to EXTRA_DIST. |
t_foo_SOURCES = t-foo.cc |
| |
|
| b) Add rules copying the file at build time to duplicates with |
In all cases the name of the program should be added to check_PROGRAMS |
| appropriate names. |
in the Makefile.am. TESTS is equal to check_PROGRAMS, so all those |
| |
programs get run. |
| |
|
| c) Add each such func.c to nodist_libmpz_la_SOURCES. |
"tests/devel" has a number of programs which are only for development |
| |
purposes and are not for use in "make check". These should be listed |
| |
in EXTRA_PROGRAMS to get Makefile rules created, but they're never |
| |
built or run unless an explicit "make someprog" is used. |
| |
|
| ii) Add each c) above also as mpz/func.lo in MPZ_OBJECTS in the |
** Macos directory |
| top-level Makefile.am. |
|
| |
|
| iii) In the multi-function file, expect a preprocessor symbol |
The macos/configure script will automatically pick up additions to |
| OPERATION_func to indicate what form is being compiled. |
gmp_mpn_functions, MPZ_OBJECTS, etc, but currently test programs need |
| |
to be added to Makefile.in manually. |
| |
|
| The same applies to mpf and mpq (except that multi-function support |
When modifying the top-level configure.in ensure that it doesn't upset |
| doesn't exist in mpq/Makefile.am at the moment). |
the macos/configure script heuristics. |
| |
|
| See mpz/mul_siui.c or mpf/integer.c for example multi-function files. |
|
| |
|
| * Selecting compiler and its flags by hand |
* Adding a new CPU |
| |
|
| Specifying CC on the configure command line, will result in a default |
In general it's policy to use proper names for each CPU type |
| set of compiler flags, CFLAGS; `-g' for all compilers plus `-O2' for |
supported. If two CPUs are quite similar and perhaps don't have any |
| gcc. Specify CFLAGS to set better flags. |
actual differences in GMP then they're still given separate names, for |
| |
example alphaev67 and alphaev68. |
| |
|
| Example |
Canonical names: |
| |
|
| $ configure CC=my-gcc |
i) Decide the canonical CPU names GMP will accept. |
| |
|
| will give |
ii) Add these to the config.sub wrapper if configfsf.sub doesn't |
| |
already accept them. |
| |
|
| CFLAGS = -g -O2 |
iii) Document the names in gmp.texi. |
| |
|
| Specifying CC on the configure command line will make configure |
Aliases (optional): |
| believe it's a 32-bit compiler and not choose a source path with |
|
| 64-bit assembly code. Specify CC64 as well as CC to make configure |
|
| pick 64-bit assembly code. |
|
| |
|
| $ configure CC=my64bit-cc CC64=my64bit-cc CFLAGS="-my -flags" |
i) Any aliases can be added to the config.sub wrapper, unless |
| |
configfsf.sub already does the right thing with them. |
| |
|
| |
ii) Leave configure.in and everywhere else using only the canonical |
| |
names. Aliases shouldn't appear anywhere except config.sub. |
| |
|
| |
iii) Document in gmp.texi, if desired. Usually this isn't a good |
| |
idea, better encourage users to know just the canonical |
| |
names. |
| |
|
| |
Configure: |
| |
|
| |
i) Add patterns to configure.in for the new CPU names. Include the |
| |
following (see configure.in for the variables to set up), |
| |
|
| |
a) ABI choices (if any). |
| |
b) Compiler choices. |
| |
c) mpn path for CPU specific code. |
| |
d) Good default CFLAGS for each likely compiler. |
| |
d) Any special tests necessary on the compiler or assembler |
| |
capabilities. |
| |
|
| |
ii) M4 macros to be shared by asm files in a CPU family are by |
| |
convention in a foo-defs.m4 like mpn/x86/x86-defs.m4. They're |
| |
likely to use settings from config.m4 generated by configure. |
| |
|
| |
|
| * The configure system |
* The configure system |
| |
|
| ** What we use |
** Installing tools |
| We use the tools in <ftp://ftp.swox.com/pub/gmp/infrastructure/>. |
|
| |
|
| ** How to install new versions of Autoconf / Automake / Libtool |
The current versions of automake, autoconf and libtool in use can be |
| |
checked in the ChangeLog. Look for "Update to ...". Patches may have |
| |
been applied, look for "Regenerate ...". |
| |
|
| *** Build Libtool |
The GMP build system is in places somewhat dependent on the internals |
| With a fresh CVS checkout, run the bootstrap script with released |
of the build tools. Obviously that's avoided as much as possible, but |
| versions (not CVS versions) of Autoconf and Automake in PATH. |
where it can't it creates a problem when upgrading or attempting to |
| |
use different tools versions. |
| |
|
| *** Update gmp directory |
** Updating gmp |
| gmp$ rm ltconfig ltmain.sh |
|
| gmp$ libtoolize --copy |
|
| gmp$ automake --add-missing --copy |
|
| |
|
| |
The following files need to be updated when going to a new version of |
| |
the build tools. Unfortunately the tools generally don't identify |
| |
when an out-of-date version is present. |
| |
|
| |
aclocal.m4 is updated by running "aclocal -I mpfr". |
| |
|
| |
INSTALL.autoconf can be copied from INSTALL in autoconf. |
| |
|
| |
ltmain.sh comes from libtool. Remove it and run "libtoolize --copy", |
| |
or just copy the file by hand. |
| |
|
| |
ansi2knr.c, ansi2knr.1, install.sh, mdate-sh and mkinstalldirs come |
| |
from automake and can be updated by copying or by removing and running |
| |
"automake --add-missing --copy". |
| |
|
| |
texinfo.tex can be updated from ftp.gnu.org. Check it still works |
| |
with "make gmp.dvi" and "texi2pdf gmp.texi". |
| |
|
| |
configfsf.guess and configfsf.sub can be updated from ftp.gnu.org (or |
| |
from the "config" cvs module at subversions.gnu.org). The gmp |
| |
config.guess and config.sub wrappers are supposed to make such an |
| |
update fairly painless. |
| |
|
| |
depcomp from automake is not needed because all Makefile.am files |
| |
specify "no-dependencies". |
| |
|
| ** How it works |
** How it works |
| |
|
| During development: |
During development: |
| |
|
| Input files Tool Output files |
Input files Tool Output files |
| ------------------------------------------ |
------------------------------------------ |
| aclocal |
aclocal |
| acinclude.m4 --------------> aclocal.m4 |
acinclude.m4 --------------> aclocal.m4 |
| |
|
| autoconf |
autoconf |
| configure.in \ -------------> configure |
configure.in \ -------------> configure |
| aclocal.m4 / |
aclocal.m4 / |
| |
|
| automake |
automake |
| Makefile.am \ -------------> Makefile.in |
Makefile.am \ -------------> Makefile.in |
| configure.in / |
configure.in / |
| |
|
| autoheader |
autoheader |
| configure.in \ -------------> config.in |
configure.in \ -------------> config.in |
| |
aclocal.m4 | |
| acconfig.h / |
acconfig.h / |
| |
|
| |
When configured with --enable-maintainer-mode the necessary tools are |
| |
re-run on changing the input files. This can end up running a lot |
| |
more things than are really necessary, but that's too bad. |
| |
|
| At build time: |
At build time: |
| |
|
| Input files Tool Output files |
Input files Tool Output files |
| ------------------------------------------ |
------------------------------------------ |
| |
|
| configure |
|
| Makefile.in \ -------------> / Makefile |
|
| config.in / | config.h |
|
| \ config.m4 |
|
| |
|
| |
Makefile.in \ configure / Makefile |
| |
config.in | -------------> | config.h |
| |
gmp-h.in | | config.m4 |
| |
mp-h.in / | gmp.h |
| |
\ mp.h |
| |
|
| |
** C++ configuration |
| |
|
| |
It's intended that the contents of libgmp.la won't vary according to |
| |
whether --enable-cxx is selected. This means that if C++ shared |
| |
libraries don't work properly then a shared+static with --disable-cxx |
| |
can be done for the C parts, then a static-only with --enable-cxx to |
| |
get libgmpxx. |
| |
|
| |
libgmpxx.la uses some internals from libgmp.la, in order to share code |
| |
between C and C++. It's intended that libgmpxx can only be expected |
| |
to work with libgmp from the same version of GMP. If some of the |
| |
shared internals change their interface, then it's proposed to rename |
| |
them, for instance __gmp_doprint2 or the like, so as to provoke link |
| |
errors rather than mysterious failures from a mismatch. |
| |
|
| |
* Development setups |
| |
|
| |
** General |
| |
|
| |
--disable-shared will make builds go much faster, though of course |
| |
shared or shared+static should be tested too. |
| |
|
| |
--enable-mpbsd grabs various bits of mpz, which might need to be |
| |
adjusted if things in those routines are changed. Building mpbsd all |
| |
the time doesn't cost much. |
| |
|
| |
--prefix to a dummy directory followed by "make install" will show |
| |
what's installed. |
| |
|
| |
"make check" acts on the libgmp just built, and will ignore any other |
| |
/usr/lib/libgmp, or at least it should do. Libtool does various hairy |
| |
things to ensure it hits the just-built library. |
| |
|
| |
** Debugging |
| |
|
| |
A build with maximum debugging can be made with |
| |
|
| |
./configure --host=none --enable-assert --enable-alloca=debug |
| |
|
| |
Malloc memory leaks are always checked by the test programs. With |
| |
alloca=debug any TMP_ALLOC leaks will be detected too. |
| |
--enable-alloca=malloc-reentrant also has this effect. |
| |
|
| |
** Long long limb testing |
| |
|
| |
On systems where gcc supports long long, but a limb is normally just a |
| |
long, the following can be used to force long long for testing |
| |
purposes. It will probably run quite slowly. |
| |
|
| |
./configure --host=none ABI=longlong |
| |
|
| |
** Function argument conversions |
| |
|
| |
When using gcc, configuring with something like |
| |
|
| |
./configure CFLAGS="-g -Wall -Wconversion -Wno-sign-compare" |
| |
|
| |
can show where function parameters are being converted due to having |
| |
function prototypes available, which won't happen in a K&R compiler. |
| |
Doing this in combination with the long long limb setups above is |
| |
good. |
| |
|
| |
Conversions between int and long aren't warned about by gcc when |
| |
they're the same size, which is unfortunate because casts should be |
| |
used in such cases, for the benefit of K&R compilers with int!=long |
| |
and where the difference matters in function calls. |
| |
|
| |
** K&R support |
| |
|
| |
Function definitions must be in the GNU stylized form to work. See |
| |
the ansi2knr.1 man page. |
| |
|
| |
__GMP_PROTO is used for function prototypes, other ANSI / K&R |
| |
differences are conditionalized in various places. |
| |
|
| |
Proper testing of the K&R support requires a compiler which gives an |
| |
error for ANSI-isms. Configuring with --host=none is a good idea, to |
| |
test all the generic C code. |
| |
|
| |
When using an ANSI compiler, the ansi2knr setups can be partially |
| |
tested with |
| |
|
| |
./configure am_cv_prog_cc_stdc=no |
| |
|
| |
This will test the use of $U and the like in the makefiles, but not |
| |
much else. |
| |
|
| |
am_cv_prog_cc_stdc=no can be used with a compiler like HP C which is |
| |
K&R by default but to which configure normally adds ANSI mode flags. |
| |
This then should be a good full K&R test. |
| |
|
| |
|
| |
|
| |
Local variables: |
| |
mode: outline |
| |
fill-column: 70 |
| |
End: |
| /* eof doc/configuration */ |
/* eof doc/configuration */ |