There are two ways to build this code;

(1) Manually

(2) Using all-singing all-dancing (all-confusing) autotools, ie. autoconf,
automake, and their little friends (autoheader, etc).

=================
Building Manually
=================

There is a basic "Makefile" in this directory that gets moved out of the way and
ignored when building with autoconf et al. This Makefile is suitable for
building tunala on Linux using gcc. Any other platform probably requires some
tweaking. Here are the various bits you might need to do if you want to build
this way and the default Makefile isn't sufficient;

* Compiler: Edit the "CC" definition in Makefile

* Headers, features: tunala.h controls what happens in the non-autoconf world.
  It, by default, assumes the system has *everything* (except autoconf's
  "config.h") so if a target system is missing something it must define the
  appropriate "NO_***" symbols in CFLAGS. These include;

  - NO_HAVE_UNISTD_H, NO_HAVE_FCNTL_H, NO_HAVE_LIMITS_H
    Indicates the compiling system doesn't have (or need) these header files.
  - NO_HAVE_STRSTR, NO_HAVE_STRTOUL
    Indicates the compiling system doesn't have these functions. Replacements
    are compiled and used in breakage.c
  - NO_HAVE_SELECT, NO_HAVE_SOCKET
    Pointless symbols - these indicate select() and/or socket() are missing in
    which case the program won't compile anyway.

  If you want to specify any of these, add them with "-D" prefixed to each in
  the CFLAGS definition in Makefile.

* Compilation flags: edit DEBUG_FLAGS and/or CFLAGS directly to control the
  flags passed to the compiler. This can also be used to change the degree of
  optimisation.

* Linker flags: some systems (eg. Solaris) require extra linker flags such as;
  -ldl, -lsocket, -lnsl, etc. If unsure, bring up the man page for whichever
  function is "undefined" when the linker fails - that usually indicates what
  you need to add. Make changes to the LINK_FLAGS symbol.

* Linker command: if a different linker syntax or even a different program is
  required to link, edit the linker line directly in the "tunala:" target
  definition - it currently assumes the "CC" (compiler) program is used to link.

======================
Building Automagically
======================

Automagic building is handled courtesy of autoconf, automake, etc. There are in
fact two steps required to build, and only the first has to be done on a system
with these tools installed (and if I was prepared to bloat out the CVS
repository, I could store these extra files, but I'm not).

First step: "autogunk.sh"
-------------------------

The "./autogunk.sh" script will call all the necessary autotool commands to
create missing files and run automake and autoconf. The result is that a
"./configure" script should be generated and a "Makefile.in" generated from the
supplied "Makefile.am". NB: This script also moves the "manual" Makefile (see
above) out of the way and calls it "Makefile.plain" - the "ungunk" script
reverses this to leave the directory it was previously.

Once "ungunk" has been run, the resulting directory should be able to build on
other systems without autoconf, automake, or libtool. Which is what the second
step describes;

Second step: "./configure"
--------------------------

The second step is to run the generated "./configure" script to create a
config.h header for your system and to generate a "Makefile" (generated from
"Makefile.in") tweaked to compile on your system. This is the standard sort of
thing you see in GNU packages, for example, and the standard tricks also work.
Eg. to override "configure"'s choice of compiler, set the CC environment
variable prior to running configure, eg.

    CC=gcc ./configure

would cause "gcc" to be used even if there is an otherwise preferable (to
autoconf) native compiler on your system.

After this run "make" and it should build the "tunala" executable.

Notes
-----

- Some versions of autoconf (or automake?) generate a Makefile syntax that gives
  trouble to some "make" programs on some systems (eg. OpenBSD). If this
  happens, either build 'Manually' (see above) or use "gmake" instead of "make".
  I don't like this either but like even less the idea of sifting into all the
  script magic crud that's involved.

- On a solaris system I tried, the "configure" script specified some broken
  compiler flags in the resulting Makefile that don't even get echoed to
  stdout/err when the error happens (evil!). If this happens, go into the
  generated Makefile, find the two affected targets ("%.o:" and "%.lo"), and
  remove the offending hidden option in the $(COMPILE) line all the sludge after
  the two first lines of script (ie. after the "echo" and the "COMPILE" lines).
  NB: This will probably only function if "--disable-shared" was used, otherwise
  who knows what would result ...

