The Makefile is the key to the build process. In its
simplest form, a Makefile is a script for compiling or building
the "binaries", the executable portions of a package. The
Makefile can also provide a means of updating a software package
without having to recompile every single source file in it, but
that is a different story (or a different article).
At some point, the Makefile launches cc or
gcc. This is actually a preprocessor, a C (or C++)
compiler, and a linker, invoked in that order. This process
converts the source into the binaries, the actual executables.
Invoking make usually involves just typing make. This generally builds all the necessary executable files for the package in question. However, make can also do other tasks, such as installing the files in their proper directories (make install) and removing stale object files (make clean). Running make -n permits previewing the build process, as it prints out all the commands that would be triggered by a make, without actually executing them.
Only the simplest software uses a generic Makefile. More complex
installations require tailoring the Makefile according to the
location of libraries, include files, and resources on your
particular machine. This is especially the case when the build
needs the X11 libraries to install. Imake
and xmkmf accomplish this task.
An Imakefile is, to quote the man page, a "template"
Makefile. The imake utility constructs a Makefile appropriate for
your system from the Imakefile. In almost all cases, however, you
would run xmkmf, a shell script that invokes imake, a
front end for it. Check the README or INSTALL file included in
the software archive for specific instructions. (If, after
dearchiving the source files, there is an Imake file
present in the base directory, this is a dead giveaway that
xmkmf should be run.) Read the Imake and
xmkmf man pages for a more detailed analysis of the
procedure.
Be aware that xmkmf and make may need
to be invoked as root, especially when doing a make
install to move the binaries over to the
/usr/bin or /usr/local/bin directories.
Using make as an ordinary user without root privileges will
likely result in write access denied error messages
because you lack write permission to system directories. Check
also that the binaries created have the proper execute
permissions for you and any other appropriate users.
Invoking xmkmf uses the Imake file to build a
new Makefile appropriate for your system. You would normally
invoke xmkmf with the -a argument, to automatically
do a make Makefiles, make includes, and make
depend. This sets the variables and defines the library
locations for the compiler and linker. Sometimes, there will be
no Imake file, instead there will be an
INSTALL or configure script that will
accomplish this purpose. Note that if you run
configure, it should be invoked as
./configure to ensure that the correct
configure script in the current directory is called.
In most cases, the README file included with the
distribution will explain the install procedure.
It is usually a good idea to visually inspect the
Makefile that xmkmf or one of the
install scripts builds. The Makefile will normally be correct for
your system, but you may occasionally be required to "tweak" it
or correct errors manually.
Installing the freshly built binaries into the appropriate system
directories is usually a matter of running make install as
root. The usual directories for system-wide binaries on modern
Linux distributions are /usr/bin,
/usr/X11R6/bin, and /usr/local/bin. The
preferred directory for new packages is
/usr/local/bin, as this will keep separate binaries
not part of the original Linux installation.
Packages originally targeted for commercial versions of UNIX may
attempt to install in the /opt or other unfamiliar
directory. This will, of course, result in an installation error
if the intended installation directory does not exist. The
simplest way to deal with this is to create, as root, an
/opt directory, let the package install there, then
add that directory to the PATH environmental
variable. Alternatively, you may create symbolic links to the
/usr/local/bin directory.
Your general installation procedure will therefore be:
README file and other applicable docs.
INSTALL or
configure script.
Makefile.
Notes:
gcc in the standard Makefile included or
created in the package you are installing. Some of these common
options are -O2, -fomit-frame-pointer,
-funroll-loops, and -mpentium (if you are
running a Pentium cpu). Use caution and good sense when
modifying a Makefile!
/coll and
/pack directories. You may find it necessary to
download the Pack-Collection from the above site
should you ever run across one of these distributions.