cgal/Packages/Developers_manual/directory_structure.tex

532 lines
22 KiB
TeX

% =============================================================================
% The CGAL Developers' Manual
% Chapter: Directory Structure for Packages
% -----------------------------------------------------------------------------
% file : directory_structure.tex
% authors: Geert-Jan Giezeman <geert@cs.uu.nl> & Susan Hert <hert@mpi-sb.mpg.de>
% -----------------------------------------------------------------------------
% $Revision$
% $Date$
% =============================================================================
\chapter{Directory Structure for Packages}
\label{chap:directory_structure}
\ccIndexMainItemBegin{directory structure}
\ccIndexSubitemBegin{submitting}{directory structure for}
\ccChapterRelease{Chapter Version: 1.1} \\
\ccChapterAuthor{Geert-Jan Giezeman ({\tt geert@cs.uu.nl}) \&
Susan Hert ({\tt hert@mpi-sb.mpg.de})}
In order for code, demos, documentation, {\em etc.} developed for \cgal\ to
be included in an automated way into the internal (and public) releases of the
library, the files must be organized in a specific directory structure, which
we describe here. We describe the entire directory structure for a package.
Not every package will have all the parts described here. Only the files
{\tt version}, {\tt maintainer}, {\tt changes.txt} and {\tt description.txt}
are obligatory.
\index{maintainer file@{\tt maintainer} file}
\index{version file@{\tt version} file}
\ccIndexMainItem{\tt changes.txt}\ccIndexMainItem{\tt description.txt}
Submissions should not contain files in other places than described here.
Packages may be rejected if they do, and the contents won't go into releases.
The directory structure of a submission should be as follows:
\begin{verbatim}
+--- include/CGAL
|
+--- src/
|
+--- test/<testdir>
|
+--- doc_tex/
|
+--- examples/<exampledir>
|
+--- demo/<demodir>
|
+--- auxiliary/
|
+--- scripts/
|
+--- developer_scripts/
|
|- changes.txt
|
|- description.txt
|
|- long_description.txt
|
|- version
|
|- maintainer
\end{verbatim}
\begin{description}
\item[{\tt include/CGAL}]\index{include/CGAL directory@{\tt include/CGAL} directory}
\index{source\ files!{\tt .h} files}
contains the {\tt .h} files for the package.
\item[{\tt src}]\index{src directory@{\tt src} directory}
\index{source\ files!{\tt .C} files}
contains the {\tt .C} files (if any) for the package.
\item[{\tt test}]\index{test directory@{\tt test} directory!for packages}
contains the test suite code for the package. See
Section~\ref{sec:test_subdirectory} for a detailed description of this
subdirectory.
\item[{\tt doc\_tex}]\index{doc_tex directory@{\tt doc\_tex} directory}
\ccIndexSubitem{source files}{documentation}
contains the documentation for the reference manuals.
These are the files used to produce the manuals for public releases and
to run the internal release reference manual test suite.
See Section~\ref{sec:doc_tex_subdirectory} for a detailed description
of this subdirectory.
See Chapter~\ref{chap:specification} for guidelines for producing
the documentation.
\item[{\tt examples}]\index{examples directory@{\tt examples} directory}
contains the example programs for the package.
See Section~\ref{sec:examples_subdirectory} for a detailed
description of this subdirectory.
\item[{\tt demo}]\index{demo directory@{\tt demo} directory}
contains the demo programs for the package.
Contrary to example programs, demo programs are not expected to be
usable on all platforms. Demo programs may depend on platform-specific
software and may require user interaction. They are compiled but not
run in the test suite. See Section~\ref{sec:demo_subdirectory} for a
more detailed description of this subdirectory
\item[{\tt auxiliary}]\index{auxiliary directory@{\tt auxiliary} directory}
contains auxiliary software for CGAL. For instance,
GMP goes here, as does a special-purpose STL, and other things. The
average package won't have this directory.
\item[{\tt scripts}]\index{scripts directory@{\tt scripts} directory}
contains scripts that are useful for users of CGAL.
\item[{\tt developer\_scripts}]\index{developers_scripts directory@{\tt developers\_scripts} directory}
contains scripts that are useful for
developers of CGAL. This directory is included only in internal
releases, not in public releases.
\item[\ccAnchor{example/changes.txt}{{\tt changes.txt}}]%
\ccIndexMainItem{\tt changes.txt}
should be used to document important changes between
subsequent versions. Each entry in this file should include the new
version number and the date it was submitted together with the
description of the changes.
\item[{\tt description.txt}]%
\ccIndexMainItem{\tt description.txt}
should give a very short description of the contents of the package.
See the last column in the table on the
\ccAnchor{http://www.cs.uu.nl/CGAL/Members/Develop/updates/packages.html}{packages web page}\begin{ccTexOnly} (\path|http://www.cs.uu.nl/CGAL/Members/Develop/updates/packages.html|)\end{ccTexOnly} for example descriptions.
\item[{\tt long\_description.txt}]%
\ccIndexMainItem[c]{\tt long_description.txt}
may be added with more detailed information about the submission.
Follow the links from the fourth column in the table on the
\ccAnchor{http://www.cs.uu.nl/CGAL/Members/Develop/updates/packages.html}{packages web page}
\begin{ccTexOnly} (\path|http://www.cs.uu.nl/CGAL/Members/Develop/updates/packages.html|)\end{ccTexOnly}
for example descriptions.
\item[\ccAnchor{example/version}{{\tt version}}]
\index{version file@{\tt version} file} should contain
the version number and the date in the following format:
\begin{verse}
{\it version} ({\it date})
\end{verse}
For example:
\begin{verse}
2.3.3 (1 Sep 1999)
\end{verse}
The version number may contain only digits and dots. It should start and
end with a digit. The date must be between parentheses.
\item[\ccAnchor{example/maintainer}{{\tt maintainer}}]%
\index{maintainer file@{\tt maintainer} file}
should be used to names the maintainers of the package. The file should
have for each maintainer a line with the following format:
\begin{verse}
{\it name} $<${\it email address}$>$\\
\end{verse}
For example:
\begin{verse}
{\it Susan Hert} $<$hert@mpi-sb.mpg.de$>$\\
{\it Sylvain Pion} $<$Sylvain.Pion@sophia.inria.fr$>$\\
\end{verse}
\end{description}
\section{{\tt test} subdirectory}
\label{sec:test_subdirectory}
\index{test directory@{\tt test} directory|(}
\ccIndexMainItemBegin{test suite}
The structure of the directory that contains the test suite files for
a package should be as follows:
\begin{verbatim}
test/<testdir>
+--- data/
|
+--- include/
|
|- cgal_test
|
|- makefile
|
|- *.C
|
|- *.cin
\end{verbatim}
where the directory \verb|<testdir>| has a name that corresponds to the package
name.
\begin{description}
\item[{\tt data/}] is a subdirectory that contains local data files for the
test suite\index{data directory@{\tt data} directory}.
\item[{\tt include/}] is a subdirectory that contains local include files for
the test suite.
\item[{\tt cgal\_test}]\index{cgal_test script@{\tt cgal\_test} script|(}
is the script that will be called when the entire
test suite is run. It will be created automatically, so usually there
is no need to submit it. (Submitting it is {\bf discouraged}.)
It should rely on four environment variables:
\begin{description}
\item[{\tt \$CGAL\_MAKEFILE}]%
\index{CGAL_MAKEFILE variable@{\tt CGAL\_MAKEFILE} variable}%
\ccIndexSubitem{\tt makefile}{\cgal}
(an included makefile, which {\bf must} include the full path
name!!)
\item[{\tt \$PLATFORM}]%
\index{PLATFORM variable@{\tt PLATFORM} variable}
(the extension of this makefile, that will
be used as an extension to the output files),
\item[{\tt \$TESTSUITE\_CXXFLAGS}]%
\index{TESTSUITE_CXXFLAGS variable@{\tt TESTSUITE\_CXXFLAGS} variable}
(an additional compiler flag)
\item[{\tt \$TESTSUITE\_LDFLAGS}]
\index{TESTSUITE_LDFLAGS variable@{\tt TESTSUITE\_LDFLAGS} variable}
(an additional linker flag)
\end{description}
The latter two flags must be passed to the makefile%
\ccIndexSubitem{\tt makefile}{test suite}
and they should
precede all other compiler and linker flags. The script should then
perform all tests using the makefile \verb|$CGAL_MAKEFILE|.
To indicate whether the tests are successful or not, the script should
write two one-line messages to a file called {\tt error.txt}
\index{error.txt@{\tt error.txt}}
for each target. If something
goes wrong during compilation or during execution, an error message
should be written that starts with the keyword {\tt ERROR:}; otherwise
a message indicating successful compilation or execution should be
written to this file. Running the script {\tt cgal\_test} should not
require any user interaction and the script should clean up after
itself by removing object files and executables (usually by using the
command {\tt make clean}).
This script can be created using the
{\tt create\_cgal\_test}%
\index{create_cgal_test script@{\tt create\_cgal\_test} script}
script (Section~\ref{sec:create_cgal_test}).
\index{cgal_test script@{\tt cgal\_test} script|)}
\item[{\tt makefile}]\ccIndexSubitem{\tt makefile}{test suite}
is the makefile for the test programs. It is created
automatically, just like {\tt cgal\_test}. {\em Submitting it is
{\bf discouraged} even more strongly}, because it is quite difficult
to produce a makefile that works correctly on all supported platforms.
The makefile should use
the two variables \verb|$TESTSUITE_CXXFLAGS|
\index{TESTSUITE_CXXFLAGS variable@{\tt TESTSUITE\_CXXFLAGS} variable}
and \verb|$TESTSUITE_LDFLAGS|
\index{TESTSUITE_LDFLAGS variable@{\tt TESTSUITE\_LDFLAGS} variable}
as the first compiler and linker flags,
respectively. The makefile can be created using the script
{\tt create\_makefile}%
\index{create_makefile script@{\tt create\_makefile} script}
with the argument {\tt -t}
(Section~\ref{sec:create_makefile}).
\item[{\tt *.C}] source code for the test programs.
\ccIndexSubitem{source files}{test suite}
Whan a test program runs correctly, it should return
\ccIndexSubsubitem{test suite}{program}{return value} the
value zero, or, more precisely, the value \verb|std::EXIT_WITH_SUCCESS|
defined in \verb|<cstdlib>|.
Test programs may not be graphical and they may not require any user
interaction.\ccIndexSubitem{test suite}{program}
\item[{\tt *.cin}] files containing command-line input for
\index{test\ suite!input!from {\tt cin}}
test programs. These files are necessary for only those programs
that require command-line input (which can usually be avoided).
If a file \texttt{program.cin} is
present in the test directory, then, when the test suite is run,
\texttt{program} will be executed using the command
\begin{verbatim}
./program < program.cin
\end{verbatim}
\end{description}
\ccIndexMainItemEnd{test suite}
\index{test directory@{\tt test} directory|)}
\section{{\tt doc\_tex} subdirectory}
\label{sec:doc_tex_subdirectory}
\index{doc_tex directory@{\tt doc\_tex} directory|(}
\ccIndexSubitemBegin{manuals}{source files}
\ccIndexSubitemBegin{source files}{documentation}
As described in Chapter~\ref{chap:specification}, the \cgal\ documentation is
currently divided into six separate manuals. This division is reflected
in the structure of the {\tt doc\_tex} directory, which contains the
documentation source files:
\begin{verbatim}
doc_tex
+--- installation/
|
+--- kernel/
|
+--- basic/
|
+--- deprecated_basic/
|
+--- support/
|
+--- use_of_stl/
\end{verbatim}
The {\tt basic/}, {\tt deprecated\_basic/} and {\tt support/} directories each
contain subdirectories
that correspond to the packages documented in these manuals. Contained in these
subdirectories are the files required for producing a package's contributions
to the reference manual and users' manual. The users' manual input files are
located in the package's directory; the reference manual files are
be located in a directory named $<Package>${\tt \_ref}
\index{ref directory@{\tt \_ref} directory}.
For both the users' manual and reference manual parts, the input can be
split into more than one file (In fact, this is necessary for the reference
manual in order to support conversion to HTML;
see Section~\ref{sec:ref_manual}.), but there must be a file called
{\tt main.tex} in both the user and reference manual directories that inputs
all the other files for that manual part.
({\bf Note}: You should use the \verb|\input| command and NOT the
\verb|\include| command to input other source files in this file.)
For example, the optimisation package of
the basic library can have the following documentation.
\begin{verbatim}
doc_tex/basic/Optimisation
|- main.tex
|
|- *.tex
|
|- *.eps
|
|- *.gif
|
|- *.html
|
|- htmlfiles
|
|- cgal.bib
|
doc_tex/basic/Optimisation_ref/
|- main.tex
|
|- *.tex
|
|- *.eps
|
|- *.gif
|
|- *.html
|
|- htmlfiles
|
|- cgal.bib
\end{verbatim}
\begin{description}
\item[\ccAnchor{example/doc_tex/basic/Package/main_tex}{{\tt main.tex}}]%
\ccIndexMainItem{\tt main.tex}\ccIndexSubitem{users' manual}{\tt main.tex}
must contain one or more chapters. It must NOT
contain a preamble (so no {\tt documentclass}, {\tt usepackage},
\verb|\begin{document}| or \verb|\end{document}| commands).
Until the new manual style is used, this file should also input the
{\tt main.tex} file for the reference manual pages for this package.
\item[{\tt *.tex}] -- the source files for the Users' Manual that are input
by {\tt main.tex}
\item[{\tt *.eps}] -- the PostScript pictures included in the documentation
\item[{\tt *.gif}] -- the corresponding {\tt gif} figures for the HTML
documentation
\item[{\tt *.html}] -- auxiliary HTML files ({\em i.e.}, other than those
generated by {\tt cc\_manual\_to\_html}) that are used in the HTML
documentation.
\item[\ccAnchor{example/doc_tex/basic/Package/htmlfiles}{{\tt htmlfiles}}]%
\index{htmlfiles file@{\tt htmlfiles} file}%
-- a list of auxiliary files ({\em e.g.} the {\tt .gif} and {\tt .html}
files) required for the HTML documentation. Each file name should be
on a separate line in this file. When the manual is created, these
files will be copied to the directory containing the HTML manuals.
\item[{\tt cgal.bib}]\index{cgal_bib@{\tt cgal.bib}} -- a list of citations
for items {\bf not found} in the
\ccAnchor{http://www.cs.uu.nl/usr/cgi-bin/bib-search/geom}{{\tt geombib}}
data base. Citations from this database will be
resolved automatically when the manual is created.
\item[{\tt Optimisation\_ref/}] -- directory containing the source files
for the reference manual pages for this package.
\item[\ccAnchor{example/doc_tex/basic/Package_ref/main_tex}{{\tt Optimisation\_ref/main.tex}}]
\ccIndexMainItem{\tt main.tex}\ccIndexSubitem{reference manual}{\tt main.tex}%
-- the file that inputs the source files for the reference manual pages,
with the same restrictions as above.
\item[{\tt Optimisation\_ref/*.tex}] -- the source files for the reference
manual, with each item documented in a separate file.
\item[{\tt Optimisation\_ref/*.eps}, {\tt Optimisation\_ref/*.gif}] --
same as above.
\item[{\tt Optimisation\_ref/htmlfiles}] -- same as above.
\end{description}
\ccIndexSubitemEnd{source files}{documentation}
\ccIndexSubitemEnd{manuals}{source files}
\index{doc_tex directory@{\tt doc\_tex} directory|)}
\section{{\tt examples} subdirectory}
\label{sec:examples_subdirectory}
\index{examples directory@{\tt examples} directory|(}
\ccIndexSubitemBegin{example programs}{submitting}
Example programs (Chapter~\ref{chap:examples_and_demos}) for a package should
be placed in a subdirectory of the directory {\tt examples}.
The subdirectory name, \verb|<exampledir>|, will usually correspond to the
package name, but this is not a requirement.
To make sure that the examples will be tested%
\ccIndexSubitem{test suite}{examples in},
a directory with examples
should be submitted in exactly the same way as a test directory
(Section~\ref{sec:test_subdirectory}).
The structure of an example directory should be as follows:
\begin{verbatim}
examples/<exampledir>
+--- data/
|
+--- include/
|
|- README
|
|- cgal_test
|
|- makefile
|
|- *.C
\end{verbatim}
\ccIndexSubitem{source files}{examples}
The file {\tt README} should contain information about what the programs do
and how to compile them.
See the rules for a test directory for an explanation of the other files
and subdirectories.
\ccIndexSubitemEnd{example programs}{submitting}
\index{examples directory@{\tt examples} directory|)}
\section{{\tt demo} subdirectory}
\label{sec:demo_subdirectory}
\index{demo directory@{\tt demo} directory|(}
\ccIndexMainItem{demo programs}
\ccIndexSubitemBegin{demo programs}{submitting}
The {\tt demo} directory (Chapter~\ref{chap:examples_and_demos}) contains
programs with graphical interfaces or programs requiring user input. These
programs will be compiled but not run by the test suite.
\ccIndexSubitem{test suite}{demos in}
The structure of this directory should be as follows:
\begin{verbatim}
demo/<demodir>
+--- data/
|
+--- include/
|
|- README
|
|- makefile
|
|- *.C
\end{verbatim}
where \verb|<demodir>| is a name that corresponds (at least in part) to
the package for which it is a demo.
\ccIndexSubitem{source files}{demos}
The file {\tt README} should contain information about what the program does,
and how to compile it ({\it i.e.}, what graphical libraries are needed,
{\it etc.}). Note that, in contrast to example programs and test suite
programs, for demo programs is it necessary to submit a {\tt makefile}
\ccIndexSubitem{\tt makefile}{demo programs} since
different demos will require different libraries and thus the makefiles
for these programs will be somewhat dissimilar.
\ccIndexMainItem{demo programs}
\ccIndexSubitemEnd{demo programs}{submitting}
\index{demo directory@{\tt demo} directory|)}
\section{Bug fixes}
\label{sec:bug_fixes}
\ccIndexSubitemBegin{bug fixes}{submitting}
The directory structure of a bug fix submission should follow that of a normal
submission. It contains replacement files for buggy files in a public release.
\begin{verbatim}
|- description.txt
|
|- long_description.txt
|
+- <files that replace files in the public release>
\end{verbatim}
The fules for submitting bug fixes are:
\begin{itemize}
\item A bug fix should apply to the official public release of CGAL and
should not depend on more recent internal releases.
\item If possible, make your changes directly in the files from the public
distribution (otherwise make sure that the file you edit is the same
as the one in the public release).
\item The file {\tt description.txt}%
\ccIndexSubitem{\tt description.txt}{for bug fixes}
should give a very short (not more
than 50 words) description of the bug that has been fixed.
\item A file called {\tt long\_description.txt}
\ccIndexSubitem[c]{\tt long_description.txt}{for bug fixes}
must be added
with more detailed information about the bug fix, including:
\begin{itemize}
\item description of the problem(s) that this patch fixes;
\item list of the files that are affected;
\item whether the library needs to be recompiled after applying
this patch.
\end{itemize}
\item Bug fixes should be sent to the following address:
\ccAnchor{mailto:cgal-bugfixes@cs.uu.nl}{{\tt cgal-bugfixes@cs.uu.nl}}.
\end{itemize}
\ccIndexSubitemEnd{bug fixes}{submitting}
\ccIndexSubitemEnd{submitting}{directory structure for}
\ccIndexMainItemEnd{directory structure}
\InternalOnly{
\section{Requirements and recommendations}
\label{sec:directories_req_and_rec}
\noindent
Requirements:
\begin{itemize}
\item The directory structure outlined here must be followed exactly.
\end{itemize}
\noindent
Recommendations:
\begin{itemize}
\item Do not submit {\tt makefile}s for example programs and test suite
programs.
\item Do not submit the script {\tt cgal\_test} used to compile and test
your test suite programs.
\end{itemize}
}