home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 August / PCWorld_1999-08_cd.bin / doc / HOWTO / Software-Building-HOWTO < prev    next >
Text File  |  1999-05-17  |  44KB  |  1,519 lines

  1.   Building and Installing Software Packages for Linux
  2.   Mendel Leo Cooper <mailto:thegrendel@theriver.com> ---
  3.   http://personal.riverusers.com/~thegrendel/ <http://per¡
  4.   sonal.riverusers.com/~thegrendel/>
  5.   v1.80, 16 May 1999
  6.  
  7.   This is a comprehensive guide to building and installing"generic" UNIX
  8.   software distributions under Linux. Additionally, there is some cover¡
  9.   age of packages targeted specifically for Linux.
  10.   ______________________________________________________________________
  11.  
  12.   Table of Contents
  13.  
  14.  
  15.   1. Introduction
  16.  
  17.   2. Unpacking the Files
  18.  
  19.   3. Using Make
  20.  
  21.   4. Prepackaged Binaries
  22.  
  23.   5. Termcap and Terminfo Issues
  24.  
  25.   6. Backward Compatibility With a.out Binaries
  26.  
  27.      6.1 An Example
  28.  
  29.   7. Troubleshooting
  30.  
  31.      7.1 Link Errors
  32.      7.2 Other Problems
  33.      7.3 Tweaking and fine tuning
  34.      7.4 Where to go for more help
  35.  
  36.   8. Final Steps
  37.  
  38.   9. First Example: Xscrabble
  39.  
  40.   10. Second Example: Xloadimage
  41.  
  42.   11. Third Example: Fortune
  43.  
  44.   12. Fourth Example: Hearts
  45.  
  46.   13. Where to Find Source Archives
  47.  
  48.   14. Final Words
  49.  
  50.   15. References and Further Reading
  51.  
  52.  
  53.  
  54.   ______________________________________________________________________
  55.  
  56.   1.  Introduction
  57.  
  58.   Many software packages for the various flavors of UNIX and Linux come
  59.   as compressed archives of source files.  The same package may be
  60.   "built" to run on different target machines, and this saves the author
  61.   of the software from having to produce multiple versions. A single
  62.   distribution of a software package may thus end up running, in various
  63.   incarnations, on an Intel box, a DEC Alpha, a RISC workstation, or
  64.   even a mainframe.  Unfortunately, this puts the responsibility of
  65.   actually "building" and installing the software on the end user, the
  66.   de facto "system administrator", the fellow sitting at the keyboard --
  67.   you.  Take heart, though, the process is not nearly as terrifying or
  68.   mysterious as it seems, as this guide will demonstrate.
  69.  
  70.  
  71.  
  72.  
  73.  
  74.   2.  Unpacking the Files
  75.  
  76.   You have downloaded or otherwise acquired a software package.  Most
  77.   likely it is archived (tarred) and compressed (gzipped), in .tar.gz or
  78.   .tgz form (familiarly known as a "tarball").  First copy it to a
  79.   working directory. Then untar and gunzip it. The appropriate command
  80.   for this is tar xzvf filename, where filename is the name of the
  81.   software file, of course.  The de-archiving process will usually
  82.   install the appropriate files in subdirectories it will create.  Note
  83.   that if the package name has a .Z suffix, then the above procedure
  84.   will serve just as well, though running uncompress, followed by a tar
  85.   xvf also works.
  86.  
  87.   This method of unpacking "tarballs" is equivalent to either of the
  88.   following:
  89.  
  90.   ╖  gzip -cd filename | tar xvf -
  91.  
  92.   ╖  gunzip -c filename | tar xvf -
  93.  
  94.      (The '-' causes the tar command to take its input from stdin.)
  95.  
  96.   Source files in the new bzip2 (.bz2) format can be unarchived by a
  97.   bzip2 -cd filename | tar xvf -, or, more simply by a tar xyvf
  98.   filename, assuming that gzip has been appropriately patched (refer to
  99.   the Bzip2 HOWTO for details).
  100.  
  101.   [Many thanks to R. Brock Lynn for corrections and updates on the above
  102.   information.]
  103.  
  104.  
  105.  
  106.   Sometimes the archived file must be untarred and installed from the
  107.   user's home directory, or perhaps in a certain other directory, as
  108.   specified in the package's config info.  Should you get an error
  109.   message attempting to untar it, this may be the reason. Read the
  110.   package docs, especially the README and/or Install files, if present,
  111.   and edit the config files and/or Makefiles as necessary, consistent
  112.   with the installation instructions. Note that you would not ordinarily
  113.   alter the Imake file, since this could have unforseen consequences.
  114.   Some software packages permit automating this process by running make
  115.   install to emplace the binaries in the appropriate system areas.
  116.  
  117.  
  118.   ╖  You might encounter shar files, or shell archives, especially in
  119.      the source code newsgroups on the Internet.  These remain in use
  120.      because they are readable to humans, and this permits newsgroup
  121.      moderators to sort through them and reject unsuitable ones.  They
  122.      may be unpacked by the unshar filename.shar command. Otherwise the
  123.      procedure for dealing with them is the same as for "tarballs".
  124.  
  125.  
  126.  
  127.   ╖  Some source archives have been processed using nonstandard DOS,
  128.      Mac, or even Amiga compression utilities such zip, arc, lha, arj,
  129.      zoo, rar, and shk.  Fortunately, Sunsite <http://metalab.unc.edu>
  130.      and other places have Linux uncompression utilities that can deal
  131.      with most or all of these.
  132.  
  133.   Occasionally, you may need to update or incorporate bug fixes into the
  134.   unarchived source files using a patch or diff file that lists the
  135.   changes.  The doc files and/or README file will inform you should this
  136.   be the case. The normal syntax for invoking Larry Wall's powerful
  137.   patch utility is patch < patchfile.
  138.  
  139.   You may now proceed to the build stage of the process.
  140.  
  141.  
  142.  
  143.  
  144.  
  145.   3.  Using Make
  146.  
  147.   The Makefile is the key to the build process. In its simplest form, a
  148.   Makefile is a script for compiling or building the "binaries", the
  149.   executable portions of a package. The Makefile can also provide a
  150.   means of updating a software package without having to recompile every
  151.   single source file in it, but that is a different story (or a
  152.   different article).
  153.  
  154.   At some point, the Makefile launches cc or gcc. This is actually a
  155.   preprocessor, a C (or C++) compiler, and a linker, invoked in that
  156.   order.  This process converts the source into the binaries, the actual
  157.   executables.
  158.  
  159.   Invoking make usually involves just typing make. This generally builds
  160.   all the necessary executable files for the package in question.
  161.   However, make can also do other tasks, such as installing the files in
  162.   their proper directories (make install) and removing stale object
  163.   files (make clean).  Running make -n permits previewing the build
  164.   process, as it prints out all the commands that would be triggered by
  165.   a make, without actually executing them.
  166.  
  167.  
  168.   Only the simplest software uses a generic Makefile. More complex
  169.   installations require tailoring the Makefile according to the location
  170.   of libraries, include files, and resources on your particular machine.
  171.   This is especially the case when the build needs the X11 libraries to
  172.   install. Imake and xmkmf accomplish this task.
  173.  
  174.   An Imakefile is, to quote the man page, a "template" Makefile. The
  175.   imake utility constructs a Makefile appropriate for your system from
  176.   the Imakefile. In almost all cases, however, you would run xmkmf, a
  177.   shell script that invokes imake, a front end for it.  Check the README
  178.   or INSTALL file included in the software archive for specific
  179.   instructions.  (If, after dearchiving the source files, there is an
  180.   Imake file present in the base directory, this is a dead giveaway that
  181.   xmkmf should be run.)  Read the Imake and xmkmf man pages for a more
  182.   detailed analysis of the procedure.
  183.  
  184.   Be aware that xmkmf and make may need to be invoked as root,
  185.   especially when doing a make install to move the binaries over to the
  186.   /usr/bin or /usr/local/bin directories.  Using make as an ordinary
  187.   user without root privileges will likely result in write access denied
  188.   error messages because you lack write permission to system
  189.   directories. Check also that the binaries created have the proper
  190.   execute permissions for you and any other appropriate users.
  191.  
  192.   Invoking xmkmf uses the Imake file to build a new Makefile appropriate
  193.   for your system. You would normally invoke xmkmf with the -a argument,
  194.   to automatically do a make Makefiles, make includes, and make depend.
  195.   This sets the variables and defines the library locations for the
  196.   compiler and linker.  Sometimes, there will be no Imake file, instead
  197.   there will be an INSTALL or configure script that will accomplish this
  198.   purpose. Note that if you run configure, it should be invoked as
  199.   ./configure to ensure that the correct configure script in the current
  200.   directory is called. In most cases, the README file included with the
  201.   distribution will explain the install procedure.
  202.  
  203.   It is usually a good idea to visually inspect the Makefile that xmkmf
  204.   or one of the install scripts builds. The Makefile will normally be
  205.   correct for your system, but you may occasionally be required to
  206.   "tweak" it or correct errors manually.
  207.  
  208.  
  209.   Your general installation procedure will therefore be:
  210.  
  211.   ╖  Read the README file and other applicable docs.
  212.  
  213.   ╖  Run xmkmf -a, or the INSTALL or configure script.
  214.  
  215.   ╖  Check the Makefile.
  216.  
  217.   ╖  If necessary, run make clean, make Makefiles, make includes, and
  218.      make depend.
  219.  
  220.   ╖  Run make.
  221.  
  222.   ╖  Check file permissions.
  223.  
  224.   ╖  If necessary, run make install.
  225.  
  226.  
  227.  
  228.   4.  Prepackaged Binaries
  229.  
  230.  
  231.  
  232.   Manually building and installing packages from source is apparently so
  233.   daunting a task for some Linux users that they have embraced the
  234.   popular rpm and deb package formats. While it may be the case that an
  235.   rpm install normally runs as smoothly and as fast as a software
  236.   install in a certain other notorious operating system, some thought
  237.   should certainly be given to the disadvantages of self-installing,
  238.   prepackaged binaries.
  239.  
  240.   First, be aware that software packages are normally released first as
  241.   "arballs", and that prepackaged binaries follow days, weeks, even
  242.   months later.  A current rpm package is typically at least a couple of
  243.   minor version behind the latest "tarball".  So, if you wish to keep up
  244.   with all the 'bleeding edge' software, you might not wish to wait for
  245.   an rpm or deb to appear. Some less popular packages may never be
  246.   rpm'ed.
  247.  
  248.   Second, the "tarball" package may well be more complete, have more
  249.   options, and lend itself better to customization and tweaking.  The
  250.   binary rpm version may be missing some of the functionality of the
  251.   full release.  Source rpm's contain the full source code and are
  252.   equivalent to the corresponding "tarballs", and they likewise need to
  253.   be built and installed using the appropriate rpm commands.
  254.  
  255.   Third, it helps to have the source code on hand, to be able to tinker
  256.   with it and learn from it. It is much more convenient to have the
  257.   source in the archive you are building the binaries from, and not in a
  258.   separate source rpm.
  259.  
  260.   Installing an rpm package is not necessarily a no-brainer.  If there
  261.   is a dependency conflict, an rpm install will fail. Likewise, should
  262.   the rpm require a different version of libraries than the ones present
  263.   on your system, the install may not work, even if you create symbolic
  264.   links to the missing libraries from the ones in place.  Despite their
  265.   convenience, rpm installs often fail for the same reasons "tarball"
  266.   ones do.
  267.  
  268.   You must install rpm's and deb's as root, in order to have the
  269.   necessary write permissions, and this opens a potentially serious
  270.   security hole, as you may inadvertently clobber system binaries and
  271.   libraries, or even install a Trojan horse that might wreak havoc upon
  272.   your system.  It is therefore important to obtain rpm and deb packages
  273.   from a "trusted source". In any case, you should run a 'signature
  274.   check' on the package, rpm --checksig packagename.rpm, before
  275.   installing. Likewise highly recommended is running rpm -K --nopgp
  276.   packagename.rpm.  The corresponding commands for deb packages are dpkg
  277.   -I | --info packagename.deb and dpkg -e | --control packagename.deb.
  278.  
  279.  
  280.   ╖  rpm --checksig gnucash-1.1.23-4.i386.rpm
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.   gnucash-1.1.23-4.i386.rpm: size md5 OK
  288.  
  289.  
  290.   ╖  rpm -K --nopgp gnucash-1.1.23-4.i386.rpm
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.   gnucash-1.1.23-4.i386.rpm: size md5 OK
  298.  
  299.   For the truly paranoid (and, in this case there is much to be said for
  300.   paranoia), there are the unrpm and rpmunpack utilities available from
  301.   the Sunsite utils/package directory for unpacking and checking the
  302.   individual components of the packages.
  303.  
  304.   The martian
  305.   <http://www.people.cornell.edu/pages/rc42/program/martian.html> and
  306.   alien <http://kitenet.net/programs/alien/> programs allow conversion
  307.   between the rpm, deb, and tar.gz package format. This makes these
  308.   packages accessible to all Linux distributions.
  309.  
  310.   In their most simple form, the commands rpm -i packagename.rpm and
  311.   dpkg --install packagename.deb automatically unpack and install the
  312.   software.  Exercise caution, though, since using these commands
  313.   blindly may be dangerous to your system's health!
  314.  
  315.   Note that the above warnings also apply, though to a lesser extent, to
  316.   Slackware's pkgtool installation utility. All "automatic" software
  317.   installations require caution.
  318.  
  319.   Carefully read the man pages for the rpm and dpkg commands, and refer
  320.   to the RPM HOWTO, TFUG's Quick Guide to Red Hat's Package Manager
  321.   <http://www.tfug.org/helpdesk/linux/rpm.html>, and The Debian Package
  322.   Management Tools <http://www.debian.org/doc/FAQ/debian-faq-7.html> for
  323.   more detailed information.
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.   5.  Termcap and Terminfo Issues
  332.  
  333.  
  334.  
  335.   According to its man page, "terminfo is a data base describing
  336.   terminals, used by screen-oriented programs...".  It defines a generic
  337.   set of control sequences (escape codes) used to display text on
  338.   terminals, and makes possible support for different terminal hardware
  339.   without the need for special drivers.  The terminfo database has
  340.   largely supplanted the older termcap and the totally obsolete termlib
  341.   ones. This is usually of no concern for program installation except
  342.   when dealing with a package that requires termcap.
  343.  
  344.   Most Linux distributions now use terminfo, but still retain the older
  345.   termcap libraries for compatibility with legacy applications.
  346.   Sometimes there is a special compatibility package that needs to be
  347.   installed to facilitate use of termcap linked binaries.  Very
  348.   occasionally, an #define termcap statement might need to be commented
  349.   out of a source file.  Check the appropriate docs for your particular
  350.   distribution for information on this.
  351.  
  352.  
  353.  
  354.  
  355.   6.  Backward Compatibility With a.out Binaries
  356.  
  357.  
  358.   In a very few cases, it is necessary to use a.out binaries, either
  359.   because the source code is not available or because it is not possible
  360.   to build new ELF binaries from the source for some reason.
  361.  
  362.   As it happens, ELF installations almost always have a complete set of
  363.   a.out libraries in the /usr/i486-linuxaout/lib directory.  The
  364.   numbering scheme for a.out libraries differs from that of ELF ones,
  365.   cleverly avoiding conflicts that could cause confusion.  The a.out
  366.   binaries should therefore be able to find the correct libraries at
  367.   runtime, but this might not always be the case.
  368.  
  369.   Note that the kernel needs to have a.out support built into it, either
  370.   directly or as a loadable module. It may be necessary to rebuild the
  371.   kernel to enable this. Moreover, some Linux distributions require
  372.   installation of a special compatibility package, such as Debian's
  373.   xcompat for executing a.out X applications.
  374.  
  375.  
  376.   6.1.  An Example
  377.  
  378.  
  379.   Jerry Smith wrote a very handy rolodex program some years back. It
  380.   uses the Motif libraries, but fortunately is available as a statically
  381.   linked binary in a.out format. Unfortunately, the source requires
  382.   numerous tweaks to rebuild using the lesstif libraries. Even more
  383.   unfortunately, the a.out binary bombs on an ELF system with the
  384.   following error message.
  385.  
  386.  
  387.        xrolodex: can't load library '//lib/libX11.so.3'
  388.        No such library
  389.  
  390.  
  391.  
  392.  
  393.   As it happens, there is such a library, in /usr/i486-linuxaout/lib,
  394.   but xrolodex is unable to locate it at run time. The simple solution
  395.   is to provide a symbolic link in the /lib directory:
  396.  
  397.   ln -s /usr/i486-linuxaout/lib/X11.so.3.1.0 libX11.so.3
  398.  
  399.  
  400.   It turns out to be necessary to provide similar links for the
  401.   libXt.so.3 and libc.so.4 libraries. This needs to be done as root, of
  402.   course. Note that you should make absolutely certain you will not
  403.   overwrite or cause version number conflicts with pre-existing
  404.   libraries.  Fortunately, the new ELF libraries have higher version
  405.   numbers than the older a.out ones, to anticipate and forestall just
  406.   such problems.
  407.  
  408.   After creating the three links, xrolodex runs fine.
  409.  
  410.   The xrolodex program may be obtained from Spectro
  411.   <http://www.spectro.com/xrolodex.html>.
  412.  
  413.  
  414.  
  415.  
  416.   7.  Troubleshooting
  417.  
  418.  
  419.   If xmkmf and/or make succeeded without errors, you may proceed to the
  420.   ``next section''.  However, in "real life", few things work right the
  421.   first time.  This is when your resourcefulness is put to the test.
  422.  
  423.  
  424.   7.1.  Link Errors
  425.  
  426.  
  427.   ╖  Suppose make fails with a Link error: -lX11: No such file or
  428.      directory, even after xmkmf has been invoked. This may mean that
  429.      the Imake file was not set up properly. Check the first part of the
  430.      Makefile for lines such as:
  431.  
  432.  
  433.  
  434.        LIB=            -L/usr/X11/lib
  435.        INCLUDE=        -I/usr/X11/include/X11
  436.        LIBS=           -lX11 -lc -lm
  437.  
  438.  
  439.  
  440.  
  441.  
  442.   The -L and -I switches tell the compiler and linker where to look for
  443.   the library and include files, respectively. In this example, the X11
  444.   libraries should be in the /usr/X11/lib directory, and the X11 include
  445.   files should be in the /usr/X11/include/X11 directory. If this is
  446.   incorrect for your machine, make the necessary changes to the Makefile
  447.   and try the make again.
  448.  
  449.  
  450.   ╖  Undefined references to math library functions, such as the
  451.      following:
  452.  
  453.  
  454.                 /tmp/cca011551.o(.text+0x11): undefined reference to `cos'
  455.  
  456.  
  457.  
  458.  
  459.   The fix for this is to explicitly link in the math library, by adding
  460.   an -lm to the LIB or LIBS flags in the Makefile (see previous exam¡
  461.   ple).
  462.  
  463.   ╖  Yet another thing to try if xmkmf fails is the following script:
  464.  
  465.  
  466.                 make -DUseInstalled -I/usr/X386/lib/X11/config
  467.  
  468.  
  469.  
  470.  
  471.   This is a sort of bare bones equivalent of xmkmf.
  472.  
  473.  
  474.   ╖  In a very few cases, running ldconfig as root may be the solution:
  475.  
  476.  
  477.  
  478.  
  479.  
  480.  
  481.  
  482.   # ldconfig updates the shared library symbolic links. This may not be
  483.   necessary .
  484.  
  485.  
  486.   ╖  Some Makefiles use unrecognized aliases for libraries present in
  487.      your system. For example, the build may require libX11.so.6, but
  488.      there exists no such file or link in /usr/X11R6/lib. Yet, there is
  489.      a libX11.so.6.1. The solution is to do a ln -s
  490.      /usr/X11R6/lib/libX11.so.6.1 /usr/X11R6/lib/libX11.so.6, as root.
  491.      This may need to be followed by a ldconfig.
  492.  
  493.  
  494.  
  495.   ╖  Sometimes the source needs the older release X11R5 libraries to
  496.      build.  If you have the R5 libs in /usr/X11R6/lib (you were given
  497.      the option of having them when first installing Linux), then you
  498.      need only ensure that you have the links that the software needs to
  499.      build.  The R5 libs are named libX11.so.3.1.0, libXaw.so.3.1.0, and
  500.      libXt.so.3.1.0. You generally need links, such as libX11.so.3 ->
  501.      libX11.so.3.1.0. Possibly the software will also need a link of the
  502.      form libX11.so -> libX11.so.3.1.0.  Of course, to create a
  503.      "missing" link, use the command ln -s libX11.so.3.1.0 libX11.so, as
  504.      root.
  505.  
  506.  
  507.  
  508.  
  509.  
  510.   ╖  Some packages will require you to install updated versions of one
  511.      or more libraries. For example, the StarOffice suite from
  512.      StarDivision GmbH is notorious for needing a libc version 5.4.4 or
  513.      greater (and moreover, StarOffice will not run even after
  514.      installation with the new glibc libs in Red Hat 6.0).  As root, you
  515.      would need to copy one or more libraries to the appropriate
  516.      directories, remove the old libraries, then reset the symbolic
  517.      links.
  518.  
  519.      Caution: Exercise extreme care in this, as you can render your
  520.      system nonfunctional if you screw up.
  521.  
  522.      You can usually find updated libraries at Sunsite.
  523.  
  524.  
  525.   7.2.  Other Problems
  526.  
  527.  
  528.  
  529.   ╖  An installed Perl or shell script gives you a No such file or
  530.      directory error message. In this case, check the file permissions
  531.      to make sure the file is executable and check the file header to
  532.      ascertain whether the shell or program invoked by the script is in
  533.      the place specified.  For example, the scrip may begin with:
  534.  
  535.  
  536.        #!/usr/local/bin/perl
  537.  
  538.  
  539.  
  540.  
  541.   If Perl is in fact installed in your /usr/bin directory instead of the
  542.   /usr/local/bin one, then the script will not run.  There are two meth¡
  543.   ods of correcting this. The script file header may be changed to
  544.   #!/usr/bin/perl, or a symbolic link to the correct directory may be
  545.   added, ln -s /usr/bin/perl /usr/local/bin/perl.
  546.  
  547.  
  548.   ╖  Some X11 software requires the Motif libraries to build.  The
  549.      standard Linux distributions do not have the Motif libraries
  550.      installed, and at present Motif costs an extra $100-$200 (though
  551.      the freeware Lesstif <http://www.lesstif.org/> also works in many
  552.      cases). If you need Motif to build a certain package, but lack the
  553.      Motif libraries, it may be possible to obtain statically linked
  554.      binaries. Static linking incorporates the library routines in the
  555.      binaries themselves.  This results in much larger binary files, but
  556.      the code will run on systems lacking the libraries.
  557.  
  558.  
  559.  
  560.  
  561.  
  562.  
  563.  
  564.  
  565.   When a package requires libraries not present on your system for the
  566.   build, it will result in link errors (undefined reference errors).
  567.   The libraries may be expensive proprietary ones or difficult to find
  568.   for sone other reason.  In that case, obtaining a statically linked
  569.   binary either from the author of the package or from a Linux user
  570.   group may be the easiest to implement fix.
  571.  
  572.  
  573.  
  574.   ╖  Running a configure script creates a strange Makefile, one
  575.      seemingly unrelated to the package you are attempting to build.
  576.      This means the wrong configure ran, one found somewhere else in
  577.      your path. Always invoke configure as ./configure to prevent this.
  578.  
  579.  
  580.  
  581.   ╖  Most Linux distributions have changed over to the libc 6 / glibc 2
  582.      libraries from the older libc 5. Precompiled binaries that worked
  583.      with the older library may bomb if you have upgraded your library.
  584.      The solution is to either recompile the applications from the
  585.      source or to obtain newer precompiled binaries.  If you are in the
  586.      process of upgrading your system to libc 6 and are experiencing
  587.      problems, refer to Eric Green's Glibc 2 HOWTO.
  588.  
  589.  
  590.  
  591.  
  592.  
  593.  
  594.  
  595.   Note that there are some minor incompatibilities between glibc ver¡
  596.   sions, so a binary built with glibc 2.1 may not work with glibc 2.0,
  597.   and vice versa.
  598.  
  599.  
  600.  
  601.   ╖  Sometimes it is necessary to remove the -ansi option from the
  602.      compile flags in the Makefile. This enables gcc's extra, non-ANSI
  603.      features, and allows building packages that require these
  604.      extensions. (Thanks to Sebastien Blondeel for pointing this out.)
  605.  
  606.  
  607.   ╖  Some programs require having setuid root, in order to run with root
  608.      privileges. The command to implement this is chmod u+s filename, as
  609.      root (note that the program must already be owned by root). This
  610.      has the effect of setting the setuid bit in the file permissions.
  611.      This issue comes up when the program accesses the system hardware,
  612.      such as a modem or CD ROM drive, or when the SVGA libs are invoked
  613.      from console mode, as in one particularly notorious emulation
  614.      package. If a program works when run by root, but gives access
  615.      denied error messages to an ordinary user, suspect this as the
  616.      cause.
  617.  
  618.  
  619.  
  620.      Warning: A program with setuid as root may pose a security risk to
  621.      your system. The program runs with root privileges and thus has the
  622.      potential for doing significant damage. Make certain that you know
  623.      what the program does, by looking at the source if possible, before
  624.      setting the setuid bit.
  625.  
  626.  
  627.  
  628.  
  629.   7.3.  Tweaking and fine tuning
  630.  
  631.  
  632.   You may wish to examine the Makefile to make certain that the best
  633.   compilation options for your system are invoked. For example, setting
  634.   the -O2 flag chooses the highest level of optimization and the -fomit-
  635.   frame-pointer flag results in a smaller binary (though debugging will
  636.   then be disabled). Do not play around with this unless you know what
  637.   you are doing, and in any case, not until after a trial build works.
  638.  
  639.  
  640.  
  641.  
  642.   7.4.  Where to go for more help
  643.  
  644.  
  645.   In my experience, perhaps 25% of applications build "right out of the
  646.   box". Another 50% or so can be "persuaded" to build with an effort
  647.   ranging from trivial to herculean. That still means a significant
  648.   number of packages will not build no matter what. Even then, the Intel
  649.   ELF and/or a.out binaries for these might possibly be found at Sunsite
  650.   or the TSX-11 archive.  Red Hat <http://redhat.com> and Debian
  651.   <http://www.debian.org> have extensive archives of prepackaged
  652.   binaries of most of the popular Linux software.  Perhaps the author of
  653.   the software can supply the binaries compiled for your particular
  654.   flavor of machine.
  655.  
  656.  
  657.   Note that if you obtain precompiled binaries, you will need to check
  658.   for compatibility with your system:
  659.  
  660.  
  661.   ╖  The binaries must run on your hardware (i.e., Intel x86).
  662.  
  663.   ╖  The binaries must be compatible with your kernel (i.e., a.out or
  664.      ELF).
  665.  
  666.   ╖  Your libraries must be up to date.
  667.  
  668.   ╖  Your system must have the appropriate installation utility (rpm or
  669.      deb).
  670.  
  671.   If all else fails, you may find help in the appropriate newsgroups,
  672.   such as comp.os.linux.x or comp.os.linux.development.
  673.  
  674.   If nothing at all works, at least you gave it your best effort, and
  675.   you learned a lot.
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682.  
  683.   8.  Final Steps
  684.  
  685.   Read the software package documentation to determine whether certain
  686.   environmental variables need setting (in .bashrc or .cshrc) and if the
  687.   .Xdefaults and .Xresources files need customizing.
  688.  
  689.   There may be an applications default file, usually named Xfoo.ad in
  690.   the original Xfoo distribution. If so, edit the Xfoo.ad file to
  691.   customize it for your machine, then rename (mv) it Xfoo and install it
  692.   in the /usr/lib/X11/app-defaults directory, as root.  Failure to do
  693.   this may cause the software to behave strangely or even refuse to run.
  694.  
  695.   Most software packages come with one or more preformatted man pages.
  696.   As root, copy the Xfoo.man file to the appropriate /usr/man,
  697.   /usr/local/man, or /usr/X11R6/man directory (man1 - man9), and rename
  698.   it accordingly.  For example, if Xfoo.man ends up in /usr/man/man4, it
  699.   should be renamed Xfoo.4 (mv Xfoo.man Xfoo.4).  By convention, user
  700.   commands go in man1, games in man6, and administration packages in
  701.   man8 (see the man docs for more details).  Of course, you may deviate
  702.   from this on your own system, if you like.
  703.  
  704.   Some packages will not install the binaries in the appropriate system
  705.   directories, that is, they are missing the install option in the
  706.   Makefile. Should this be the case, you can install the binaries
  707.   manually by copying the binaries to the appropriate system directory,
  708.   /usr/local/bin or /usr/X11R6/bin, as root, of course.
  709.  
  710.   Note that some or all of the above procedures should, in most cases,
  711.   be handled automatically by a make install, and possibly a make
  712.   install.man or make install_man. If so, the README or INSTALL doc file
  713.   will specify this.
  714.  
  715.  
  716.  
  717.   9.  First Example: Xscrabble
  718.  
  719.   Matt Chapman's Xscrabble seemed like a program that would be
  720.   interesting to have, since I happen to be an avid ScrabbleTM player. I
  721.   downloaded it, uncompressed it,  and built it following the procedure
  722.   in the README file:
  723.  
  724.  
  725.  
  726.  
  727.        xmkmf
  728.        make Makefiles
  729.        make includes
  730.        make
  731.  
  732.  
  733.  
  734.  
  735.   Of course it did not work...
  736.  
  737.  
  738.  
  739.        gcc -o xscrab -O2 -O -L/usr/X11R6/lib
  740.        init.o xinit.o misc.o moves.o cmove.o main.o xutils.o mess.o popup.o
  741.        widgets.o display.o user.o CircPerc.o
  742.        -lXaw -lXmu -lXExExt -lXext -lX11 -lXt -lSM -lICE -lXExExt -lXext -lX11
  743.        -lXpm -L../Xc -lXc
  744.  
  745.        BarGraf.o(.text+0xe7): undefined reference to `XtAddConverter'
  746.        BarGraf.o(.text+0x29a): undefined reference to `XSetClipMask'
  747.        BarGraf.o(.text+0x2ff): undefined reference to `XSetClipRectangles'
  748.        BarGraf.o(.text+0x375): undefined reference to `XDrawString'
  749.        BarGraf.o(.text+0x3e7): undefined reference to `XDrawLine'
  750.        etc.
  751.        etc.
  752.        etc...
  753.  
  754.  
  755.  
  756.  
  757.   I enquired about this in the comp.os.linux.x newsgroup, and someone
  758.   kindly pointed out that apparently the Xt, Xaw, Xmu, and X11 libs were
  759.   not being found at the link stage. Hmmm...
  760.  
  761.   There were two main Makefiles, and the one in the src directory caught
  762.   my interest. One line in the Makefile defined LOCAL_LIBS as:
  763.   LOCAL_LIBS = $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB) Here were
  764.   references to the libs not being found by the linker.
  765.  
  766.   Looking for the next reference to LOCAL_LIBS, I saw on line 495 of
  767.   that Makefile:
  768.  
  769.  
  770.              $(CCLINK) -o $@ $(LDOPTIONS) $(OBJS) $(LOCAL_LIBS) $(LDLIBS)
  771.        $(EXTRA_LOAD_FLAGS)
  772.  
  773.  
  774.  
  775.  
  776.   Now what were these LDLIBS?
  777.  
  778.  
  779.              LDLIBS = $(LDPOSTLIB) $(THREADS_LIBS) $(SYS_LIBRARIES)
  780.        $(EXTRA_LIBRARIES)
  781.  
  782.  
  783.  
  784.  
  785.   The SYS_LIBRARIES were:
  786.  
  787.  
  788.         SYS_LIBRARIES = -lXpm -L../Xc -lXc
  789.  
  790.  
  791.  
  792.  
  793.   Yes! Here were the missing libraries.
  794.  
  795.   Possibly the linker needed to see the LDLIBS before the LOCAL_LIBS...
  796.   So, the first thing to try was to modify the Makefile by transposing
  797.   the $(LOCAL_LIBS) and $(LDLIBS) on line 495, so it would now read:
  798.  
  799.  
  800.                $(CCLINK) -o $@ $(LDOPTIONS) $(OBJS) $(LDLIBS) $(LOCAL_LIBS)
  801.        $(EXTRA_LOAD_FLAGS)                          ^^^^^^^^^^^^^^^^^^^^^^^
  802.  
  803.  
  804.  
  805.  
  806.   I tried running make again with the above change, and lo and behold,
  807.   it worked this time. Of course,  Xscrabble still needed some fine
  808.   tuning and twiddling, such as renaming the dictionary and commenting
  809.   out some assert statements in one of the source files, but since then
  810.   it has provided me with many hours of pleasure.
  811.  
  812.  
  813.  
  814.   [Note that a newer version of Xscrabble is now available in rpm
  815.   format, and this installs without problems.]
  816.  
  817.  
  818.  
  819.  
  820.   You may e-mail Matt Chapman <mailto:matt@belgarath.demon.co.uk>, and
  821.   download Xscrabble from his home page
  822.   <http://www.belgarath.demon.co.uk/programs/index.html>.
  823.  
  824.  
  825.  
  826.  
  827.  
  828.  
  829.               Scrabble is a registered trademark of the Milton Bradley Co., Inc.
  830.  
  831.  
  832.  
  833.  
  834.  
  835.  
  836.  
  837.  
  838.   10.  Second Example: Xloadimage
  839.  
  840.   This example poses an easier problem. The xloadimage program seemed a
  841.   useful addition to my set of graphic tools.  I copied the xloadi41.gz
  842.   file directly from the source directory on the CD included with the
  843.   excellent ``X User Tools'' book, by Mui and Quercia. As expected, tar
  844.   xzvf unarchives the files.  The make, however, produces a nasty-
  845.   looking error and terminates.
  846.  
  847.  
  848.  
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.   gcc -c -O -fstrength-reduce -finline-functions -fforce-mem
  860.   -fforce-addr -DSYSV  -I/usr/X11R6/include
  861.   -DSYSPATHFILE=\"/usr/lib/X11/Xloadimage\" mcidas.c
  862.  
  863.   In file included from /usr/include/stdlib.h:32,
  864.                    from image.h:23,
  865.                    from xloadimage.h:15,
  866.                    from mcidas.c:7:
  867.   /usr/lib/gcc-lib/i486-linux/2.6.3/include/stddef.h:215:
  868.   conflicting types for `wchar_t'
  869.   /usr/X11R6/include/X11/Xlib.h:74: previous declaration of
  870.   `wchar_t'
  871.   make[1]: *** [mcidas.o] Error 1
  872.   make[1]: Leaving directory
  873.   `/home/thegrendel/tst/xloadimage.4.1'
  874.   make: *** [default] Error 2
  875.  
  876.  
  877.  
  878.  
  879.   The error message contains the essential clue.
  880.  
  881.   Looking at the file image.h, line 23...
  882.  
  883.  
  884.               #include <stdlib.h>
  885.  
  886.  
  887.  
  888.  
  889.   Aha, somewhere in the source for xloadimage, wchar_t has been
  890.   redefined from what was specified in the standard include file,
  891.   stdlib.h. Let us first try commenting out line 23 in image.h, as
  892.   perhaps the stdlib.h include is not, after all, necessary.
  893.  
  894.   At this point, the build proceeds without any fatal errors. The
  895.   xloadimage package functions correctly now.
  896.  
  897.  
  898.  
  899.  
  900.  
  901.  
  902.   11.  Third Example: Fortune
  903.  
  904.   This example requires some knowledge of C programming. The majority of
  905.   UNIX/Linux software is written in C, and learning at least a little
  906.   bit of C would certainly be an asset for anyone serious about software
  907.   installation.
  908.  
  909.   The notorious fortune program displays up a humorous saying, a
  910.   "fortune cookie", every time Linux boots up. Unfortunately (pun
  911.   intended), attempting to build fortune on a Red Hat distribution with
  912.   a 2.0.30 kernel generates fatal errors.
  913.  
  914.  
  915.  
  916.  
  917.  
  918.  
  919.  
  920.  
  921.  
  922.  
  923.  
  924.  
  925.   ~/fortune# make all
  926.  
  927.  
  928.   gcc -O2 -Wall -fomit-frame-pointer -pipe   -c fortune.c -o
  929.   fortune.o
  930.   fortune.c: In function `add_dir':
  931.   fortune.c:551: structure has no member named `d_namlen'
  932.   fortune.c:553: structure has no member named `d_namlen'
  933.   make[1]: *** [fortune.o] Error 1
  934.   make[1]: Leaving directory `/home/thegrendel/for/fortune/fortune'
  935.   make: *** [fortune-bin] Error 2
  936.  
  937.  
  938.  
  939.  
  940.  
  941.  
  942.  
  943.   Looking at fortune.c, the pertinent lines are these.
  944.  
  945.  
  946.  
  947.           if (dirent->d_namlen == 0)
  948.                    continue;
  949.                name = copy(dirent->d_name, dirent->d_namlen);
  950.  
  951.  
  952.  
  953.  
  954.   We need to find the structure dirent, but it is not declared in the
  955.   fortune.c file, nor does a grep dirent show it in any of the other
  956.   source files. However, at the top of fortune.c, there is the following
  957.   line.
  958.  
  959.  
  960.  
  961.        #include <dirent.h>
  962.  
  963.  
  964.  
  965.  
  966.   This appears to be a system library include file, therefore, the
  967.   logical place to look for dirent.h is in /usr/include.  Indeed, there
  968.   does exist a dirent.h file in /usr/include, but that file does not
  969.   contain the declaration of the dirent structure.  There is, however, a
  970.   reference to another dirent.h file.
  971.  
  972.  
  973.  
  974.        #include <linux/dirent.h>
  975.  
  976.  
  977.  
  978.  
  979.  
  980.   At last, going to /usr/include/linux/dirent.h, we find the structure
  981.   declaration we need.
  982.  
  983.  
  984.  
  985.  
  986.  
  987.  
  988.  
  989.  
  990.  
  991.   struct dirent {
  992.           long            d_ino;
  993.           __kernel_off_t  d_off;
  994.           unsigned short  d_reclen;
  995.           char            d_name[256]; /* We must not include
  996.   limits.h! */
  997.   };
  998.  
  999.  
  1000.  
  1001.  
  1002.   Sure enough, the structure declaration contains no d_namelen, but
  1003.   there are a couple of "candidates" for its equivalent. The most likely
  1004.   of these is d_reclen, since this structure member probably represents
  1005.   the length of something and it is a short integer.  The other
  1006.   possibility, d_ino, could be an inode number, judging by its name and
  1007.   type. As a matter of fact, we are probably dealing with a "directory
  1008.   entry" structure, and these elements represent attributes of a file,
  1009.   its name, inode, and length (in blocks).  This would seem to validate
  1010.   our guess.
  1011.  
  1012.   Let us edit the file fortune.c, and change the two d_namelen
  1013.   references in lines 551 and 553 to d_reclen.  Try a make all again.
  1014.   Success. It builds without errors. We can now get our "cheap thrills"
  1015.   from fortune.
  1016.  
  1017.  
  1018.  
  1019.   12.  Fourth Example: Hearts
  1020.  
  1021.  
  1022.   Here is the hoary old game of Hearts, written for UNIX systems by Bob
  1023.   Ankeney sometime in the '80's, revised in 1992 by Mike Yang, and
  1024.   currently maintained by Jonathan Badger
  1025.   <mailto:badger@phylo.life.uiuc.edu>. Its predecessor was an even older
  1026.   Pascal program by Don Backus of Oregon Software, later updated by Jeff
  1027.   Hemmerling. Originally intended as a multiplayer client, it also works
  1028.   well in single-player mode against computer opponents. The graphics
  1029.   are nice, though the game lacks sophisticated features and the
  1030.   computer players are not particularly strong. All the same, it seems
  1031.   to be the only decent Hearts game available for UNIX and Linux
  1032.   machines even at this late date.
  1033.  
  1034.   Due to its age and lineage, this package is particularly difficult to
  1035.   build on a Linux system. It requires solving a long and perplexing
  1036.   series of puzzles.  It is an exercise in patience and determination.
  1037.  
  1038.   Before beginning, make certain that you have either the motif or
  1039.   lesstif libraries installed.
  1040.  
  1041.  
  1042.   ╖
  1043.  
  1044.   xmkmf
  1045.  
  1046.   make
  1047.  
  1048.  
  1049.  
  1050.  
  1051.  
  1052.  
  1053.  
  1054.  
  1055.  
  1056.  
  1057.   client.c: In function `read_card':
  1058.   client.c:430: `_tty' undeclared (first use in this function)
  1059.   client.c:430: (Each undeclared identifier is reported only once
  1060.   client.c:430: for each function it appears in.)
  1061.   client.c: In function `scan':
  1062.   client.c:685: `_tty' undeclared (first use in this function)
  1063.   make: *** [client.o] Error 1
  1064.  
  1065.  
  1066.  
  1067.  
  1068.  
  1069.   These are the culprits in the file client.c:
  1070.  
  1071.  
  1072.  
  1073.        #ifndef SYSV
  1074.                (buf[2] != _tty.sg_erase) && (buf[2] != _tty.sg_kill)) {
  1075.         #else
  1076.                (buf[2] != CERASE) && (buf[2] != CKILL)) {
  1077.        #endif
  1078.  
  1079.  
  1080.  
  1081.  
  1082.  
  1083.  
  1084.  
  1085.  
  1086.   ╖
  1087.  
  1088.   In client.c, add
  1089.  
  1090.  
  1091.        #define SYSV
  1092.  
  1093.  
  1094.  
  1095.  
  1096.   at line 39. This will bypass the reference to _tty.
  1097.  
  1098.   make
  1099.  
  1100.  
  1101.  
  1102.        client.c:41: sys/termio.h: No such file or directory
  1103.        make: *** [client.o] Error 1
  1104.  
  1105.  
  1106.  
  1107.  
  1108.  
  1109.  
  1110.   ╖
  1111.  
  1112.   The include file termio.h is in the /usr/include directory on a Linux
  1113.   system, rather than the /usr/include/sys one, as was the case on older
  1114.   UNIX machines.  Therefore, change line 41 of client.c from
  1115.  
  1116.  
  1117.        #include <sys/termio.h>
  1118.  
  1119.  
  1120.  
  1121.  
  1122.   to
  1123.        #include <termio.h>
  1124.  
  1125.  
  1126.  
  1127.  
  1128.   make
  1129.  
  1130.  
  1131.  
  1132.        gcc -o hearts -g      -L/usr/X11R6/lib client.o hearts.o select.o connect.o
  1133.        sockio.o start_dist.o  -lcurses -ltermlib
  1134.        /usr/bin/ld: cannot open -ltermlib: No such file or directory
  1135.        collect2: ld returned 1 exit status
  1136.        make: *** [hearts] Error 1
  1137.  
  1138.  
  1139.  
  1140.  
  1141.  
  1142.  
  1143.  
  1144.   ╖
  1145.  
  1146.   Modern Linux distributions use the terminfo and/or termcap database,
  1147.   rather than the obsolete termlib one.
  1148.  
  1149.   Edit the Makefile.
  1150.  
  1151.   Line 655:
  1152.  
  1153.  
  1154.        CURSES_LIBRARIES = -lcurses -ltermlib
  1155.  
  1156.  
  1157.  
  1158.  
  1159.   changes to:
  1160.  
  1161.  
  1162.        CURSES_LIBRARIES = -lcurses -ltermcap
  1163.  
  1164.  
  1165.  
  1166.  
  1167.  
  1168.   make
  1169.  
  1170.  
  1171.  
  1172.        gcc -o xmhearts -g      -L/usr/X11R6/lib xmclient.o hearts.o select.o
  1173.        connect.o sockio.o start_dist.o gfx.o  -lXm_s -lXt -lSM -lICE -lXext -lX11
  1174.        -lPW
  1175.        /usr/bin/ld: cannot open -lXm_s: No such file or directory
  1176.        collect2: ld returned 1 exit status
  1177.  
  1178.  
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184.   ╖
  1185.  
  1186.   The main lesstif library is libXm, rather than libXm_s. Therefore,
  1187.   edit the Makefile.
  1188.  
  1189.   In line 653:
  1190.  
  1191.  
  1192.        XMLIB = -lXm_s $(XTOOLLIB) $(XLIB) -lPW
  1193.  
  1194.  
  1195.  
  1196.  
  1197.   changes to:
  1198.  
  1199.  
  1200.        XMLIB = -lXm $(XTOOLLIB) $(XLIB) -lPW
  1201.  
  1202.  
  1203.  
  1204.  
  1205.  
  1206.   make
  1207.  
  1208.  
  1209.  
  1210.        gcc -o xmhearts -g      -L/usr/X11R6/lib xmclient.o hearts.o select.o
  1211.        connect.o sockio.o start_dist.o gfx.o  -lXm -lXt -lSM -lICE -lXext -lX11 -lPW
  1212.        /usr/bin/ld: cannot open -lPW: No such file or directory
  1213.        collect2: ld returned 1 exit status
  1214.        make: *** [xmhearts] Error 1
  1215.  
  1216.  
  1217.  
  1218.  
  1219.  
  1220.  
  1221.  
  1222.   ╖
  1223.  
  1224.   Round up the usual suspects.
  1225.  
  1226.   There is no PW library.  Edit the Makefile.
  1227.  
  1228.   Line 653:
  1229.  
  1230.  
  1231.        XMLIB = -lXm $(XTOOLLIB) $(XLIB) -lPW
  1232.  
  1233.  
  1234.  
  1235.  
  1236.   changes to:
  1237.  
  1238.  
  1239.        XMLIB = -lXm $(XTOOLLIB) $(XLIB) -lPEX5
  1240.  
  1241.  
  1242.  
  1243.  
  1244.   (The PEX5 lib comes closest to PW.)
  1245.  
  1246.  
  1247.   make
  1248.  
  1249.  
  1250.  
  1251.  
  1252.  
  1253.  
  1254.  
  1255.   rm -f xmhearts
  1256.   gcc -o xmhearts -g      -L/usr/X11R6/lib xmclient.o hearts.o select.o
  1257.   connect.o sockio.o start_dist.o gfx.o  -lXm -lXt -lSM -lICE -lXext -lX11 -lPEX5
  1258.  
  1259.  
  1260.  
  1261.  
  1262.   The make finally works (hurray!).
  1263.  
  1264.  
  1265.  
  1266.  
  1267.   ╖
  1268.  
  1269.   Installation:
  1270.  
  1271.   As root,
  1272.  
  1273.  
  1274.  
  1275.        [root@localhost hearts]# make install
  1276.        install -c -s  hearts /usr/X11R6/bin/hearts
  1277.        install -c -s  xmhearts /usr/X11R6/bin/xmhearts
  1278.        install -c -s  xawhearts /usr/X11R6/bin/xawhearts
  1279.        install in . done
  1280.  
  1281.  
  1282.  
  1283.  
  1284.  
  1285.  
  1286.  
  1287.  
  1288.  
  1289.   ╖
  1290.  
  1291.   Test run:
  1292.  
  1293.   rehash
  1294.  
  1295.   (We're running the tcsh shell.)
  1296.  
  1297.   xmhearts
  1298.  
  1299.  
  1300.  
  1301.        localhost:~/% xmhearts
  1302.        Can't invoke distributor!
  1303.  
  1304.  
  1305.  
  1306.  
  1307.  
  1308.  
  1309.  
  1310.   ╖
  1311.  
  1312.   From README file in the hearts package:
  1313.  
  1314.  
  1315.  
  1316.             Put heartsd, hearts_dist, and hearts.instr in the HEARTSLIB
  1317.             directory defined in local.h and make them world-accessible.
  1318.  
  1319.  
  1320.  
  1321.   From the file local.h:
  1322.  
  1323.  
  1324.  
  1325.        /* where the distributor, dealer and instructions live */
  1326.  
  1327.        #define HEARTSLIB "/usr/local/lib/hearts"
  1328.  
  1329.  
  1330.  
  1331.  
  1332.   This is a classic case of RTFM.
  1333.  
  1334.  
  1335.   As root,
  1336.  
  1337.   cd /usr/local/lib
  1338.  
  1339.   mkdir hearts
  1340.  
  1341.   cd !$
  1342.  
  1343.   Copy the distributor files to this directory.
  1344.  
  1345.   cp /home/username/hearts/heartsd .
  1346.  
  1347.   cp /home/username/hearts/hearts_dist .
  1348.  
  1349.   cp /home/username/hearts/hearts.instr .
  1350.  
  1351.  
  1352.  
  1353.  
  1354.   ╖
  1355.  
  1356.   Try another test run.
  1357.  
  1358.   xmhearts
  1359.  
  1360.   It works some of the time, but more often than not crashes with a
  1361.   dealer died! message.
  1362.  
  1363.  
  1364.  
  1365.  
  1366.   ╖
  1367.  
  1368.   The "distibutor" and "dealer" scan the hardware ports. We should thus
  1369.   suspect that those programs need root user privileges.
  1370.  
  1371.   Try, as root,
  1372.  
  1373.   chmod u+s /usr/local/lib/heartsd
  1374.  
  1375.   chmod u+s /usr/local/lib/hearts_dist
  1376.  
  1377.   (Note that, as previously discussed, suid binaries may create security
  1378.   holes.)
  1379.  
  1380.   xmhearts
  1381.  
  1382.  
  1383.   It finally works!
  1384.  
  1385.  
  1386.  
  1387.   Hearts is available from Sunsite.
  1388.  
  1389.  
  1390.  
  1391.  
  1392.   13.  Where to Find Source Archives
  1393.  
  1394.   Now that you are eager to use your newly acquired knowledge to add
  1395.   utilities and other goodies to your system, you may find them online
  1396.   at the Linux Applications and Utilities Page
  1397.   <http://www.redhat.com/linux-info/linux-app-list/linapps.html>, or on
  1398.   one of the very reasonably priced CD ROM archives by Red Hat
  1399.   <http://www.redhat.com/>, InfoMagic <http://www.infomagic.com>, Linux
  1400.   Systems Labs <http://www.lsl.com>, Cheap Bytes
  1401.   <http://www.cheapbytes.com>, and others.
  1402.  
  1403.   A comprehensive repository of source code is the comp sources UNIX
  1404.   archive.
  1405.  
  1406.   Much UNIX source code is posted on the alt.sources newsgroup. If you
  1407.   are looking for particular source code packages, you may post on the
  1408.   related alt.sources.wanted newsgroup.  Another good place to check is
  1409.   the comp.os.linux.announce newsgroup.  To get on the Unix sources
  1410.   mailing list, send a subscribe message there.
  1411.  
  1412.   Archives for the alt.sources newsgroup are at the following ftp sites:
  1413.  
  1414.  
  1415.   ╖  ftp.sterling.com/usenet/alt.sources/
  1416.  
  1417.   ╖  wuarchive.wustl.edu/usenet/alt.sources/articles
  1418.  
  1419.   ╖  src.doc.ic.ac.uk/usenet/alt.sources/articles
  1420.  
  1421.  
  1422.  
  1423.  
  1424.   14.  Final Words
  1425.  
  1426.   To sum up, persistence makes all the difference  (and a high
  1427.   frustration threshold certainly helps). As in all endeavors, learning
  1428.   from mistakes is critically important.  Each misstep, every failure
  1429.   contributes to the body of knowledge that will lead to mastery of the
  1430.   art of building software.
  1431.  
  1432.  
  1433.  
  1434.   15.  References and Further Reading
  1435.  
  1436.  
  1437.  
  1438.  
  1439.  
  1440.  
  1441.  
  1442.  
  1443.  
  1444.  
  1445.  
  1446.  
  1447.  
  1448.  
  1449.  
  1450.  
  1451.  
  1452.  
  1453.   BORLAND C++ TOOLS AND UTILITIES GUIDE, Borland International, 1992,
  1454.   pp. 9-42.
  1455.   [One of the manuals distributed with Borland C++, ver. 3.1. Gives
  1456.   a fairly good intro to make syntax and concepts, using Borland's
  1457.   crippled implementation for DOS.]
  1458.  
  1459.   DuBois, Paul: SOFTWARE PORTABILITY WITH IMAKE, O'Reilly and Associates,
  1460.   1996, ISBN 1-56592-226-3.
  1461.   [This is reputed to be the definitive imake reference, though I did not
  1462.   have it available when writing this article.]
  1463.  
  1464.   Frisch, Aeleen: ESSENTIAL SYSTEM ADMINISTRATION, O'Reilly and
  1465.   Associates, 1995, ISBN 1-56592-127-5.
  1466.   [This otherwise excellent sys admin handbook has only sketchy coverage
  1467.   of software building.]
  1468.  
  1469.   Lehey, Greg: PORTING UNIX SOFTWARE, O'Reilly and Associates, 1995, ISBN
  1470.   1-56592-126-7.
  1471.  
  1472.   Mui, Linda and Valerie Quercia: X USER TOOLS, O'Reilly and Associates,
  1473.   1994, ISBN 1-56592-019-8, pp. 734-760.
  1474.  
  1475.   Oram, Andrew and Steve Talbott: MANAGING PROJECTS WITH MAKE, O'Reilly
  1476.   and Associates, 1991, ISBN 0-937175-90-0.
  1477.  
  1478.   Peek, Jerry and Tim O'Reilly and Mike Loukides: UNIX POWER TOOLS,
  1479.   O'Reilly and Associates / Random House, 1997, ISBN 1-56592-260-3.
  1480.   [A wonderful source of ideas, and tons of utilities you may end up
  1481.   building from the source code, using the methods discussed in
  1482.   this article.]
  1483.  
  1484.   Stallman, Richard M. and Roland McGrath: GNU MAKE, Free Software
  1485.   Foundation, 1995, ISBN 1-882114-78-7.
  1486.   [Required reading.]
  1487.  
  1488.   Welsh, Matt and Lar Kaufman: RUNNING LINUX, O'Reilly and Associates,
  1489.   1996, ISBN 1-56592-151-8.
  1490.   [Still the best overall Linux reference, though lacking in depth
  1491.   in some areas.]
  1492.  
  1493.  
  1494.   The man pages for dpkg, gcc, gzip, imake, ldconfig, make, patch, rpm,
  1495.   shar, tar, termcap, terminfo, and xmkmf.
  1496.  
  1497.  
  1498.   The BZIP2 HOWTO, by David Fetter.
  1499.  
  1500.   The Glibc2 HOWTO, by Eric Green
  1501.  
  1502.   The LINUX ELF HOWTO, by Daniel Barlow.
  1503.  
  1504.   The RPM HOWTO, by Donnie Barnes.
  1505.  
  1506.  
  1507.  
  1508.  
  1509.   [These HOWTOs should be in the /usr/doc/HOWTO directory on your
  1510.   system. Updated versions are available in text, HTML, and SGML format
  1511.   from the LDP site <http://metalab.unc.edu/LDP/linux.html>, and usually
  1512.   from the respective authors' home sites.]
  1513.  
  1514.  
  1515.  
  1516.  
  1517.  
  1518.  
  1519.