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