Diff for /loncom/build/readme.html between versions 1.16 and 1.21

version 1.16, 2001/01/17 13:50:47 version 1.21, 2002/12/18 17:57:12
Line 1 Line 1
 <HTML>  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 <HEAD>   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <META NAME="GENERATOR" CONTENT="Scott Harrison and Emacs Version 3.14159265358979">  <!-- The LearningOnline Network with CAPA -->
 <TITLE>LON-CAPA Software Developer Instructions</TITLE>  <!-- $Id$ -->
 </HEAD>  <html>
 <BODY>  <head>
 <H1>LON-CAPA Software Developer Instructions</H1>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
 <BR><I>Written by Scott Harrison, January 17, 2001</I>  <meta name="GENERATOR"
 <BR><I>Last updated, January 17, 2001</I>        content="Scott Harrison and Emacs Version 3.14159265358979"></meta>
 <OL>  <title>LON-CAPA Software Developer Guide</title>
 <LI><A HREF="#Using_CVS">Using CVS</A>  </head>
 <UL>  <body>
 <LI><A HREF="#cvslog">Logging in and out (cvs login; cvs logout)</A>  <h1>LON-CAPA Software Developer Guide</h1>
 <LI><A HREF="#cvsget">Getting files (cvs update -d)</A>  <p>
 <LI><A HREF="#cvsupdate">Updating files (cvs update -d)</A>  <br /><i>Written by Scott,<br />
 <LI><A HREF="#cvssave">Saving files (cvs commit)</A>  <a href="mailto:sharrison@users.sourceforge.net">
 <LI><A HREF="#cvsadd">Adding files (cvs add)</A>  sharrison@users.sourceforge.net</a>,<br />
 <LI><A HREF="#cvsadddir">Adding directories (cvs add/import)</A>  January 17, 2001</i>
 <LI><A HREF="#cvsnotsure">What to do when you're not sure about your files (cvs update)</A>  <br /><i>Last updated, August 14, 2002</i>
 </UL>  </p>
 <LI><A HREF="#makeHTML">Viewing the software (make HTML)</A>  <ol>
 <LI><A HREF="#makebuild">Compiling the software (make build)</A>  <li><a href="#Using_CVS">Using CVS</a>
 <LI><A HREF="#loncapafiles">Adding/removing files from the LON-CAPA installation (doc/loncapafiles/loncapafiles.html)</A>  <ul>
 <LI><A HREF="#configversusnonconfig">Configurable files versus non-configurable files</A>  <li><a href="#cvslog">Logging in and out (cvs login; cvs logout)</a></li>
 <LI><A HREF="#makeinstall">Updating the non-configurable files on your machine (make install)</A>  <li><a href="#cvsupdate">Updating files (cvs update -d)</a></li>
 <LI><A HREF="#makeconfiginstall">Updating the configurable files on your machine (make configinstall)</A>  <li><a href="#cvssave">Saving files (cvs commit)</a></li>
 <LI><A HREF="#makeRPM">Building RPMs (make RPM)</A>  <li><a href="#cvsadd">Adding files (cvs add)</a></li>
 </OL>  <li><a href="#cvsadddir">Adding directories (cvs add/import)</a></li>
   <li><a href="#cvsnotsure">What to do when you're not sure about your files
 <OL>  (cvs update)</a></li>
 <A NAME="Using_CVS">  </ul></li>
 <LI><H2>Using CVS</H2>  <li><a href="#makeHTML">Viewing the software (make HTML)</a></li>
 <UL>  <li><a href="#makebuild">Compiling the software (make build)</a></li>
 <LI><A NAME="cvslog">  <li><a href="#loncapafiles">Adding/removing files from the LON-CAPA
     <H3>Using CVS: Logging in and out (cvs login; cvs logout)</H3>  installation (doc/loncapafiles/loncapafiles.lpml)</a></li>
 <LI><A NAME="cvsget">  <li><a href="#configversusnonconfig">Configurable files versus
     <H3>Using CVS: Getting files (cvs update -d)</H3>  non-configurable files</a></li>
 <LI><A NAME="cvsupdate">  <li><a href="#makeinstall">Updating the non-configurable files on your
     <H3>Using CVS: Updating files (cvs update -d)</H3>  machine (make install)</a></li>
 <LI><A NAME="cvssave">  <li><a href="#makeconfiginstall">Updating the configurable files on your
     <H3>Using CVS: Saving files (cvs commit)</H3>  machine (make configinstall)</a></li>
 <LI><A NAME="cvsadd">  <li><a href="#makeRPM">Building RPMs (make RPM)</a></li>
     <H3>Using CVS: Adding files (cvs add)</H3>  </ol>
 <LI><A NAME="cvsadddir">  
     <H3>Using CVS: Adding directories (cvs add/import)</H3>  <ol>
 <LI><A NAME="cvsnotsure">  
     <H3>Using CVS: What to do when you're not sure about your files (cvs update)</H3>  <li><a name="Using_CVS" /><h2>Using CVS</h2><br />
 </UL>  These instructions assume that you are using a Linux or UNIX based
 <LI><A NAME="makeHTML">  terminal.
     <H2>Viewing the software (make HTML)</H2>  <ul>
 <STRONG>Commands</STRONG>  <li><a name="cvslog" />
 <FONT COLOR="#008800">      <h3>Using CVS: Logging in and out (cvs login; cvs logout)</h3>
 <PRE>  <p>
 cd loncom/build  In order to log into CVS, CVS needs to be part of your system environment.
 rm -Rf HTML <I>(or alternatively, "make clean")</I>  You can do this by:
 make HTML  </p>
 cd HTML  <p>
 <I>(look at the index.html file with a web browser such as Netscape)</I>  <font color="#008800">
 </PRE>  <tt>export CVSROOT=:pserver:USERNAME@install.lon-capa.org:/home/cvs</tt>
 </FONT>  </font>
 <STRONG>General description of what happens</STRONG>  </p>
 <P>  <p>
   To actually login, you will need to execute the following command:
   </p>
   <p>
   <font color="#008800">
   <tt>cvs login</tt>
   </font>
   </p>
   <p>
   You are then prompted for a password.
   If you do not have a password, or the password is not working, you
   should contact <a href="mailto:helen@lon-capa.org">helen@lon-capa.org</a>.
   </p>
   <p>
   The first time you use CVS, you need to CHECKOUT the repository.
   Generally speaking, you need to checkout <tt>loncapa</tt> only once
   per machine.
   To check-out the repository, use the <tt>checkout</tt> command.
   (Otherwise, just enter your CVS directory, <tt>cd loncapa</tt>.)
   </p>
   <p>
   <font color="#008800">
   <tt>cvs checkout loncapa</tt><br />
   <tt>cd loncapa</tt>
   </font>
   </p>
   <p>After completing work with the CVS repository,
   you can log out:
   </p>
   <p>
   <font color="#008800">
   <tt>cvs logout</tt>
   </font>
   </p>
   </li>
   <li><a name="cvsupdate" />
       <h3>Using CVS: Updating files (cvs update -d)</h3>
   <p>
   After entering your CVS source tree (<tt>cd loncapa</tt>),
   you should frequently update the software changes that
   other people have made.  This is done with the <tt>update</tt> command.
   </p>
   <p>
   <font color="#008800">
   <tt>
   cvs update -d
   </tt>
   </font>
   </p>
   <p>
   The <tt>cvs update</tt> command creates output
   as it updates your CVS source tree.  Common flags are
   'U' and 'P'; they indicate that a file in your
   <tt>loncapa</tt> directory is now updated with
   changes made by another programmer.
   </p>
   <p>
   <font color="#880000">
   <tt>`U FILE'</tt></font></p>
   <blockquote><font color="#880000">
   The file was brought up to date in your <tt>loncapa</tt>.
   <br />'U' is done for:
   <br />* any file that exists in the repository but not in your source, and
   <br />* files that you have not changed but are not the most recent versions
   available in the repository.
   <br />The network behavior of 'U' is that the entire new file is uploaded
   from the CVS server.
   </font></blockquote>
   <p><font color="#880000"><tt>
   `P FILE'
   </tt></font></p>
   <blockquote><font color="#880000">
   Like `U', but the CVS server sends a patch instead of an entire file.
   </font></blockquote>
   <p>
   'U' and 'P' essentially accomplish the same thing, just in
   different ways.
   </p>
   <p>
   Usually, when you do not <tt>cvs commit</tt> your code changes,
   the <tt>update</tt> command will tell you that you have modified
   your file with the 'M' flag.
   </p>
   <p><font color="#880000"><tt>
   `M FILE'
   </tt></font></p>
   <blockquote><font color="#880000">
        The file is modified in your working <tt>loncapa</tt> directory.
        This is probably based on changes you made and have not yet
        "cvs commit"-ed.
   </font></blockquote>
   <p>
   Sometimes, it will occur that:
   </p>
   <ul>
   <li>you have modified a file and not yet committed it</li>
   <li>someone else *has* modified a file and *has* committed it</li>
   </ul>
   <p>
   Generally speaking, this is <strong>your</strong> fault.  It is your
   responsibility to resolve conflicts.  <tt>cvs update</tt> informs
   you of a conflict with the 'C' flag.
   </p>
   <p><font color="#880000"><tt>
   `C FILE'
   </tt></font></p>
   <blockquote><font color="#880000">
        A conflict was detected while trying to merge your changes to FILE
        with changes from the source repository.
   </font></blockquote>
   <p>
   You will need to open the file and examine it; CVS will have added in
   markup tags like "&lt;&lt;&lt;&lt;&lt;&lt;" to tell you about the merging
   conflicts.  (Sometimes, CVS will intelligently merge in other changes and
   give you the 'M' flag, but many times you will have to manually edit
   the file as just described.)
   </p>
   </li>
   <li><a name="cvssave" />
       <h3>Using CVS: Saving files (cvs commit)</h3>
   <p>
   <tt>cvs commit</tt> works to submit changes to an <strong>existing</strong>
   file within the repository.  If a file does not currently exist, then you
   will first need to <tt>cvs add</tt> it as described in the following
   section.
   </p>
   Running the <tt>cvs commit</tt> command without additional arguments will
   commit all of your changes within the current directory and subdirectories.
   <p><font color="#008800"><tt>
   cvs commit
   </tt></font></p>
   <p>
   A more precise approach to using <tt>cvs commit</tt> is to pass it specific
   file names.  (Usually you should do this.)
   </p>
   <p><font color="#008800"><tt>
   cvs commit FILENAME
   </tt></font></p>
   <p>
   Note that CVS typically invokes the
   <a href="http://www.eng.hawaii.edu/Tutor/vi.html">vi</a> editor and solicits
   comments about your latest changes to the software.   Your comments should be
   both short yet uniquely descriptive.  For example:
   </p>
   <ul>
   <li><strong>BAD</strong> - "made some changes and am drinking soda"</li>
   <li><strong>GOOD</strong> - "implemented syntax checking of perl scripts
   with -c flag"</li>
   </ul>
   </li>
   <li><a name="cvsadd" />
       <h3>Using CVS: Adding files (cvs add)</h3>
   <p><font color="#008800"><tt>
   cvs add FILENAME
   </tt></font></p>
   <p>
   Then you can run <tt>cvs commit FILENAME</tt> and this file will
   become an "official" part of LON-CAPA.
   </p>
   </li>
   <li><a name="cvsadddir" />
       <h3>Using CVS: Adding directories (cvs add/import)</h3>
   <p><font color="#008800"><tt>
   cvs add DIRECTORYNAME
   </tt></font></p>
   <p>
   There is no need to run <tt>cvs commit</tt>.  Directories immediately
   become part of the LON-CAPA CVS source tree by only using the <tt>cvs add</tt>
   command.
   </p>
   <p>
   You should not ordinarily need to use the <tt>cvs import</tt> command.
   If misused, <tt>cvs import</tt> can lead to the loss of code within
   the repository.
   </p>
   </li>
   <li><a name="cvsnotsure" />
       <h3>Using CVS: What to do when you're not sure about your files
           (cvs update -d)</h3>
   <p>
   Once in a while, multiple programmers may be working on the
   same file.  Most conflicts are avoidable if everybody regularly
   <strong>commits</strong> their changes AND if everybody
   regularly <strong>updates</strong> the CVS source tree they are working on.
   </p>
   <p>
   If you are absent from programming for a few days, and
   <strong>fail</strong> to run <tt>cvs update -d</tt> on your CVS source
   repository, you have only yourself to blame if you find yourself writing
   code in a file that is not up-to-date.
   </p>
   </li>
   </ul></li>
   <li><a name="makeHTML" />
       <h2>Viewing the software (make HTML)</h2>
   <p>
   <strong>Commands</strong>
   </p>
   <p><font color="#008800"><tt>
   cd loncom/build<br />
   rm -Rf HTML <i>(or alternatively, "make clean")</i><br />
   make HTML<br />
   cd HTML<br />
   <i>(look at the index.html file with a web browser such as Netscape)</i>
   </tt></font></p>
   <p>
   <strong>General description of what happens</strong>
   </p>
   <p>
 This is the actual make target code.  This is the actual make target code.
 <FONT COLOR="#880000">  </p>
 <PRE>  <pre>
 <!-- LONCAPA MAKETARGET=HTML START -->  <!-- LONCAPA MAKETARGET=HTML START -->
 HTML:  HTML:
         install -d HTML   install -d HTML
         cp ../../doc/loncapafiles/*.gif HTML   cp $(SOURCE)/doc/loncapafiles/*.gif HTML
         perl parse.pl ../../doc/loncapafiles/loncapafiles.html HTML > HTML/index.html   cat $(SOURCE)/doc/loncapafiles/loncapafiles.lpml | \
    perl lpml_parse.pl html development default "$(SOURCE)" '$(TARGET)' \
    > HTML/index.html
 <!-- LONCAPA MAKETARGET=HTML END -->  <!-- LONCAPA MAKETARGET=HTML END -->
 </PRE>  </pre>
 </FONT>  <p>
 What basically happens is that specially marked-up data in the LON-CAPA  What basically happens is that specially marked-up data in the LON-CAPA
 cvs repository file <TT>doc/loncapafiles.html</TT> is parsed into a more  cvs repository file <tt>doc/loncapafiles/loncapafiles.lpml</tt> is parsed
 viewable format by <TT>loncom/build/parse.pl</TT>.  The resulting  into a more viewable format by <tt>loncom/build/lpml_parse.pl</tt>.  The
 file gives a very well organized view of all the files, directories,  resulting file gives a very well organized view of all the files, directories,
 links, ownerships, permissions, and brief documentation of what each  links, ownerships, permissions, and brief documentation of what each
 file does.  file does.
 </P>  </p>
 <LI><A NAME="makebuild">  </li>
     <H2>Compiling the software (make build)</H2>  <li><a name="makebuild" />
 <STRONG>Commands</STRONG>      <h2>Compiling the software (make build)</h2>
 <FONT COLOR="#008800">  <strong>Commands</strong>
 <PRE>  <p><font color="#008800"><tt>
 cd loncom/build  cd loncom/build
 make build  <br />make build
 </PRE>  </tt></font></p>
 </FONT>  <p>
 <STRONG>General description of what happens</STRONG>  <strong>General description of what happens</strong>
 <P>  </p>
   <p>
 This is the actual make target code.  This is the actual make target code.
 <FONT COLOR="#880000">  </p>
 <PRE>  <pre>
 <!-- LONCAPA MAKETARGET=build START -->  <!-- LONCAPA MAKETARGET=build START -->
 build:  build: Makefile.build pod2html.sh pod2man.sh
         perl parse.pl ../../doc/loncapafiles/loncapafiles.html build > Makefile.build   echo -n "" > WARNINGS
         make -f Makefile.build all   make -f Makefile.build all
    make warningnote
   
   Makefile.build: $(SOURCE)/doc/loncapafiles/loncapafiles.lpml lpml_parse.pl
    cat $(SOURCE)/doc/loncapafiles/loncapafiles.lpml | \
    perl lpml_parse.pl build $(CATEGORY) $(DIST) "$(SOURCE)" "$(TARGET)" \
    > Makefile.build
 <!-- LONCAPA MAKETARGET=build END -->  <!-- LONCAPA MAKETARGET=build END -->
 </PRE>  </pre>
 </FONT>  <p>
 <TT>loncom/build/parse.pl</TT> reads in all the build information out  <tt>loncom/build/lpml_parse.pl</tt> reads in all the build information out
 of <TT>doc/loncapafiles/loncapafiles.html</TT>.  A new Makefile named  of <tt>doc/loncapafiles/loncapafiles.lpml</tt>.  A new Makefile named
 <TT>loncom/build/Makefile.build</TT> is dynamically constructed.  <tt>loncom/build/Makefile.build</tt> is dynamically constructed.
 This dynamically generated Makefile is then run to build/compile  This dynamically generated Makefile is then used to build and compile
 all the software targets from source.  This currently takes 10 minutes  all the software targets from source.  This can take several minutes
 (depends on the speed of the machine you compile with).  (it depends on the speed of the machine you compile with).
 </P>  </p>
 <STRONG>Example</STRONG>  <p>
 <P>  <strong>Example</strong>
 Here is information for one file <TT>tth.so</TT> provided in  </p>
 <TT>doc/loncapafiles/loncapafiles.html</TT>.  <p>
 <FONT COLOR="#330066">  Here is information for one file <tt>tth.so</tt> provided in
 <PRE>  <tt>doc/loncapafiles/loncapafiles.lpml</tt>.
 <BR>&lt;METAGROUP&gt;  </p>
 <BR>&lt;LONCAPA TYPE=LOCATION DIST="redhat6.2" SOURCE="loncom/modules/TexConvert/tthperl/tth.so" TARGET="usr/lib/perl5/site_perl/5.005/tth.so" CATEGORY="system file"&gt;  <pre>
 <BR>&lt;DESCRIPTION&gt;  &lt;file&gt;
 <BR>shared library file for dynamic loading and unloading of TeX-to-HTML functionality  &lt;source&gt;loncom/homework/caparesponse/capa.so&lt;/source&gt;
 <BR>&lt;/DESCRIPTION&gt;  &lt;target dist='default'&gt;usr/lib/perl5/site_perl/5.005/capa.so&lt;/target&gt;
 <BR>&lt;BUILD&gt;  &lt;target dist='redhat7 redhat7.1'&gt;usr/lib/perl5/site_perl/5.6.0/capa.so&lt;/target&gt;
 <BR>loncom/modules/TexConvert/tthperl/commands  &lt;categoryname&gt;system file&lt;/categoryname&gt;
 <BR>&lt;/BUILD&gt;  &lt;description&gt;
 <BR>&lt;DEPENDENCIES&gt;  shared library file for dynamic loading and unloading
 <BR>../tthdynamic/tthfunc.c  &lt;/description&gt;
 <BR>../ttmdynamic/ttmfunc.c  &lt;build trigger='always run'&gt;
 <BR>&lt;/DEPENDENCIES&gt;  loncom/homework/caparesponse/commands
 </PRE>  &lt;/build&gt;
 </FONT>  &lt;dependencies&gt;
 <TT>loncom/build/parse.pl</TT> sees the <B>BUILD</B> tags and sets up  caparesponse.c;
 a dynamic file <TT>Makefile.build</TT> to run the command inside the  caparesponse.pm;
 <B>BUILD</B> tags (currently, <B>DEPENDENCIES</B> is not used for anything  README;
 besides documentation).  Makefile.PL;
 </P>  capa.i;
 <P>  commands
 Here is an example of a dynamically generated <TT>Makefile.build</TT>  &lt;/dependencies&gt;
 that builds two LON-CAPA files (one of which is <TT>tth.so</TT>).  &lt;/file&gt;
 <FONT COLOR="#330066">  </pre>
 <PRE>  <p>
   <tt>loncom/build/lpml_parse.pl</tt> sees the <b>build</b> tags and sets up
   a dynamic file <tt>Makefile.build</tt> to run the command inside the
   <b>build</b> tags.  The files listed inside the <b>dependencies</b> tags
   are included in the <tt>Makefile.build</tt> so as to determine whether
   or not there is a need to compile.
   </p>
   <p>
   Here is an example of a dynamically generated <tt>Makefile.build</tt>
   that builds two LON-CAPA files (one of which is <tt>tth.so</tt>).
   </p>
   <pre>
 all: ../homework/caparesponse/capa.so ../modules/TexConvert/tthperl/tth.so   all: ../homework/caparesponse/capa.so ../modules/TexConvert/tthperl/tth.so 
   
 ../homework/caparesponse/capa.so:  ../homework/caparesponse/caparesponse.c ../ho  ../homework/caparesponse/capa.so:  ../homework/caparesponse/caparesponse.c ../homework/caparesponse/caparesponse.pm alwaysrun
 mework/caparesponse/caparesponse.pm alwaysrun  
         cd ../homework/caparesponse/; sh ./commands          cd ../homework/caparesponse/; sh ./commands
   
 ../modules/TexConvert/tthperl/tth.so:  ../modules/TexConvert/tthperl/../tthdynam  ../modules/TexConvert/tthperl/tth.so:  ../modules/TexConvert/tthperl/../tthdynamic/tthfunc.c ../modules/TexConvert/tthperl/../ttmdynamic/ttmfunc.c
 ic/tthfunc.c ../modules/TexConvert/tthperl/../ttmdynamic/ttmfunc.c  
         cd ../modules/TexConvert/tthperl/; sh ./commands          cd ../modules/TexConvert/tthperl/; sh ./commands
   
 alwaysrun:  alwaysrun:
 </PRE>  </pre>
 </FONT>  </li><li><a name="loncapafiles" />
 </P>      <h2>Adding/removing files from the LON-CAPA installation
 <LI><A NAME="loncapafiles">          (doc/loncapafiles/loncapafiles.html)</h2>
     <H2>Adding/removing files from the LON-CAPA installation (doc/loncapafiles/loncapafiles.html)</H2>  <p>
 <STRONG>To add and remove (and alter)</STRONG>  <strong>To add and remove (and alter)</strong>
 <P>  </p>
   <p>
 All that you have to do to alter the behavior of the installation is  All that you have to do to alter the behavior of the installation is
 edit a single file (<TT>doc/loncapafiles/loncapafiles.html</TT>).  edit a single file (<tt>doc/loncapafiles/loncapafiles.lpml</tt>).
 Adding, removing, and altering files requires proper attention  Adding, removing, and altering files requires proper attention
 to the syntax of file format of course.  to the syntax of file format of course.
 </P>  </p>
 <STRONG>File Format</STRONG>  <p>
 <P>  <strong>File Format</strong>
 The preceding <A HREF=#"makebuild">"make build"</A> documentation  </p>
 gives an example <B>METAGROUP</B> entry describing one particular file.  <p>
 All data within <TT>loncapafiles.html</TT> is specified according  The preceding <a href="#makebuild">"make build"</a> documentation
 to markup tags.  The format and syntax of <TT>loncapafiles.html</TT>  gives an example of a <b>file</b> entry describing one particular file.
   All data within <tt>loncapafiles.lpml</tt> is specified according
   to markup tags.  The format and syntax of <tt>loncapafiles.lpml</tt>
 is currently best described by the HTML documentation code at the beginning of  is currently best described by the HTML documentation code at the beginning of
 loncapafiles.html (as well as, by example, seeing how various  loncapafiles.html (as well as, by example, seeing how various
 information is coded).  All in all, the syntax is quite simple.  information is coded).  All in all, the syntax is quite simple.
 </P>  </p>
 <STRONG>Philosophy and notes (the thing nobody reads)</STRONG>  <p>
 <P>  <strong>Philosophy and notes (the thing nobody reads)</strong>
   </p>
   <p>
 Packaging the software from CVS onto a machine file system requires many  Packaging the software from CVS onto a machine file system requires many
 things:  things:
 <UL>  </p>
 <LI>documenting every component of the software,  <ul>
 <LI>handling CVS <U>source</U> to file system <U>target</U> information  <li>documenting every component of the software,</li>
 <LI>handling (according to a hierarchical scheme of grouping) file  <li>handling CVS <u>source</u> to file system <u>target</u> information,</li>
 ownership and permissions,  <li>handling (according to a hierarchical scheme of grouping) file
 <LI>handling (according to a hierarchical scheme of grouping) directory  ownership and permissions,</li>
 ownership and permissions,  <li>handling (according to a hierarchical scheme of grouping) directory
 <LI>handling symbolic links  ownership and permissions,</li>
 <LI>providing for multiple options of installation targets  <li>handling symbolic links,</li>
 (RedHat versus Debian for instance),  <li>providing for multiple options of installation targets (e.g. RedHat versus
 <LI>providing for different file ownerships and permissions to apply  Debian),</li>
 to the same file,  <li>providing for different file ownerships and permissions to apply
 <LI>allowing system software documentation to be automatically generated  to the same file,</li>
 (see information on <A HREF="#makeHTML">"make html"</A>),  <li>allowing system software documentation to be automatically generated
 <LI>providing information in an easily adjustable form as new demands  (see information on <a href="#makeHTML">"make html"</a>),</li>
 are made on the software packaging system,  <li>providing information in an easily adjustable form as new demands
 <LI>providing software package information (for RPM),  are made on the software packaging system,</li>
 <LI>having information in a format that allows for troubleshooting  <li>providing software package information (for RPM),</li>
 the current status of the machine file system,  <li>having information in a format that allows for troubleshooting
 <LI>allow for changes to the structure of the CVS repository,  the current status of the machine file system,</li>
 <LI>and something that is simple enough for any one to immediately work with,  <li>allow for changes to the structure of the CVS repository,</li>
 without having to learn specifics (or hidden traps) of complicated Makefile's  <li>and something that is simple enough for any one to immediately work with,
 or a new macro language (m4?).  without having to learn any specifics (or hidden traps) of complicated
 </UL>  Makefile's or a new macro language (m4?).</li>
 </P>  </ul>
 <P>  <p>
 I looked into, and tried, different ways of accomplishing the above  I looked into, and tried, different ways of accomplishing the above
 including automake and recursive make.  The automake system seemed quite  including automake and recursive make.  The automake system seemed quite
 complicated (and needlessly so in terms of this project since, by and large,  complicated (and needlessly so in terms of this project since, by and large,
 it works to coordinate many different types of build/compilation parameters  it works to coordinate many different types of build/compilation parameters
 whereas we are more concerned with installation parameters).  Recursive make  whereas we are more concerned with installation parameters).  The other
 has significant deficiencies in the sense that not all the information  alternative, recursive make,
   has significant deficiencies since not all the information
 is kept in one place, and there are significant levels of dependency  is kept in one place, and there are significant levels of dependency
 between all the things that must be done to keep software packaging  between all the things that must be done to keep software packaging
 up to date.  A particularly convincing article I found when looking into  up to date.  A particularly convincing article I found when looking into
 much of this was  much of this was
 <A HREF="http://www.pcug.org.au/~millerp/rmch/recu-make-cons-harm.html">  <a href="http://www.pcug.org.au/~millerp/rmch/recu-make-cons-harm.html">
 "Recursive Make Considered Harmful" by Peter Miller</A>.  Complicating  "Recursive Make Considered Harmful" by Peter Miller</a>.  Other complications
 matters was, at the time, it was unclear as to what categories  were that, at the time, it was unclear as to what categories
 of software files we had, and whether or not the directory structure  of software files we had, and whether or not the directory structure
 of CVS would remain constant.  With an ever-developing directory structure  of CVS would remain constant.  With an ever-developing directory structure
 to CVS, I preferred to organize the information on a per-file basis  to CVS, I preferred to organize the information on a per-file basis
 as opposed to a per-directory basis (although there is a successful  as opposed to a per-directory basis.
 implementation of a standard big Makefile in <TT>loncom/Makefile</TT>).  
 Additionally, a standard big Makefile assumes certain "normalcy" to  Additionally, a standard big Makefile assumes certain "normalcy" to
 the directory structure of different potential operating system directories  the directory structure of different potential operating system directories
 (RedHat vs. Debian).  (RedHat vs. Debian).
 </P>  </p>
 <P>  <p>
 If you take time to look at loncapafiles.html  If you take time to look at <tt>loncapafiles.lpml</tt>
 (and perhaps run the <A HREF="#makeHTML">make HTML</A> command)  (and perhaps run the <a href="#makeHTML">make HTML</a> command)
 you will find that the organizing information according to the markup  you will find that the organizing information according to the markup
 syntax in <TT>loncapafiles.html</TT> is simple.  Simple is good.  syntax in <tt>loncapafiles.lpml</tt> is simple.  Simple is good.
 </P>  </p>
 <P>  <p>
 <TT>loncom/build/parse.pl</TT> is the script (invoked automatically  <tt>loncom/build/lpml_parse.pl</tt> is the script (invoked automatically
 by the various targets in <TT>loncom/build/Makefile</TT>) that reads  by the various targets in <tt>loncom/build/Makefile</tt>) that reads
 <TT>doc/loncapafiles/loncapafiles.html</TT>.  <TT>parse.pl</TT>  <tt>doc/loncapafiles/loncapafiles.lpml</tt>.  <tt>lpml_parse.pl</tt>
 is capable of reading and returning different types of information  is capable of reading and returning different types of information
 from <TT>loncapafiles.html</TT> depending on how <TT>parse.pl</TT>  from <tt>loncapafiles.lpml</tt> depending on how <tt>lpml_parse.pl</tt>
 is invoked.  <TT>parse.pl</TT> has yet to have introduced new sources  is invoked.  <tt>lpml_parse.pl</tt> has yet to have introduced new sources
 of error, and has been tested in quite a number of ways.  As with  of error, and has been tested in quite a number of ways.  As with
 any parser however, I remain paranoid.  any parser however, I remain paranoid.
 </P>  </p>
 <P>  <p>
 My regrets with the current system is that <TT>parse.pl</TT> is  Finally, some notes on the development.
 slow (can take 1 minute to run) and includes a few tidbits of code,  <tt>lpml_parse.pl</tt> is very fast and styled after a state-based SAX-like
 specific to the make process, that probably should be in  approach.  I do eventually want to use a real XML/XSLT approach, however
 <TT>loncom/build/Makefile</TT>.  Additionally, <TT>loncapafiles.html</TT>  I hesitate to make everyone everywhere install something like
 should have a DTD and all those other good SGML-ish things (and parsing  <a href="http://search.cpan.org/search?dist=XML-Xalan">XML::Xalan</a>.
 should be done with a real SGML-derived parser).  Also note that <tt>loncapafiles.lpml</tt> has a 
 </P>  DTD (<tt>loncom/build/lpml.dtd</tt>) against which it is valid.
 <P>  I would also like to use more ENTITY's inside <tt>lpml.dtd</tt> but currently
 On the plus side, the <TT>parse.pl</TT>-<TT>loncapafiles.html</TT>   the perl XML modules available at CPAN do not digest complex ENTITY's that
 combination has been working very efficiently and error-free.  well.
 </P>  </p>
 <LI><A NAME="configversusnonconfig">  <p>
     <H2>Configurable files versus non-configurable files</H2>  The <tt>lpml_parse.pl</tt>-<tt>loncapafiles.lpml</tt> 
 <STRONG>Machine-specific information is the difference</STRONG>  combination has been highly efficient and error-free.
 <P>  </p>
   </li><li><a name="configversusnonconfig" />
       <h2>Configurable files versus non-configurable files</h2>
   <p>
   <strong>Machine-specific information is the difference</strong>
   </p>
   <p>
 The current list of configurable files for the LON-CAPA system is  The current list of configurable files for the LON-CAPA system is
 /etc/httpd/access.conf, /etc/smb.conf, /etc/ntp.conf, /etc/krb.conf,  <tt>/etc/httpd/conf/loncapa.conf</tt>,
 /etc/atalk/config, /etc/ntp/step-tickers,   <tt>/etc/ntp.conf</tt>,
 /home/httpd/html/res/adm/includes/copyright.tab,   <tt>/etc/krb.conf</tt>,
 /home/httpd/html/res/adm/includes/un_keyword.tab,   <tt>/etc/ntp/step-tickers</tt>,
 /home/httpd/hosts.tab, and  <tt>/home/httpd/html/res/adm/includes/copyright.tab</tt>,
 /home/httpd/spare.tab.  <tt>/home/httpd/html/res/adm/includes/un_keyword.tab</tt>,
 </P>  <tt>/home/httpd/hosts.tab</tt>, and
 <P>  <tt>/home/httpd/spare.tab</tt>.
   </p>
   <p>
 All of these configurable files contain machine-specific information.  All of these configurable files contain machine-specific information.
 For instance, the LON-CAPA system relies on unique host IDs such  For instance, the overall LON-CAPA system relies on unique host IDs such
 as msua3, s1, s2, msul1, and 103a1 (specified as a "PerlSetVar lonHostID"  as msua3, s1, s2, msul1, and 103a1 (specified as a "PerlSetVar lonHostID"
 field within /etc/httpd/access.conf).  field within <tt>/etc/httpd/conf/loncapa.conf</tt>).
 Non-configurable files simply do NOT have machine-specific information.  Non-configurable files simply do NOT have machine-specific information.
 <STRONG>The impact on updating software</STRONG>  </p>
 <P>  <p>
 What this means in terms of software updating is that  <strong>The impact on updating software</strong>
 <UL>  </p>
 <LI>non-configurable files can be simply overwritten with newer versions  <p>
 (without "anything" else to worry about),  What this means in terms of software updating is that:
 <LI>and configurable files must follow these steps to be safely overwritten  </p>
 <OL>  <ul>
 <LI>have their machine specific information saved,  <li>non-configurable files can be simply overwritten with newer versions
 <LI>be overwritten, and then  (without "anything" else to worry about),</li>
 <LI>have their machine specific information restored.  <li>and configurable files must follow these steps to be safely
 </OL>  overwritten:
 </UL>  <ol>
 </P>  <li>have their machine-specific information saved,</li>
 <LI><A NAME="makeinstall">  <li>be overwritten, and then</li>
     <H2>Updating the non-configurable files on your machine (make install)</H2>  <li>have their machine-specific information restored.</li>
 <STRONG>Commands</STRONG>  </ol>
 <FONT COLOR="#008800">  </li>
 <PRE>  </ul>
   </li>
   <li><a name="makeinstall" />
       <h2>Updating the non-configurable files on your machine (make install)</h2>
   <strong>Commands</strong>
   <p><font color="#008800"><tt>
 cd loncom/build  cd loncom/build
 make install  <br />make install
 </PRE>  </tt></font></p>
 </FONT>  <p>
 <STRONG>General description of what happens</STRONG>  <strong>General description of what happens</strong>
 <P>  </p>
   <p>
 This is the actual make target code.  This is the actual make target code.
 <FONT COLOR="#880000">  </p>
 <PRE>  <pre>
 <!-- LONCAPA MAKETARGET=install START -->  <!-- LONCAPA MAKETARGET=install START -->
 install: build  install: TEST_hosts_tab Makefile.install Makefile
         perl parse.pl ../../doc/loncapafiles/loncapafiles.html install > Makefil   echo -n "" > WARNINGS
 e.install   make -f Makefile.install SOURCE="$(SOURCE)" TARGET="$(TARGET)" \
         make -f Makefile.install SOURCE="../.." TARGET="" directories   directories
         make -f Makefile.install SOURCE="../.." TARGET="" files   make -f Makefile.install SOURCE="$(SOURCE)" TARGET="$(TARGET)" files
         make -f Makefile.install SOURCE="../.." TARGET="" links   make -f Makefile.install SOURCE="$(SOURCE)" TARGET="$(TARGET)" links
    make SOURCE="$(SOURCE)" TARGET="$(TARGET)" \
    NORESTORECONF="$(NORESTORECONF)" configinstall
    make postinstall
    make warningnote
    echo "You can run 'make test' to see if your system is ready to go!"
   
   Makefile.install: $(SOURCE)/doc/loncapafiles/loncapafiles.lpml lpml_parse.pl
    cat $(SOURCE)/doc/loncapafiles/loncapafiles.lpml | \
    perl lpml_parse.pl install $(CATEGORY) $(DIST) "$(SOURCE)" \
    "$(TARGET)" > Makefile.install
 <!-- LONCAPA MAKETARGET=install END -->  <!-- LONCAPA MAKETARGET=install END -->
 </PRE>  </pre>
 </FONT>  <p>
 For safety reasons (so as to not mess up a machine's configuration),  For safety reasons (so as to preserve a machine's configuration),
 configuration files are NOT installed during this step.  This means  configuration files are NOT installed during this step.  This means
 that files such as /etc/httpd/access.conf, /etc/smb.conf, /etc/atalk/config,  that files such as <tt>/etc/httpd/conf/loncapa.conf</tt>,
 /home/httpd/html/res/adm/includes/copyright.tab, and  <tt>/home/httpd/html/res/adm/includes/copyright.tab</tt>, and
 /home/httpd/spare.tab are not overwritten, but remain as old, non-updated  <tt>/home/httpd/spare.tab</tt> are not overwritten, but remain as old,
 copies.  (To automatically update these files and save/restore  non-updated copies.  (To automatically update these files and save/restore
 their encoded machine configuration, you must run "make configinstall").  their encoded machine configuration, you must run "make configinstall").
 </P>  </p>
 <LI><A NAME="makeconfiginstall">  </li>
     <H2>Updating the configurable files on your machine (make configinstall)</H2>  <li><a name="makeconfiginstall" />
 <STRONG>Commands</STRONG>    <h2>Updating the configurable files on your machine (make configinstall)</h2>
 <FONT COLOR="#008800">  <strong>Commands</strong>
 <PRE>  <p><font color="#008800"><tt>
 cd loncom/build  cd loncom/build
 make configinstall  make configinstall
 </PRE>  </tt></font></p>
 </FONT>  <p>
 <STRONG>General description of what happens</STRONG>  <strong>General description of what happens</strong>
 <P>  </p>
   <p>
 This is the actual make target code.  This is the actual make target code.
 <FONT COLOR="#880000">  </p>
 <PRE>  <pre>
 <!-- LONCAPA MAKETARGET=configinstall START -->  <!-- LONCAPA MAKETARGET=configinstall START -->
 configinstall:   configinstall: Makefile.configinstall
         # there is a dependency on having directories in place, but oh well...   make -f Makefile.configinstall SOURCE="$(SOURCE)" TARGET="$(TARGET)" \
         perl parse.pl ../../doc/loncapafiles/loncapafiles.html configinstall > Makefile.configinstall   configfiles
         make -f Makefile.configinstall SOURCE="../.." TARGET="" configfiles   if (test "0" = $(NORESTORECONF)); then \
         perl loncaparestoreconfigurations lasttimestamp   perl loncaparestoreconfigurations suffix .lpmlnew; fi
         make -f Makefile.configinstall TARGET="" configpermissions  
   Makefile.configinstall: $(SOURCE)/doc/loncapafiles/loncapafiles.lpml lpml_parse.pl
    cat $(SOURCE)/doc/loncapafiles/loncapafiles.lpml | \
    perl lpml_parse.pl configinstall $(CATEGORY) $(DIST) "$(SOURCE)" \
    "$(TARGET)" > Makefile.configinstall
 <!-- LONCAPA MAKETARGET=configinstall END -->  <!-- LONCAPA MAKETARGET=configinstall END -->
 </PRE>  </pre>
 </FONT>  <p>
 Configuration files are installed during this step.  This means  Configuration files are installed during this step.  This means
 that files such as /etc/httpd/access.conf, /etc/smb.conf, /etc/atalk/config,  that files such as <tt>/etc/httpd/conf/loncapa.conf</tt>,
 /home/httpd/html/res/adm/includes/copyright.tab, and  <tt>/home/httpd/html/res/adm/includes/copyright.tab</tt>, and
 /home/httpd/spare.tab are overwritten.  Before being overwritten,  <tt>/home/httpd/spare.tab</tt> are overwritten.  Before being overwritten,
 a backup copy is made though.  Information is read out of these  a backup copy is made though.  Information is read out of these
 backup copies and restored to the new files by the  backup copies and restored to the new files by the
 <TT>loncaparestoreconfigurations</TT> script.  To ensure that  <tt>loncaparestoreconfigurations</tt> script.  To ensure that
 new file permissions and ownerships are installed, a final set of  new file permissions and ownerships are installed, a final set of
 <TT>chown</TT> and <TT>chmod</TT> commands are called for each of   <tt>chown</tt> and <tt>chmod</tt> commands are called for each of 
 the configuration files.  the configuration files.
 </P>  </p>
 <STRONG>For the truly paranoid</STRONG>  <p>
 <P>  <strong>For the truly paranoid</strong>
   </p>
   <p>
 If you are truly paranoid, you can just make the  If you are truly paranoid, you can just make the
 <TT>Makefile.configinstall</TT> file and then save, copy,  <tt>Makefile.configinstall</tt> file and then save, copy,
 and restore all the configuration values yourself.  and restore all the configuration values yourself.
 <TT>loncaparestoreconfigurations</TT> is pretty smart though, has yet to  <tt>loncaparestoreconfigurations</tt> is pretty smart though, has yet to
 fail, and besides, a backup copy is always made (time-stamped so that backup  fail, and besides, when needed, backup copies are made.
 copies are not overwritten).  </p>
 </P>  </li><li><a name="makeRPM" />
 <LI><A NAME="makeRPM">      <h2>Building RPMs (make RPM)</h2>
     <H2>Building RPMs (make RPM)</H2>  <p>
 <STRONG>Commands</STRONG>  LON-CAPA is currently installed through "intelligent tarballs".
 <FONT COLOR="#008800">  What I am describing now is part of an earlier (and perhaps future) effort
 <PRE>  involving RPMs.
 cd loncom/build  </p>
 rm -Rf BinaryRoot <I>(or alternatively, "make clean")</I>  <p>
 make RPM  <strong>Commands</strong>
    <I>(to subsequently install, you can type commands like  </p>
        "rpm -Uvh --force LON-CAPA-base-3.1-1.i386.rpm")</I>  <p><font color="#008800"><tt>
 </PRE>  cd loncom/build<br />
 </FONT>  rm -Rf BinaryRoot <i>(or alternatively, "make clean")</i><br />
 </P>  make RPM<br />
 <STRONG>WARNING!!!!!!!!!!!!!!</STRONG>  <i>(to subsequently install, you can type commands like
 <P>  "rpm -Uvh --force LON-CAPA-base-3.1-1.i386.rpm")</i>
 Never never never never never manually install the  </tt></font></p>
 LON-CAPA-setup-3.1-1.i386.rpm.  This RPM is meant to only be  <p>
 installed by the CD installation process (it wipes out  <strong>Configuration files</strong>
 the existing /etc/passwd file).  </p>
 </P>  <p>
 <STRONG>Configuration files</STRONG>  
 <P>  
 Configuration files are automatically saved with the file suffix  Configuration files are automatically saved with the file suffix
 ".rpmsave".  So <TT>/etc/httpd/conf/access.conf</TT> is saved as   ".rpmsave".  So <tt>/etc/httpd/conf/loncapa.conf</tt> is saved as 
 <TT>/etc/httpd/conf/access.conf.rpmsave</TT>.  You can restore  <tt>/etc/httpd/conf/loncapa.conf.rpmsave</tt>.
 the machine-specific configuration information by running  The <tt>loncaparestoreconfigurations</tt> script should work to restore
 the <TT>/usr/sbin/loncaparestoreconfigurations</TT>.  However,  configurations in this case.  However, please note that if you install an RPM
 a <B>warning</B> is important here.  If you install an RPM twice  twice without restoring your configuration, you will overwrite the
 without restoring your configuration, you will overwrite the  
 ".rpmsave" files.  ".rpmsave" files.
 </P>  </p>
 <STRONG>General description of what happens</STRONG>  <p>
 <P>  <strong>General description of what happens</strong>
   </p>
   <p>
 This is the actual make target code.  This is the actual make target code.
 <FONT COLOR="#880000">  </p>
 <PRE>  <pre>
 <!-- LONCAPA MAKETARGET=RPM START -->  <!-- LONCAPA MAKETARGET=RPM START -->
 RPM: BinaryRoot  RPM: BinaryRoot base_rpm_file_list
         cat base_file_list.txt | perl make_rpm.pl base 3.1 '' '' BinaryRoot   cat $(SOURCE)/doc/loncapafiles/loncapafiles.lpml | \
         cat setup_file_list.txt | perl make_rpm.pl setup 3.1 '' '' BinaryRoot   perl lpml_parse.pl make_rpm $(CATEGORY) $(DIST) $(SOURCE) $(TARGET) \
    > base_customizerpm.xml
    cat base_rpm_file_list.txt | perl make_rpm.pl base 3.2 1 '' '' \
    BinaryRoot base_customizerpm.xml
   
 BinaryRoot:  BinaryRoot: base_rpm_file_list
         perl parse.pl ../../doc/loncapafiles/loncapafiles.html BinaryRoot   make TARGET='BinaryRoot' NORESTORECONF='1' install
   
   base_rpm_file_list:
    cat $(SOURCE)/doc/loncapafiles/loncapafiles.lpml | \
    perl lpml_parse.pl rpm_file_list $(CATEGORY) $(DIST) $(SOURCE) \
    'BinaryRoot' | sort > base_rpm_file_list.txt
 <!-- LONCAPA MAKETARGET=RPM END -->  <!-- LONCAPA MAKETARGET=RPM END -->
 </PRE>  </pre>
 </FONT>  <p>
 A <TT>BinaryRoot</TT> directory is generated that reflects the locations,  A <tt>BinaryRoot</tt> directory is generated that reflects the locations,
 ownerships, permissions, and contents for all the CVS source  ownerships, permissions, and contents for all the CVS source
 files, compiled binaries, directories, and links as they should eventually  files, compiled binaries, directories, and links as they should eventually
 occur on the '/' filesystem location.  occur on the '/' filesystem location.
 </P>  </p>
 <P>  <p>
 <TT>loncom/build/make_rpm.pl</TT> is robust (tested over the  <tt>loncom/build/make_rpm.pl</tt> (also available at
   <a href="http://www.cpan.org">CPAN</a>) is robust (tested over the
 span of months) and, unlike other automated RPM-builders, cleanly  span of months) and, unlike other automated RPM-builders, cleanly
 builds new RPMs without any after-effect of temporary files left  builds new RPMs without any after-effect of temporary files left
 on the system.  (On the negative side, there are a number of  on the system.  The generated RPM is labeled in the format
 LON-CAPA specific customizations inside make_rpm.pl which, for  LON-CAPA-base-(VERSION)-(RELEASE).i386.  VERSION is specified inside the
 the sake of reusability, should eventually be removed).  Two new RPMs  Makefile.
 are generated: LON-CAPA-base-3.1-1.i386 and LON-CAPA-setup-3.1-1.i386.rpm  </p>
 (again, never manually install LON-CAPA-setup-3.1-1.i386.rpm).  </li>
 </P>  </ol>
 </OL>  </body>
 </BODY>  </html>
 </HTML>  
   
   
   
   

Removed from v.1.16  
changed lines
  Added in v.1.21


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>