version 1.7, 2001/01/17 11:20:32
|
version 1.18, 2002/04/27 16:31:39
|
Line 1
|
Line 1
|
<H1>LON-CAPA Software Developer Instructions</H1> |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" |
|
"http://www.w3.org/TR/html4/loose.dtd"> |
|
<!-- The LearningOnline Network with CAPA --> |
|
<!-- $Id$ --> |
|
<html> |
|
<head> |
|
<meta name="GENERATOR" |
|
content="Scott Harrison and Emacs Version 3.14159265358979" /> |
|
<title>LON-CAPA Software Developer Instructions</title> |
|
</head> |
|
<body> |
|
<h1>LON-CAPA Software Developer Instructions</h1> |
|
<p> |
|
<br /><i>Written by Scott Harrison, January 17, 2001</i> |
|
<br /><i>Last updated, April 27, 2002</i> |
|
</p> |
|
<ol> |
|
<li><a href="#Using_CVS">Using CVS</a></li> |
|
<ul> |
|
<li><a href="#cvslog">Logging in and out (cvs login; cvs logout)</a></li> |
|
<li><a href="#cvsupdate">Updating files (cvs update -d)</a></li> |
|
<li><a href="#cvssave">Saving files (cvs commit)</a></li> |
|
<li><a href="#cvsadd">Adding files (cvs add)</a></li> |
|
<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 |
|
(cvs update)</a></li> |
|
</ul> |
|
<li><a href="#makeHTML">Viewing the software (make HTML)</a></li> |
|
<li><a href="#makebuild">Compiling the software (make build)</a></li> |
|
<li><a href="#loncapafiles">Adding/removing files from the LON-CAPA |
|
installation (doc/loncapafiles/loncapafiles.lpml)</a></li> |
|
<li><a href="#configversusnonconfig">Configurable files versus |
|
non-configurable files</a></li> |
|
<li><a href="#makeinstall">Updating the non-configurable files on your |
|
machine (make install)</a></li> |
|
<li><a href="#makeconfiginstall">Updating the configurable files on your |
|
machine (make configinstall)</a></li> |
|
<li><a href="#makeRPM">Building RPMs (make RPM)</a></li> |
|
</ol> |
|
|
<OL> |
<ol> |
<LI><A HREF="#Using_CVS">Using CVS</A> |
<a name="Using_CVS" /> |
<UL> |
<li><h2>Using CVS</h2></li> |
<LI><A HREF="#cvslog">Logging in and out (cvs login; cvs logout)</A> |
These instructions assume that you are using a Linux or UNIX based |
<LI><A HREF="#cvsget">Getting files (cvs update -d)</A> |
terminal. |
<LI><A HREF="#cvsupdate">Updating files (cvs update -d)</A> |
<ul> |
<LI><A HREF="#cvssave">Saving files (cvs commit)</A> |
<li><a name="cvslog" /> |
<LI><A HREF="#cvsadd">Adding files (cvs add)</A> |
<h3>Using CVS: Logging in and out (cvs login; cvs logout)</h3> |
<LI><A HREF="#cvsadddir">Adding directories (cvs add/import)</A> |
<p> |
<LI><A HREF="#cvsnotsure">What to do when you're not sure about your files (cvs update)</A> |
To log into CVS, CVS needs to be part of your system environment. |
</UL> |
You can accomplish this by: |
<LI><A HREF="#makeHTML">Viewing the software (make HTML)</A> |
<font color="#008800"> |
<LI><A HREF="#makebuild">Compiling the software (make build)</A> |
<pre> |
<LI><A HREF="#loncapafiles">Adding/removing files from the LON-CAPA installation (doc/loncapafiles/loncapafiles.html)</A> |
export CVSROOT=:pserver:USERNAME@install.lon-capa.org:/home/cvs |
<LI><A HREF="#configversusnonconfig">Configurable files versus non-configurable files</A> |
</pre> |
<LI><A HREF="#makeinstall">Updating the non-configurable files on your machine (make install)</A> |
</font> |
<LI><A HREF="#makeconfiginstall">Updating the configurable files on your machine (make configinstall)</A> |
</p> |
<LI><A HREF="#makeRPM">Building RPMs (make RPM)</A> |
<p> |
</OL> |
To actually login, you will need to execute the following command: |
|
<font color="#008800"> |
<OL> |
<pre> |
<A NAME="Using_CVS"> |
cvs login |
<LI><H2>Using CVS</H2> |
</pre> |
<UL> |
</font> |
<LI><A NAME="cvslog"> |
You will be prompted for a password. |
<H3>Using CVS: Logging in and out (cvs login; cvs logout)</H3> |
If you do not have a password, or the password is not working, you |
<LI><A NAME="cvsget"> |
should contact <a href="mailto:helen@lon-capa.org">helen@lon-capa.org</a> |
<H3>Using CVS: Getting files (cvs update -d)</H3> |
</p> |
<LI><A NAME="cvsupdate"> |
<p> |
<H3>Using CVS: Updating files (cvs update -d)</H3> |
If you have yet to check out the CVS repository, you can use the |
<LI><A NAME="cvssave"> |
<tt>checkout</tt> command. (Otherwise, just enter your |
<H3>Using CVS: Saving files (cvs commit)</H3> |
CVS repository, <tt>cd loncapa</tt>.) |
<LI><A NAME="cvsadd"> |
<font color="#008800"> |
<H3>Using CVS: Adding files (cvs add)</H3> |
<pre> |
<LI><A NAME="cvsadddir"> |
cvs checkout loncapa |
<H3>Using CVS: Adding directories (cvs add/import)</H3> |
cd loncapa |
<LI><A NAME="cvsnotsure"> |
</pre> |
<H3>Using CVS: What to do when you're not sure about your files (cvs update)</H3> |
</font> |
</UL> |
</p> |
<LI><A NAME="makeHTML"> |
<p>After you have completed your work with the CVS repository, it |
<H2>Viewing the software (make HTML)</H2> |
is recommended that you log out: |
<STRONG>Commands</STRONG> |
<font color="#008800"> |
<FONT COLOR="#008800"> |
<pre> |
<PRE> |
cvs logout |
|
</pre> |
|
</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 |
|
programmers other than yourself have made. This is done |
|
with the <tt>update</tt> command. |
|
<font color="#008800"> |
|
<pre> |
|
cvs update -d |
|
</pre> |
|
</font> |
|
</p> |
|
<p> |
|
The <tt>cvs update</tt> command will give you output |
|
as it updates your CVS source tree. Commonly you will |
|
see 'U' and 'P' which indicate that a file has been updated with |
|
changes another programmer has made. |
|
<font color="#880000"> |
|
<pre> |
|
`U FILE' |
|
The file was brought up to date with respect to the repository. |
|
This is done for any file that exists in the repository but not in |
|
your source, and for files that you haven't changed but are not |
|
the most recent versions available in the repository. |
|
|
|
`P FILE' |
|
Like `U', but the CVS server sends a patch instead of an entire |
|
file. These two things accomplish the same thing. |
|
</pre> |
|
</font> |
|
</p> |
|
<p> |
|
Usually, when you do not <tt>cvs commit</tt> the code changes that you |
|
make, the <tt>update</tt> command will tell you that you have modified |
|
your file with the 'M' flag. |
|
<font color="#880000"> |
|
<pre> |
|
`M FILE' |
|
The file is modified in your working directory. This is probably |
|
based on changes you made and have not yet "cvs commit"-ed. |
|
</pre> |
|
</font> |
|
Sometimes, it will occur that: |
|
<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> |
|
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. |
|
<font color="#880000"> |
|
<pre> |
|
`C FILE' |
|
A conflict was detected while trying to merge your changes to FILE |
|
with changes from the source repository. |
|
</pre> |
|
</font> |
|
You will need to open the file and examine it; CVS will have added in |
|
markup tags like "<<<<<<" 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 passing it an argument will |
|
commit all changes that you have within the current directory and |
|
subdirectories. |
|
<font color="#008800"> |
|
<pre> |
|
cvs commit |
|
</pre> |
|
</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.) |
|
<font color="#008800"> |
|
<pre> |
|
cvs commit FILENAME |
|
</pre> |
|
</font> |
|
</p> |
|
<p> |
|
Note that CVS typically invokes the <tt>vi</tt> editor and solicits comments |
|
about your latest changes to the software. Your comments should be |
|
both short yet uniquely descriptive. For example: |
|
<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> |
|
</p> |
|
</li> |
|
<li><a name="cvsadd" /> |
|
<h3>Using CVS: Adding files (cvs add)</h3> |
|
<p> |
|
<font color="#008800"> |
|
<pre> |
|
cvs add FILENAME |
|
</pre> |
|
</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"> |
|
<pre> |
|
cvs add DIRECTORYNAME |
|
</pre> |
|
</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> |
|
</li> |
|
<li><a name="cvsnotsure" /> |
|
<h3>Using CVS: What to do when you're not sure about your files |
|
(cvs update -d)</h3> |
|
<p> |
|
Every 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> |
|
In other words, 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><a name="makeHTML" /> |
|
<h2>Viewing the software (make HTML)</h2></li> |
|
<strong>Commands</strong> |
|
<font color="#008800"> |
|
<pre> |
cd loncom/build |
cd loncom/build |
rm -Rf HTML |
rm -Rf HTML <I>(or alternatively, "make clean")</I> |
make HTML |
make HTML |
cd HTML |
cd HTML |
<I>(look at the index.html file with a web browser such as Netscape)</I> |
<I>(look at the index.html file with a web browser such as Netscape)</I> |
</PRE> |
</pre> |
</FONT> |
</font> |
<STRONG>General description of what happens</STRONG> |
<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"> |
<font color="#880000"> |
<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> |
</font> |
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.lpml</tt> is parsed into a more |
viewable format by <TT>loncom/build/parse.pl</TT>. The resulting |
viewable format by <tt>loncom/build/lpml_parse.pl</tt>. The resulting |
file gives a very well organized view of all the files, directories, |
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><a name="makebuild" /> |
<H2>Compiling the software (make build)</H2> |
<h2>Compiling the software (make build)</h2> |
<LI><A NAME="loncapafiles"> |
<strong>Commands</strong> |
<H2>Adding/removing files from the LON-CAPA installation (doc/loncapafiles/loncapafiles.html)</H2> |
<font color="#008800"> |
<LI><A NAME="configversusnonconfig"> |
<pre> |
<H2>Configurable files versus non-configurable files</H2> |
cd loncom/build |
<LI><A NAME="makeinstall"> |
make build |
<H2>Updating the non-configurable files on your machine (make install)</H2> |
</pre> |
<LI><A NAME="makeconfiginstall"> |
</font> |
<H2>Updating the configurable files on your machine (make configinstall)</H2> |
<p> |
<LI><A NAME="makeRPM"> |
<strong>General description of what happens</strong> |
<H2>Building RPMs (make RPM)</H2> |
</p> |
</OL> |
<p> |
|
This is the actual make target code. |
|
<font color="#880000"> |
|
<pre> |
|
<!-- LONCAPA MAKETARGET=build START --> |
|
build: Makefile.build pod2html.sh pod2man.sh |
|
echo -n "" > WARNINGS |
|
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 --> |
|
</pre> |
|
</font> |
|
<tt>loncom/build/lpml_parse.pl</tt> reads in all the build information out |
|
of <tt>doc/loncapafiles/loncapafiles.lpml</tt>. A new Makefile named |
|
<tt>loncom/build/Makefile.build</tt> is dynamically constructed. |
|
This dynamically generated Makefile is then run to build/compile |
|
all the software targets from source. This currently takes 10 minutes |
|
(depends on the speed of the machine you compile with). |
|
</p> |
|
<strong>Example</strong> |
|
<p> |
|
Here is information for one file <tt>tth.so</tt> provided in |
|
<tt>doc/loncapafiles/loncapafiles.lpml</tt>. |
|
<font color="#330066"> |
|
<pre> |
|
<file> |
|
<source>loncom/homework/caparesponse/capa.so</source> |
|
<target dist='default'>usr/lib/perl5/site_perl/5.005/capa.so</target> |
|
<target dist='redhat7 redhat7.1'>usr/lib/perl5/site_perl/5.6.0/capa.so</target> |
|
<categoryname>system file</categoryname> |
|
<description> |
|
shared library file for dynamic loading and unloading |
|
</description> |
|
<build trigger='always run'> |
|
loncom/homework/caparesponse/commands |
|
</build> |
|
<dependencies> |
|
caparesponse.c; |
|
caparesponse.pm; |
|
README; |
|
Makefile.PL; |
|
capa.i; |
|
commands |
|
</dependencies> |
|
</file> |
|
</pre> |
|
</font> |
|
<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>). |
|
<font color="#330066"> |
|
<pre> |
|
all: ../homework/caparesponse/capa.so ../modules/TexConvert/tthperl/tth.so |
|
|
|
../homework/caparesponse/capa.so: ../homework/caparesponse/caparesponse.c ../homework/caparesponse/caparesponse.pm alwaysrun |
|
cd ../homework/caparesponse/; sh ./commands |
|
|
|
../modules/TexConvert/tthperl/tth.so: ../modules/TexConvert/tthperl/../tthdynamic/tthfunc.c ../modules/TexConvert/tthperl/../ttmdynamic/ttmfunc.c |
|
cd ../modules/TexConvert/tthperl/; sh ./commands |
|
|
|
alwaysrun: |
|
</pre> |
|
</font> |
|
</p> |
|
</li><li><a name="loncapafiles" /> |
|
<h2>Adding/removing files from the LON-CAPA installation (doc/loncapafiles/loncapafiles.html)</h2> |
|
<strong>To add and remove (and alter)</strong> |
|
<p> |
|
All that you have to do to alter the behavior of the installation is |
|
edit a single file (<tt>doc/loncapafiles/loncapafiles.lpml</tt>). |
|
Adding, removing, and altering files requires proper attention |
|
to the syntax of file format of course. |
|
</p> |
|
<strong>File Format</strong> |
|
<P> |
|
The preceding <a href=#"makebuild">"make build"</a> documentation |
|
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 |
|
loncapafiles.html (as well as, by example, seeing how various |
|
information is coded). All in all, the syntax is quite simple. |
|
</p> |
|
<strong>Philosophy and notes (the thing nobody reads)</strong> |
|
<p> |
|
Packaging the software from CVS onto a machine file system requires many |
|
things: |
|
<ul> |
|
<li>documenting every component of the software,</li> |
|
<li>handling CVS <u>source</u> to file system <u>target</u> information,</li> |
|
<li>handling (according to a hierarchical scheme of grouping) file |
|
ownership and permissions,</li> |
|
<li>handling (according to a hierarchical scheme of grouping) directory |
|
ownership and permissions,</li> |
|
<li>handling symbolic links,</li> |
|
<li>providing for multiple options of installation targets |
|
(RedHat versus Debian for instance),</li> |
|
<li>providing for different file ownerships and permissions to apply |
|
to the same file,</li> |
|
<li>allowing system software documentation to be automatically generated |
|
(see information on <a href="#makeHTML">"make html"</a>),</li> |
|
<li>providing information in an easily adjustable form as new demands |
|
are made on the software packaging system,</li> |
|
<li>providing software package information (for RPM),</li> |
|
<li>having information in a format that allows for troubleshooting |
|
the current status of the machine file system,</li> |
|
<li>allow for changes to the structure of the CVS repository,</li> |
|
<li>and something that is simple enough for any one to immediately work with, |
|
without having to learn specifics (or hidden traps) of complicated Makefile's |
|
or a new macro language (m4?).</li> |
|
</ul> |
|
</p> |
|
<p> |
|
I looked into, and tried, different ways of accomplishing the above |
|
including automake and recursive make. The automake system seemed quite |
|
complicated (and needlessly so in terms of this project since, by and large, |
|
it works to coordinate many different types of build/compilation parameters |
|
whereas we are more concerned with installation parameters). Recursive make |
|
has significant deficiencies in the sense that not all the information |
|
is kept in one place, and there are significant levels of dependency |
|
between all the things that must be done to keep software packaging |
|
up to date. A particularly convincing article I found when looking into |
|
much of this was |
|
<a href="http://www.pcug.org.au/~millerp/rmch/recu-make-cons-harm.html"> |
|
"Recursive Make Considered Harmful" by Peter Miller</a>. Complicating |
|
matters was, at the time, it was unclear as to what categories |
|
of software files we had, and whether or not the 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 |
|
as opposed to a per-directory basis (although there is a successful |
|
implementation of a standard big Makefile in <tt>loncom/Makefile</tt>). |
|
Additionally, a standard big Makefile assumes certain "normalcy" to |
|
the directory structure of different potential operating system directories |
|
(RedHat vs. Debian). |
|
</p> |
|
<p> |
|
If you take time to look at loncapafiles.lpml |
|
(and perhaps run the <a href="#makeHTML">make HTML</a> command) |
|
you will find that the organizing information according to the markup |
|
syntax in <tt>loncapafiles.lpml</tt> is simple. Simple is good. |
|
</p> |
|
<p> |
|
<tt>loncom/build/lpml_parse.pl</tt> is the script (invoked automatically |
|
by the various targets in <tt>loncom/build/Makefile</tt>) that reads |
|
<tt>doc/loncapafiles/loncapafiles.lpml</tt>. <tt>lpml_parse.pl</tt> |
|
is capable of reading and returning different types of information |
|
from <tt>loncapafiles.lpml</tt> depending on how <tt>lpml_parse.pl</tt> |
|
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 |
|
any parser however, I remain paranoid. |
|
</p> |
|
<p> |
|
<tt>lpml_parse.pl</tt> is very fast and styled after a state-based SAX-like |
|
approach. Additionally, <tt>loncapafiles.lpml</tt> has a |
|
DTD (loncom/build/lpml.dtd) against which it is valid. |
|
I would like to use more ENTITY's inside <tt>lpml.dtd</tt> but currently |
|
Perl XML modules available at CPAN do not digest complex ENTITY's that well. |
|
</p> |
|
<p> |
|
The <tt>lpml_parse.pl</tt>-<tt>loncapafiles.lpml</tt> |
|
combination has been working very efficiently and error-free. |
|
</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 |
|
/etc/httpd/access.conf, /etc/smb.conf, /etc/ntp.conf, /etc/krb.conf, |
|
/etc/atalk/config, /etc/ntp/step-tickers, |
|
/home/httpd/html/res/adm/includes/copyright.tab, |
|
/home/httpd/html/res/adm/includes/un_keyword.tab, |
|
/home/httpd/hosts.tab, and |
|
/home/httpd/spare.tab. |
|
</p> |
|
<p> |
|
All of these configurable files contain machine-specific information. |
|
For instance, the LON-CAPA system relies on unique host IDs such |
|
as msua3, s1, s2, msul1, and 103a1 (specified as a "PerlSetVar lonHostID" |
|
field within /etc/httpd/access.conf). |
|
Non-configurable files simply do NOT have machine-specific information. |
|
<strong>The impact on updating software</strong> |
|
<p> |
|
What this means in terms of software updating is that |
|
<ul> |
|
<li>non-configurable files can be simply overwritten with newer versions |
|
(without "anything" else to worry about),</li> |
|
<li>and configurable files must follow these steps to be safely |
|
overwritten</li> |
|
<ol> |
|
<li>have their machine specific information saved,</li> |
|
<li>be overwritten, and then</li> |
|
<li>have their machine specific information restored.</li> |
|
</ol> |
|
</ul> |
|
</p> |
|
<li><a name="makeinstall" /> |
|
<h2>Updating the non-configurable files on your machine (make install)</h2> |
|
<strong>Commands</strong> |
|
<font color="#008800"> |
|
<pre> |
|
cd loncom/build |
|
make install |
|
</pre> |
|
</font> |
|
<p> |
|
<strong>General description of what happens</strong> |
|
</p> |
|
<p> |
|
This is the actual make target code. |
|
<font color="#880000"> |
|
<pre> |
|
<!-- LONCAPA MAKETARGET=install START --> |
|
install: TEST_hosts_tab Makefile.install Makefile |
|
echo -n "" > WARNINGS |
|
make -f Makefile.install SOURCE="$(SOURCE)" TARGET="$(TARGET)" \ |
|
directories |
|
make -f Makefile.install SOURCE="$(SOURCE)" TARGET="$(TARGET)" files |
|
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 --> |
|
</pre> |
|
</font> |
|
For safety reasons (so as to not mess up a machine's configuration), |
|
configuration files are NOT installed during this step. This means |
|
that files such as /etc/httpd/access.conf, /etc/smb.conf, /etc/atalk/config, |
|
/home/httpd/html/res/adm/includes/copyright.tab, and |
|
/home/httpd/spare.tab are not overwritten, but remain as old, non-updated |
|
copies. (To automatically update these files and save/restore |
|
their encoded machine configuration, you must run "make configinstall"). |
|
</p> |
|
<li><a name="makeconfiginstall" /> |
|
<h2>Updating the configurable files on your machine (make configinstall)</h2> |
|
<strong>Commands</strong> |
|
<font color="#008800"> |
|
<pre> |
|
cd loncom/build |
|
make configinstall |
|
</pre> |
|
</font> |
|
<strong>General description of what happens</strong> |
|
<p> |
|
This is the actual make target code. |
|
<font color="#880000"> |
|
<pre> |
|
<!-- LONCAPA MAKETARGET=configinstall START --> |
|
configinstall: Makefile.configinstall |
|
make -f Makefile.configinstall SOURCE="$(SOURCE)" TARGET="$(TARGET)" \ |
|
configfiles |
|
if (test "0" = $(NORESTORECONF)); then \ |
|
perl loncaparestoreconfigurations suffix .lpmlnew; fi |
|
|
|
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 --> |
|
</pre> |
|
</font> |
|
Configuration files are installed during this step. This means |
|
that files such as /etc/httpd/access.conf, /etc/smb.conf, /etc/atalk/config, |
|
/home/httpd/html/res/adm/includes/copyright.tab, and |
|
/home/httpd/spare.tab are overwritten. Before being overwritten, |
|
a backup copy is made though. Information is read out of these |
|
backup copies and restored to the new files by the |
|
<tt>loncaparestoreconfigurations</tt> script. To ensure that |
|
new file permissions and ownerships are installed, a final set of |
|
<tt>chown</tt> and <tt>chmod</tt> commands are called for each of |
|
the configuration files. |
|
</p> |
|
<p> |
|
<strong>For the truly paranoid</strong> |
|
</p> |
|
<p> |
|
If you are truly paranoid, you can just make the |
|
<tt>Makefile.configinstall</tt> file and then save, copy, |
|
and restore all the configuration values yourself. |
|
<tt>loncaparestoreconfigurations</tt> is pretty smart though, has yet to |
|
fail, and besides, when needed backup copies are made. |
|
</p> |
|
</li><li><a name="makeRPM" /> |
|
<h2>Building RPMs (make RPM)</h2> |
|
<p> |
|
LON-CAPA is currently installed through "intelligent tarballs". This |
|
is part of an earlier (and perhaps future) effort involving RPMs. |
|
<strong>Commands</strong> |
|
<font color="#008800"> |
|
<pre> |
|
cd loncom/build |
|
rm -Rf BinaryRoot <I>(or alternatively, "make clean")</I> |
|
make RPM |
|
<I>(to subsequently install, you can type commands like |
|
"rpm -Uvh --force LON-CAPA-base-3.1-1.i386.rpm")</I> |
|
</pre> |
|
</font> |
|
</p> |
|
<strong>WARNING!!!!!!!!!!!!!!</strong> |
|
<p> |
|
Never never never never never manually install the |
|
LON-CAPA-setup-3.1-1.i386.rpm. This RPM is meant to only be |
|
installed by the CD installation process (it wipes out |
|
the existing /etc/passwd file). |
|
</p> |
|
<p> |
|
<strong>Configuration files</strong> |
|
</p> |
|
<p> |
|
Configuration files are automatically saved with the file suffix |
|
".rpmsave". So <tt>/etc/httpd/conf/access.conf</tt> is saved as |
|
<tt>/etc/httpd/conf/access.conf.rpmsave</tt>. You can restore |
|
the machine-specific configuration information by running |
|
the <tt>/usr/sbin/loncaparestoreconfigurations</tt>. However, |
|
a <b>warning</b> is important here. If you install an RPM twice |
|
without restoring your configuration, you will overwrite the |
|
".rpmsave" files. |
|
</p> |
|
<p> |
|
<strong>General description of what happens</strong> |
|
</p> |
|
<p> |
|
This is the actual make target code. |
|
<font color="#880000"> |
|
<pre> |
|
<!-- LONCAPA MAKETARGET=RPM START --> |
|
RPM: BinaryRoot base_rpm_file_list |
|
cat $(SOURCE)/doc/loncapafiles/loncapafiles.lpml | \ |
|
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 '' '' \ |
|
BinaryRoot base_customizerpm.xml |
|
|
|
BinaryRoot: base_rpm_file_list |
|
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 --> |
|
</pre> |
|
</font> |
|
A <tt>BinaryRoot</tt> directory is generated that reflects the locations, |
|
ownerships, permissions, and contents for all the CVS source |
|
files, compiled binaries, directories, and links as they should eventually |
|
occur on the '/' filesystem location. |
|
</p> |
|
<p> |
|
<tt>loncom/build/make_rpm.pl</tt> is robust (tested over the |
|
span of months) and, unlike other automated RPM-builders, cleanly |
|
builds new RPMs without any after-effect of temporary files left |
|
on the system. (On the negative side, there are a number of |
|
LON-CAPA specific customizations inside make_rpm.pl which, for |
|
the sake of reusability, should eventually be removed). Two new RPMs |
|
are generated: LON-CAPA-base-3.1-1.i386 and LON-CAPA-setup-3.1-1.i386.rpm |
|
(again, never manually install LON-CAPA-setup-3.1-1.i386.rpm). |
|
</p> |
|
</li> |
|
</ol> |
|
</body> |
|
</html> |
|
|
|
|
|
|
|
|