diff options
Diffstat (limited to 'configure.ac.pamphlet')
-rw-r--r-- | configure.ac.pamphlet | 1163 |
1 files changed, 1163 insertions, 0 deletions
diff --git a/configure.ac.pamphlet b/configure.ac.pamphlet new file mode 100644 index 00000000..8959fee5 --- /dev/null +++ b/configure.ac.pamphlet @@ -0,0 +1,1163 @@ +%% Oh Emacs, this is a -*- sh -*- script, despite appearance. +\documentclass[12pt]{article} +\usepackage{axiom} +\usepackage[latin1]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{fancyvrb} +\usepackage{pslatex} +\usepackage{url} + +\newcommand{\email}[1]{\url{#1}} +\CustomVerbatimEnvironment{chunk}{Verbatim}{frame=none,fontsize=\small} + +\def\nwendcode{\endtrivlist \endgroup} +\let\nwdocspar=\par +\let\nowebsize=\small + + +\title{The Toplevel \File{configure.ac} Pamphlet} +\author{Gabriel Dos~Reis} + +\begin{document} +\maketitle + +\begin{abstract} + This pamphlet details the configuration process of setting up + \Tool{OpenAxiom} for build from source codes. + It also explains general dependencies on external tools. + The configuration process scrutinizes the build, host, and target + environments, and finally instantiates \File{Makefile}s for building + \Tool{OpenAxiom} interpreter, compiler, libraries, and auxiliary tools + where appropriate. +\end{abstract} + +\section{Introduction} +\label{sec:intro} + +This is the top-level \Tool{Autoconf} description that sets up the +minimum environment for building \Tool{OpenAxiom}. This effort +strives for describing the build machinery at a sufficiently abstract +level that +enables interoperability with existing conventional frameworks, \eg{} +the GNU build framework. +The task is compounded by the fact that the existing \Tool{OpenAxiom} system +is complex and very poorly documented, with blatantly conflicting or +questionable codes. + +The \Tool{OpenAxiom} system is written for the most part in Lisp, or +thereof. That in itself is a great source of portability +problems\footnote{even after half a century of existence}, +let alone issues related to insulation from mainstream +development tools, dependence on particular Lisp implementation details, etc. +A tiny part of it, mainly the interface with host operating system, is +written in the C programming language. That does not improve on the +portability problems. Fortunately, there are well-supported, +widely used, widely available, well tested tools supporting +C-derived development environments across platforms. The GNU +\Tool{Autotools} being one of them. For the moment, we only make use of +the \Tool{Autoconf} component. This build machinery does not +use \Tool{Automake} and \Tool{Libtool}. People intending to modify +this part of the build machinery are expected to be familiar with +\Tool{Autotconf}. + +The \File{Makefile} pamphlets that compose the build machinery are +written in a way that abstracts platform idiosyncracies into +parameters. The purpose of the \File{configure.ac} script is to +find values for those parameters, on a given platform, necessary to +instantiate the \File{Makefile}s, and therefore to set up a concrete +build machinery. And that task must be accomplished portably. + +\section{Generalities on build instantiations} + +\subsection{Two actors} + +The instantiation of the abstract build machinery description requires +that we gather information from two platforms: +\begin{enumerate} +\item the \emph{build platform}, and +\item the \emph{host platform}. +\end{enumerate} + +The build platform is where we build the system, \eg{} where +the \File{configure} script is executed. The host platform +is where \Tool{OpenAxiom} will run. Note that in full generality, there is +a third platform: the \emph{target platform}. It is the plaform for which +we are building the system. + +For typical build instantiations, those three platforms are the same: we +call that a \emph{native build instantiation} or just \emph{native build}. +The OpenAxiom system only support native build at the moment, due to its +dependence on \Tool{GCL} which supports only native build. + +To facilitate the porting of programs across platforms, the GNU build +system has standardized on designation of platforms, called +\emph{configuration names}. A configuration name used to be +made of three parts\footnote{hence the term \emph{canonical triplet} in + earlier versions of \Tool{Autoconf}}: +\textsl{cpu--vendor--os}. Examples are +[[i686-pc-linux-gnu]], or [[sparc-sun-solaris2.8]]. + +The \textsl{cpu} +part usually designates the type of processor used on the platform. +Examples are [[i686]], or [[sparc]], or [[x86_64]]. + +The \textsl{vendor} part formally designates the manufacturer of +the platform. In many cases it is simply [[unknown]]. However, +in specific cases, you can see the name of a workstation vendor such +as [[sun]], or [[pc]] for an IBM PC compatible system. + +The \textsl{os} part can be either \textsl{system} (such as [[solaris2.8]]) +or \textsl{kernel--system} (such as [[linux-gnu]]). + +Here is how we get the canonical names for the above three platforms: +<<host build target platfoms>>= +AC_CANONICAL_SYSTEM +@ +After that call, the configuration names of the three platforms +are available in the shell variables [[build]], [[host]], and [[target]]. + +\subsubsection{Cross build} + +As we said earlier, a native build instantiation is one where all +[[build]], [[host]], and [[target]] have the same value. However, +when porting programs to other platforms, it is not always possible +to do a native build --- either because all the tools are not +available on that machine, or because it is much more convenient to +build the software on a faster machine. Both situations are quite +common. + +Those considerations bring us to the notion of cross build +instantiation (also called cross compilation). +We say that the build instantiation is a \emph{cross build} when +the build platform is different from the target platform; \eg{}, when +[[build]] $\neq$ [[target]]. + +For the moment, the \Tool{OpenAxiom} base source code is written +in a way that does not support cross build. However, we do +want to make cross build possible; consequently we issue +a warning when we detect attempt at cross build: +<<host build target platfoms>>= +if test $build != $target; then + AC_MSG_WARN([Cross build is not supported.]) + AC_MSG_WARN([Please notify axiom-developer@nongnu.org if you succeed.]) +fi +@ +Note that we do not stop the configuration process because we do seek +contributions for cross build support. + +Note that the shell variable [[cross_compiling]], +set by the \Tool{Autoconf} macro [[AC_PROG_CC]], indicates whether +the C compiler used is a cross compiler. + +\subsubsection{Canadian cross} + +As we said previously, most software don't care about the target +platform. But compilers do. And \Tool{OpenAxiom} does because, among +other things, it uses Lisp and C compilers, and it provides a Spad compiler. +Another type of build instantiation arises when the host platform +is different from the target platform. The resulting compiler +is called a \emph{cross compiler}. Please note the distinction here: +a compiler that is cross compiled with [[host]] $=$ [[target]] is +not a cross compiler; it is a \emph{native compiler}. +A cross compiler is one with [[host]] $\neq$ [[target]]. + +The type of the compiler should not be confused with the type of the +build instantiation. It perfectly makes sense to have a build +instantiation that cross builds a cross-compiler, \ie{} all three +platforms are different: This is called \emph{Canadian cross}. +The \Tool{OpenAxiom} system does not that support that level of +sophistication yet. Although we could test for Canadian cross build +at this point, we delay that check for when we look for a C compiler. + +\subsection{Directories for the build instantiation} + +Although \Tool{OpenAxiom} does not support cross build yet, let +alone Canadian cross, we want to make sure that we do not write +the build machinery in a way that actively unsupports +cross build. Consequently, in the build tree, we sequester +tools that we build and use on the build platform, +in sub-directories different from others. +<<host build target platfoms>>= +## Where tools for the build platform are sequestered +axiom_build_sharedir=$axiom_builddir/share +@ + +\section{Host characteristics} + +As mentioned in the introduction, a small part of \Tool{OpenAxiom} is +written in the C programming language. That C runtime support +can be decomposed in three components: +\begin{enumerate} +\item core runtime support, +\item graphics (including HyperDoc), and +\item terminal I/O. +\end{enumerate} + +\subsection{Core runtime} + +\subsubsection{Signals} + +The host platform must be able to handle signals. Although, this is +not strictly necessary, that is the way \Tool{OpenAxiom} source code +is currently written. We ask for a POSIX or ISO C semantics, though +we have a strong preference for POSIX-conformant semantics. + +<<C headers and libraries>>= +AC_CHECK_HEADERS([signal.h], + [], + [AC_MSG_ERROR([OpenAxiom needs signal support.])]) +AC_CHECK_DECLS([sigaction], [], [], + [#include <signal.h>]) +@ + + +\subsubsection{Files and directtories} + +Some parts of \Tool{OpenAxiom} manipulate files and directories. They +more or less directly reflect the underlying platform semantics. +For the moment, we require POSIX semantics, though that does not +seem necessary. That restriction should be removed as soon as possible. + +<<C headers and libraries>>= +AC_CHECK_HEADERS([sys/stat.h], + [], + [AC_MSG_ERROR([OpenAxiom needs <sys/stat.h>.])]) +AC_CHECK_HEADERS([unistd.h], [], + [AC_MSG_ERROR([OpenAxiom needs <unistd.h>])]) +AC_CHECK_DECLS([getuid, geteuid, getgid, getegid], [], [], + [#include <unistd.h>]) + +AC_CHECK_DECLS([kill], [], [], + [#include <signal.h>]) +@ + +\subsubsection{Sockets} + +The host environment must be capable of handling communication through +sockets. This is required for interfacing \Tool{AXIOMsys} +and \Tool{Superman}. Notice that ideally, we should decouple +that interface in such a way that we can still build \Tool{OpenAxiom} +when \Tool{Superman} is not needed or a socket library is not +available. + +<<C headers and libraries>>= +case $host in + *mingw*) + AC_CHECK_HEADERS([winsock2.h], + [axiom_host_has_socket=yes], + []) + axiom_c_runtime_extra="-lwsock32" + ;; + *) + AC_CHECK_HEADERS([sys/socket.h], + [axiom_host_has_socket=yes], + []) + ;; +esac +if test x$axiom_host_has_socket != xyes; then \ + AC_MSG_ERROR([OpenAxiom needs suport for sockets.]) +fi +## solaris-based systems tend to hide the socket library. +case $host in + *solaris*) + AC_SEARCH_LIBS([accept], [socket], + [axiom_c_runtime_extra="-lsocket"], + [AC_MSG_ERROR([socket library not found])]) + ;; + *) ;; +esac + +AC_SUBST(axiom_c_runtime_extra) + +AC_EGREP_HEADER([has_af_local], + [#if HAVE_SYS_SOCKET_H + # include <sys/socket.h> + #else + # include <winsock2.h> + #endif + #ifdef AF_LOCAL + has_af_local + #endif], + [AC_DEFINE([HAVE_AF_LOCAL], [1], [Host has AF_LOCAL])]) + + +AC_EGREP_HEADER([has_af_unix], + [#if HAVE_SYS_SOCKET_H + # include <sys/socket.h> + #else + # include <winsock2.h> + #endif + #ifdef AF_UNIX + has_af_unix + #endif], + [AC_DEFINE([HAVE_AF_UNIX], [1], [Host has AF_UNIX])]) + +@ + + +\subsection{Terminal I/O} + +<<C headers and libraries>>= +AC_CHECK_HEADERS([sys/wait.h]) + +if test x"$ac_cv_header_sys_wait_h" = xyes; then \ + AC_CHECK_DECLS([wait], + [], + [], + [#include <sys/wait.h>]) +fi + +AC_CHECK_DECLS([fork], + [], + [], + [#include <unistd.h>]) + +axiom_use_sman=yes +if test x"$ac_cv_have_decl_fork" = xyes \ + -a x"$ac_cv_have_decl_wait" = xyes; then \ + axiom_c_runtime="$axiom_c_runtime terminal_io" + axiom_src_all="$axiom_src_all all-sman all-clef" + axiom_src_subdirs="$axiom_src_subdirs clef sman" + AXIOM_MAKEFILE([src/clef/Makefile]) + AXIOM_MAKEFILE([src/sman/Makefile]) +else + axiom_use_sman=no + AC_MSG_NOTICE([Superman component is disabled.]) +fi + +axiom_src_all="all-input $axiom_src_all" +AC_SUBST(axiom_use_sman) +@ + + +\subsection{Graphics} + +\subsubsection{HyperDoc} + +The HyperDoc component needs string pattern matching. +We require [[<regex.h>]], with POSIX-conformant definition. We use +to key build of HyperDoc component on the availability of X11 +functionalities. That, however, is a severe restriction. Not all +of the HyperDoc components need X11. Some, such as [[htadd]], don't +need X11 at all. Therefore we have lifted part of the restrictions. +See \File{src/hyper/Makefile} for more details. Note that is we don't +build the HyperDoc component, the compilation of algebra files are +drawn in [[Unexpected HT command]] noise. +<<C headers and libraries>>= +AC_CHECK_HEADER([regex.h], + [axiom_src_all="$axiom_src_all all-hyper" + axiom_src_subdirs="$axiom_src_subdirs hyper" + AXIOM_MAKEFILE([src/hyper/Makefile])], + [AC_MSG_NOTICE([HyperDoc is disabled.])]) +@ + +\subsubsection{Where is X11?} + +One of the thorniest issues with programs that use the X Window System +is portability. There exist many implementations of the X11 +specification, each with its own variations, extensions, and what +not. Designing hand-written makefiles for such programs can be a +daunting task, fraut with all kinds of traps. Fortunately, \Tool{Autoconf} +provides us with some help, namely the macro [[AC_PATH_X]] and +[[AC_PATH_XTRA]]. The former searches the directories where the +X11 include files and the library files reside. The latter is an +enhanced version that +\begin{itemize} +\item computes the C compiler flags required by X11; +\item computes the linker flags required by X11; +\item checks for special libraries that some systems need in order to + compile X11 programs; +\item checks for special X11R6 libraries that need to be linked before + the flag [[-lX11]]. +\end{itemize} + +<<C headers and libraries>>= +AC_PATH_XTRA +## Output directives for the C compiler +AC_SUBST(X_CLFAGS) +## Output directives for the linker +AC_SUBST(X_LIBS) +## Output any extra libraries required by X11 +AC_SUBST(X_EXTRA_LIBS) + +## Finally, output the list of libraries that need to appear before -lX11 +## Some part of OpenAxiom depends on Xpm. That library has kind uncertain +## future. At some point in the past, it was deprecated, to be +## replaced by xpm-nox; then came back again. So, its support may +## vary from system to system. For the moment, we assume that if X11 +## is found then, Xpm is already present. Though, clearly that is a +## very optimistic assumption. Long term, OpenAxiom should get rid of +## dependence on Xpm. A nearly fool-proof test would be probably +## inspired by AC_PATH_XTRA. I don't have time to get to that +## complication right now. Will fix later. +X_PRE_LIBS="-lXpm $X_PRE_LIBS" +AC_SUBST(X_PRE_LIBS) + +## If the system supports X11, then build graphics +axiom_use_x=no +if test -z $no_x; then + axiom_use_x=yes + axiom_c_runtime="$axiom_c_runtime graphics" + axiom_src_all="$axiom_src_all all-graph" + axiom_src_subdirs="$axiom_src_subdirs graph" + AXIOM_MAKEFILE([src/graph/Makefile]) + AXIOM_MAKEFILE([src/graph/Gdraws/Makefile]) + AXIOM_MAKEFILE([src/graph/view2D/Makefile]) + AXIOM_MAKEFILE([src/graph/view3D/Makefile]) + AXIOM_MAKEFILE([src/graph/viewAlone/Makefile]) + AXIOM_MAKEFILE([src/graph/viewman/Makefile]) +else + AC_MSG_NOTICE([The Garphics component is disabled.]) +fi +AC_SUBST(axiom_src_all) +AC_SUBST(axiom_use_x) +@ + +\subsection{Lisp runtime} + +\subsubsection{Runtime checking} + +\Tool{OpenAxiom}'s Lisp runtime platform may instructed to perform +runtime checking. This may be useful when chasing Heinsenbugs. +It probably should be the default mode on development or experimental +branches. +<<runtime checking>>= +## Shall we proclaim safety? +axiom_enable_checking=no # don't turn on checking by default. +AC_ARG_ENABLE([checking], [ --enable-checking turn runtime checking on], + [case $enableval in + yes|no) axiom_enable_checking=$enableval ;; + *) AC_MSG_ERROR([erroneous value for --enable-checking]) ;; + esac]) +if test x"axiom_enable_checking" = xyes; then + AC_MSG_NOTICE([runtime checking may increase compilation time]) +fi +AC_SUBST(axiom_enable_checking) +@ + + +\Tool{GCL} relies on the libirary \Tool{BFD}, the include +headers of which may not exist (quite common). In order to avoid +\Tool{GCL} build failure, we test for the existence of [[<bfd.h>]] +and the corresponding library. We configure \Tool{GCL} to +use its own copy of \Tool{BFD} accordingly. FIXME: This must +be taken care of by \Tool{GCL} itself. +<<gcl options>>= +axiom_host_has_libbfd= +AC_CHECK_HEADER([bfd.h]) +AC_HAVE_LIBRARY([bfd], [axiom_host_has_libbfd=yes]) + +axiom_gcl_bfd_option= +if test x"$ac_cv_header_bfd_h" = xyes \ + && test x"$axiom_host_has_libbfd" = xyes; then + axiom_gcl_bfd_option="--disable-dynsysbfd" +else + axiom_gcl_bfd_option="--disable-statsysbfd --enable-locbfd" +fi +@ + +\Tool{GCL} has an elaborate memory management system and +\Tool{OpenAxiom} seems to +put ``unusual'' pressure on it. Here we specify some values that have +been empirically known to work. +<<gcl options>>= +# axiom_gcl_mm_option="--enable-maxpage=256*1024" +@ + +Furthermore, we don't need (at the moment) \Tool{GCL} to build support for +X Window system or TCL/TK: +<<gcl options>>= +axiom_gcl_x_option="--disable-tkconfig --disable-x --disable-xgcl" +@ + +Under some unusual circumstances, \Tool{GLC}'s \Tool{configure} will +fail to properly detect usable \Tool{Emacs} directories, and the +build will mysteriously fail later. We temporarily work +around that bug as follows: +<<gcl options>>= +axiom_gcl_emacs="--enable-emacs=correct" +@ + + +Other aspects depend on the platform being considered. + + +\Tool{OpenAxiom} source code had developed the appalling and irritating habit +of testing for +platforms, when in fact it is interested in functionalities. +The outcome is an ever-growing pile increasing disgusting hacks. +For example, most the XXXplatform below really have nothing to +do with platforms. + +<<platform specific bits>>= +<<gcl options>> + +PFL= +CCF="-O2 -fno-strength-reduce -Wall -D_GNU_SOURCE" +LDF= +LISP=lsp + +case $target in + *bsd*) + AC_DEFINE([BSDplatform], [], [BSD flavour]) + CCF="-O2 -pipe -fno-strength-reduce -Wall -D_GNU_SOURCE -I/usr/local/include" + LDF="-L/usr/local/lib" + ;; + windows) + AC_DEFINE([MSYSplatform], [], [MS]) + SRCDIRS=bootdir interpdir sharedir algebradir etcdir docdir inputdir + ;; + *linux*) + AC_DEFINE([LINUXplatform], [], [Linux flavour]) + ;; + *solaris*) + AC_DEFINE([SUNplatform], [], [SunOS flavour]) + ;; + powerpc*darwin*) + AC_DEFINE([MACOSXplatform], [], [MACOX flavour]) + CCF="-O2 -fno-strength-reduce -Wall -D_GNU_SOURCE \ + -I/usr/include -I/usr/include/sys" + axiom_gcl_bfd_option="--disable-statsysbfd \ + --enable-machine=powerpc-macosx" + axiom_gcl_mm_option="--enable-vssize=65536*2" + ;; +esac + +GCLOPTS="$axiom_gcl_emacs $axiom_gcl_bfd_option $axiom_gcl_mm_option $axiom_gcl_x_option" + +AC_SUBST(PLF) +AC_SUBST(CCF) +AC_SUBST(LDF) +AC_SUBST(LISP) +AC_SUBST(GCLOPTS) +@ + +The C preprocessor symbols [[BSDplatform]], [[LINUXplatform]], etc. are being +used as ``catch all'' for unstructured codes. They should be +removed from the source base. Any source file using those should be +properly documented as its needs are, and a narrowed, specific configure +test should be added. + + +\section{The build platform} + +\subsection{Build utilities} +Most of the tools we're testing for are with respect to the build +environment. However, notice that since we only support \emph{native} +build at the moment, the tests are also for the host and target +platforms. +<<build utils>>= +## Accumulate list of utils needed for the build platform +## It is vital that noweb is present in the build environement. +axiom_all_prerequisites= + +<<find make>> + +<<find C compiler>> + +<<file utils>> + +<<awk and tar program>> + +<<binary utils>> + +<<doc utils>> + +<<find lisp>> +<<lisp options>> +<<compiled lisp extension>> + +AC_SUBST(axiom_all_prerequisites) +@ + +The next paragraphs detail each of the cluster of build utilities +[[configure]] looks for. + +\paragraph{The \Tool{Make} program.} + +Of course, no build can proceed with \File{Tool} inexisting from +the build-environment. We insist on GNU \Tool{Make} program as there +are way too many variations, way too many incompatible implementations +and extensions. Please, note that this requirement just reflects +\Tool{OpenAxiom}'s dependencies on external toos: \Tool{OpenAxiom} relies on +\Tool{GCL}, which in turn uses \Tool{GCC}. Building \Tool{GCC} requires +\Tool{GNU Make}, and \Tool{GCL} itself requires \Tool{GNU Make}. +<<find make>>= +case $build in + *linux*) + # GNU/Linux systems come equipped with GNU Make, called `make' + AC_CHECK_PROGS([MAKE], [make], + [AC_MSG_ERROR([Make utility missing.])]) + ;; + *) + # Other systems tend to spell it `gmake' and such + AC_CHECK_PROGS([MAKE], [gmake make], + [AC_MSG_ERROR([Make utility missing.])]) + if ! $MAKE --version | grep 'GNU' 2>/dev/null; then + AC_MSG_ERROR([OpenAxiom build system needs GNU Make.]) + fi + ;; +esac +@ + +\paragraph{C compiler} +First of all, check for a C compiler. As written, this test is OK +because currently we support only native builds. However, + it needs to be more carefully written when we move to cross-compilation. +OpenAxiom, in its current form, cannot be compiled with a C compiler +other than from GNU. We take that as a requirement. +<<find C compiler>>= +## Make sure the C compiler is from GCC +AC_PROG_CC +if test x$GCC != xyes; then + AC_MSG_ERROR([We need a C compiler from GCC]) +fi +axiom_cflags="-O2 -fno-strength-reduce -Wall -D_GNU_SOURCE" +AC_SUBST(axiom_cflags) + +## What is the extension of object files on this platform? +AC_OBJEXT +@ + +\paragraph{File utils} +Then, check for a usable [[install]] program. Also, find out +way to hard- or soft-link files. + +After a recent migration to +\Tool{Autoconf-2.60}, it turns out that all possibilities of +soft-linking are tried (to ``play safe''), and if any variation +fails then, [[LN_S]] is defined to [[cp -p]], which works +only for files as sources. But, the only way we currently +use [[LN_S]] is when the first argument is a directory. So, the +``portability help'' we get from \Tool{Autoconf} is no help. +Consequently, the test for +[[ln -s]] is commented out for the moment. +<<file utils>>= +AC_PROG_INSTALL +# AC_PROG_LN_S +AC_CHECK_PROG([TOUCH], [touch], + [touch], [AC_MSG_ERROR(['touch' program is missing.])]) +AC_CHECK_PROGS([MKTEMP], [mktemp]) +@ + +\paragraph{The [[awk]] program} +The old build machinery needs 'awk'. Currently, it checks for +'gawk', 'nawk', and 'awk'. Autoconf has a predefined test for that +task. It checks for 'gawk', 'mawk', 'nawk', and 'awk' in that order. +That should be OK and match OpenAxiom's need. + +The old build system claims that on solaris9, gawk, gtar +and gpatch are required (with no much explanation of why). Notice +that these programs are needed only to build OpenAxiom; so we do +check based on the value of [[build]]. +<<awk and tar program>>= +case $build in + *-solaris9) + AC_CHECK_PROG([AWK], [gawk], + [gawk], [AC_MSG_ERROR([OpenAxiom needs gawk])]) + + AC_CHECK_PROG([PATCH], [gpatch], + [gptach], [AC_MSG_ERROR([OpenAxiom needs gpatch])]) + ;; + + *) + AC_PROG_AWK + + AC_CHECK_PROGS([PATCH], [gpatch patch], + [AC_MSG_ERROR([OpenAxiom needs a patch program])]) + ;; +esac +@ + +\paragraph{Binary utils.} + +We need to know how to put object files into archives. +<<binary utils>>= +AC_CHECK_PROG([AR], [ar], [ar], [AC_MSG_ERROR([program 'ar' is missing])]) +@ + +\paragraph{Doc utils.} + +OpenAxiom sources is literate, and it uses the \Tool{noweb} technology. +\Tool{noweb} is used to extract both the actual source code from the +pamphlet files, and the documentation as \LaTeX{} source files. +There are many platforms on which \Tool{noweb} is inexistent. OpenAxiom source +repository used to cache a copy of \Tool{noweb}. We now require +that an external [[noweb]] executable. +% +<<doc utils>>= +AC_PATH_PROG([LATEX], [latex]) +AC_CHECK_PROG([MAKEINDEX], [makeindex]) +if test -n "$LATEX"; then \ + axiom_src_all="$axiom_src_all all-book" + axiom_src_subdirs="$axiom_src_subdirs booklets" + AXIOM_MAKEFILE([src/booklets/Makefile]) +else + AC_MSG_NOTICE([Documentation is disabled.]) +fi + +## --------------------------------------- +## Make sure noweb executable is available +## --------------------------------------- +AC_CHECK_PROGS([NOTANGLE], [notangle]) +AC_CHECK_PROGS([NOWEAVE], [noweave]) + +## In case noweb is missing we need to build our own. +if test -z $NOTANGLE -o -z $NOWEAVE ; then + AC_MSG_NOTICE([OpenAxiom requires noweb utilties]) + AC_MSG_ERROR([Please install noweb and reconfigure]) +fi +@ + +\paragraph{The Lisp platform.} + +\Tool{OpenAxiom} uses Lisp as its main platform. If no Lisp implementation +is available in the build environment (or if \Tool{OpenAxiom} is told not +to look for one) then \Tool{OpenAxiom} must build its own version from the +copy of \Tool{GCL} sources it keeps in the \File{gcl/} directory. +<<find lisp>>= +## ------------------------ +## -- Which Lisp to use? -- +## ------------------------ +## +## We will default to GCL later, if no lisp implementation is specified. +axiom_lisp= +axiom_lisp_flavor=unknown +AC_ARG_WITH([lisp], [ --with-lisp=L use L as Lisp platform], + [axiom_lisp=$withval]) +@ + +The [[configure]] option \verb!--with-lisp=L! specifies which +Lisp implementation flavor to use for building OpenAxiom. For all values +of [[L]], except \Tool{GCL}, the assumption is that the Lisp +image [[L]] is available in the build environment. For \Tool{GCL}, +we make an exception: if no GCL image is available, or if +the option \verb!--enable-gcl! is specified then \Tool{OpenAxiom} +builds its own version from the source tree. +<<find lisp>>= +## If --enable-gcl is specified, we need to check for coonsistency +axiom_include_gcl= +if test -z $axiom_lisp; then + AC_ARG_ENABLE([gcl], [ --enable-gcl build GCL from OpenAxiom source], + [case $enableval in + yes|no) axiom_include_gcl=$enableval ;; + *) AC_MSG_ERROR([erroneous value for --enable-gcl]) ;; + esac]) +fi +@ + +Do we need to build our own version of \Tool{GCL}? The answer is yes, if +\begin{itemize} +\item the option \verb!--with-lisp! is not specified, and +\item no \Tool{GCL} image is available in the build environment. +\end{itemize} +Consequently, we need to check for \Tool{GCL}: +<<find lisp>>= +## We need to build our own GCL is none is avalaible +if test -z $axiom_lisp; then + AC_PATH_PROG([AXIOM_LISP], [gcl]) + axiom_lisp=$AXIOM_LISP +else + ## Honor use of Lisp image specified on command line + AXIOM_LISP=$axiom_lisp + AC_SUBST(AXIOM_LISP) + : +fi +@ + +We may be presented with incoherent options if +\begin{itemize} +\item \verb!--disable-gcl! is used without specifying a Lisp image, or +\item \verb!--with-lisp! is used but we are also told to build \Tool{GCL}. +\end{itemize} +<<find lisp>>= +## Coherence check for GCL inclusion. +case $axiom_include_gcl,$axiom_lisp in + ,|no,|yes*) + ## It doesn't make sense not to include GCL when no Lisp image + ## is available. Give up. + if test $axiom_include_gcl,$AXIOM_LISP = no,; then + AC_MSG_ERROR([--disable-gcl specified but no GCL image found]) + fi + + ## No Lisp image was specified and none was available from + ## the build environment; build GCL from OpenAxiom source. + AXIOM_LISP='$(axiom_build_bindir)/gcl' + axiom_all_prerequisites="$axiom_all_prerequisites all-gcl" + axiom_include_gcl=yes + axiom_lisp_flavor=gcl + axiom_fasl_type=o + ;; + yes,*) + AC_MSG_ERROR([--with-lisp=$axiom_lisp conflicts with --enable-gcl]) + ;; + *) + ## As of this writting, the Lisp systems ECL, GCL, and SBCL all + ## understands the command line option --help, though they do + ## behave very differently. Some of them just print out the + ## help information and exits. Others, such as GCL, think they + ## must enter a read-eval-print loop (which isn't very helpful). + AC_MSG_CHECKING([which flavor of Lisp]) + what=`echo '(quit)' | $axiom_lisp --help` + case $what in + *GCL*) + axiom_lisp_flavor=gcl + ;; + *ecl*) + axiom_lisp_flavor=ecl + ;; + *sbcl*) + axiom_lisp_flavor=sbcl + ;; + *CLISP*) + axiom_lisp_flavor=clisp + ;; + esac + AC_MSG_RESULT([$axiom_lisp_flavor]) +esac +AC_SUBST(axiom_include_gcl) +AC_SUBST(axiom_lisp_flavor) + +## The following is a horrible to arrange for GCL to successfully +## rebuild symbol tables with "rsym" on Windows platform. It should +## go away as soon as GCL upstream is fixed. +case $axiom_lisp_flavor,$target in + gcl,*mingw*) + axiom_gcl_rsym_hack='d=`echo "(format nil \"~a\" si::*system-directory*)" | $(AXIOM_LISP) | grep "/gcl.*/" | sed -e "s,\",,g"`; cp $$d/rsym$(EXEEXT) .' + ;; + *) + axiom_gcl_rsym_hack=':' + ;; +esac +AC_SUBST(axiom_gcl_rsym_hack) +@ + +\paragraph{Lisp system options.} Lisp implementations greatly vary in +the command line options they support. Here we attempt to abstract +over those variations of Lisp systems we plan to support. In particular, +we need to know how to iinvoke a Lisp compiler with a set of +files to process in batch mode. +<<lisp options>>= +## How are we supposed to tell the Lisp system to eval an expression +## in batch mode? What is the extension of a compiled Lisp file? +case $axiom_lisp_flavor in + gcl) + axiom_quiet_flags='-batch' + axiom_eval_flags='-eval' + ;; + ecl) + axiom_quiet_flags= + axiom_eval_flags='-eval' + ;; + sbcl) + axiom_quiet_flags='--noinform --noprint' + axiom_eval_flags='--eval' + ;; + clisp) + axiom_quiet_flags='--quiet' + axiom_eval_flags='-x' + ;; + *) AC_MSG_ERROR([We do not know how to build OpenAxiom this $axiom_lisp]) ;; +esac +AC_SUBST(axiom_quiet_flags) +AC_SUBST(axiom_eval_flags) +@ + +\paragraph{Compiled Lisp file extensions.} +The file extension for compiled Lisp files is implementation defined. +There does not seem to have an established existing practice as would +be found in the majority of Unix world. Consequently we need to +determine that by looking at the Lisp type of the pathname that +Lisp's [[compile-file]] would produce. +<<compiled lisp extension>>= +if test -z $axiom_fasl_type; then + AC_MSG_CHECKING([compiled Lisp file extension]) + ## We set the IFS to <space> as we don't want automatic + ## replacement of <newline> by <space>. + axiom_save_IFS=$IFS + IFS=' ' + axiom_fasl_type=`$axiom_lisp $axiom_quiet_flags $axiom_eval_flags '(progn (format t "axiom_fasl_type=~a" (pathname-type (compile-file-pathname "foo.lisp #+:ecl :type #+:ecl :object"))) (quit))'` + + ## Now pull out the fasl type. ECL has the habit of spitting noise + ## about internal loading. Therefore, we must look only for a line that + ## begins with axiom_fasl_type. + axiom_fasl_type=`echo $axiom_fasl_type | grep '^axiom_fasl_type'` + IFS=$axiom_save_IFS + axiom_fasl_type=`echo $axiom_fasl_type | sed -e 's/axiom_fasl_type=//'` + if test -z $axiom_fasl_type; then + AC_MSG_ERROR([Could not determine extension for compiled Lisp files]) + fi + AC_MSG_RESULT([$axiom_fasl_type]) +fi +AC_SUBST(axiom_fasl_type) +@ + + +\section{Configuration options} +\label{sec:config-options} + +We strive for making \Tool{OpenAxiom}'s build system integrate as seamlessly as +possibly into the standard GNU build framework. + +\subsection{Standard options} +\label{sec:config-options:std} + +At the moment, we honor the following options: +\begin{description} +\item \verb!--prefix!: + By default, \Tool{OpenAxiom}'s build system will install files + in ``\File{/usr/local}''. However, you + can select a different location prefix using this option. + +\item \verb!--with-x!: + +\item \verb!--x-includes=DIR! + +\item \verb!--x-libraries=DIR! + +\item \verb!--help! + +\item \verb!--version! +\end{description} + + +\subsection{\Tool{OpenAxiom}-specific options} +\label{sec:config-options:axiom-specific} + +\begin{description} +\item \verb!--enable-gcl!: + \Tool{OpenAxiom} needs an implementation of Lisp to support its + runtime system. At the moment, GNU Common Lisp (\Tool{GCL} for short) + is used. This options instructs \Tool{OpenAxiom} to build its own copy + of \Tool{GCL}. Use \verb!--disable-gcl! to prevent OpenAxiom + from building \Tool{GCL}. + +\item \verb!--with-lisp=L!: + instructs \Tool{OpenAxiom} to use the Lisp image [[L]] for its + runtime platform. + +\item \verb!--enable-checking!: + instructs \Tool{OpenAxiom}'s Lisp image to perform runtime checking + for generated Lisp codes. +\end{description} + +\section{Basic Setup} +\label{sec:basic-setup} + +\subsection{\Tool{Autoconf} Initialization} +\label{sec:basic-setup:init} + +The \Tool{Autoconf} machinery needs to be initialized with several pieces of +information: +\begin{itemize} +\item the \emph{name} of the system --- ``OpenAxiom 1.0.0'' +\item its \emph{version}. I choose to use the date of last checkin. + It should probably include the revision number so as to + unambiguously identify which \Tool{OpnAxiom} flavour du jour is being + built; +\item and where to send feedback, \emph{e.g.} bug reports. At the moment, + we use + the \email{open-axiom-devel} list. That could change in the future if + we reach a high volume traffic. For the moment, we don't seem to + suffer from traffic... +\end{itemize} +<<Autoconf init>>= +sinclude(config/open-axiom.m4) +sinclude(config/aclocal.m4) +AC_INIT([OpenAxiom 1.0.0 (experimental)], [2007-08-23], + [open-axiom-devel@lists.sf.org]) +@ + +\Tool{Autoconf} needs some auxilary files that are present in the +sub-directory \File{config}: +<<Autoconf init>>= +AC_CONFIG_AUX_DIR(config) +AC_CONFIG_MACRO_DIR(config) +@ + +Not all platforms present the same operating system API to applications. +For the part of \Tool{OpenAxiom} written in the C programming language, we +can collect, in a single file, variabilities in operating system +API in form of C preprocessor macros. That file is for the most part +automatically generated by \Tool{Autoheader}. +<<Autoconf init>>= +AC_CONFIG_HEADERS([config/axiom-c-macros.h]) +@ + +Note that at configuration time, \Tool{configure} will instantiate a +file \File{config/axiom-c-macros.h} in the directory [[$(top_builddir)]], +appropriate for all C sub-parts of \Tool{OpenAxiom} to include. + + +Notice that since we don't use Automake (yet), we don't initialize +the Automake subsystem. +<<Autoconf init>>= +# AM_INIT_AUTOMAKE([foreign]) +@ + +We require Autoconf $2.60$ or higher from the developer part. Please, +note that this is no requirement on the user build environment. All, +it means is that if someone makes changes to the current \File{configure.ac} +file, that someone needs to have Autoconf $2.60$ or higher to process this +file in order to regenerate \File{configure}. +<<Autoconf init>>= +AC_PREREQ([2.60]) +@ + + +\subsection{Source tree sanity check} +\label{sec:basic-setup:sanity-check} + +The \Tool{Autoconf} system implements a very basic, simple-minded, +sanity check +whereby it will refuse to run \File{configure} if the source tree does +not contain a specified file, that serves a witness for a bona fide source +tree. Here, we use \File{Makefile.pamphlet} from the \File{src} +subdirectory. +<<sanity check>>= +AC_CONFIG_SRCDIR(src/Makefile.pamphlet) +@ + + + +\subsubsection{The [[AXIOM]] variable} + +The OpenAxiom source files (especially the source files for the +interpreter) use the environment variable [[AXIOM]] in a very +pervasive way. That variable needs to be set before the +build start --- or else, it will fail. + +\subsubsection{Instantiating configuration files} + +<<instantiate config files>>= +AXIOM_MAKEFILE([Makefile]) +AXIOM_MAKEFILE([src/Makefile]) +AXIOM_MAKEFILE([src/lib/Makefile]) +AXIOM_MAKEFILE([src/lisp/Makefile]) +AXIOM_MAKEFILE([src/boot/Makefile]) +AXIOM_MAKEFILE([src/interp/Makefile]) +AXIOM_MAKEFILE([src/share/Makefile]) +AXIOM_MAKEFILE([src/algebra/Makefile]) +AXIOM_MAKEFILE([src/input/Makefile]) +AXIOM_MAKEFILE([src/etc/Makefile]) +AXIOM_MAKEFILE([src/doc/Makefile]) +AC_CONFIG_FILES([src/scripts/axiom], [chmod +x src/scripts/axiom]) + + +## We now generate the "document" script and support files at configure time. +## We put them in the build directory because they are intended to be +## build support utils only. +AC_CONFIG_FILES(build/scripts/document:$srcdir/src/scripts/document.in, \ + [chmod +x build/scripts/document]) + +AC_OUTPUT + +## Generate rules for Algebra bootstrap files. +echo -n "building list of Algebra bootstrap files..." +egrep ".*BOOTSTRAP>>=" $srcdir/src/algebra/*.spad.pamphlet \ + | sort | uniq | \ + while IFS=':' read spad_file chunk_desc; do + chunk_desc=`echo $chunk_desc | sed -e 's,@<<,,' -e 's,>>=,,'` + set $chunk_desc; bootstrap_file=$1 + cat >> src/algebra/tmp-extract-lisp-files.mk <<EOF +$bootstrap_file: \$(srcdir)/`basename $spad_file`; \ + \$(EXTRACT_BOOTSTRAP_FILE) +EOF + done +echo done +$srcdir/config/move-if-change \ + src/algebra/tmp-extract-lisp-files.mk \ + src/algebra/extract-lisp-files.mk + +## Generate rules to extrad SPAD type definitions from pamphlets. +echo -n "extracting list of SPAD type definitions..." +egrep '@<<(category|domain|package) .*>>=' \ + $srcdir/src/algebra/*.spad.pamphlet \ + | sort | uniq | \ + while IFS=':' read spad_file chunk_desc; do + chunk_desc=`echo $chunk_desc | sed -e 's,@<<,,' -e 's,>>=,,'` + set $chunk_desc; spad_abbrev=$2 + cat >> src/algebra/tmp-extract-spad.mk <<EOF +$spad_abbrev.spad: \$(srcdir)/`basename $spad_file` ; \ + @\$(axiom_build_document) --output=\$@ --tangle="$chunk_desc" \$< +EOF + done +echo done +$srcdir/config/move-if-change \ + src/algebra/tmp-extract-spad.mk src/algebra/extract-spad.mk + +@ + +\section{Dynamic and shared libraries} + +We need to link some C object files into in the Lisp images we +use. Some Lisps (e.g. GCL, ECL) support inclusion of ``ordinary'' +object files. Other Lisps (e.g. SBCL) support only dynamic +or shared libraries. However, the exact minutia of portably +building shared libraries are known to be fraught with all kinds +of traps. Consequently, dedicated tools have been developed to +abstract away from those details. In particular, we rely on +GNU \Tool{libtool} to take care of that for us. +<<initialize shared libraries tool>>= +AC_PROG_LIBTOOL +AC_SUBST(LIBTOOL_DEPS) +@ + +\section{configure.ac} + +<<*>>= +<<Autoconf init>> + +<<sanity check>> + +<<initialize shared libraries tool>> + +<<runtime checking>> + +axiom_src_subdirs="lib lisp boot interp share algebra input etc doc" +AC_SUBST(axiom_src_subdirs) + +<<host build target platfoms>> + +<<build utils>> + +# FIXME: Move this out of here. +# The core runtime is always built. +axiom_c_runtime=core +AC_SUBST(axiom_c_runtime) + +<<C headers and libraries>> + +<<platform specific bits>> +<<instantiate config files>> +echo "Type '${MAKE}' (without quotes) to build OpenAxiom" +@ + + +\section{A note about comments} +\label{sec:comment} + +This is a pamphlet file. That means the source code embedded here +are first extracted into a form (\File{configure.ac}) digestible by +\Tool{Autoconf}, which in turn produces the end-user \File{configure} +script run for setting up the build. + +\Tool{Autoconf} supports two kinds of comments: +\begin{enumerate} +\item [[dnl]] style, and +\item [[#]] style. +\end{enumerate} +Comments introduced with [[dnl]] are copied verbatim to the generated +\File{configure.ac}; however, do not appear in the \File{configure} +output file. They are for \Tool{Autoconf} consumption only --- and that +of the humans reading \File{configure.ac} (ideally, there should be none). +Comments starting with [[#]] appear verbatim in both \File{configure.ac} +and \File{configure} files. Because this is a pamphlet file, there almost +never is a need to use the [[dnl]]-style comment. +Consequently, \Tool{Autoconf} comments in this file should be +of [[#]]-style form. Such comments can be of value to the occasional +poor masochist who will be debugging the generated \File{configure}. + + +\end{document} + |