%% Oh Emacs, this is a -*- Makefile -*-, so give me tabs.
\documentclass{article}
\usepackage{axiom}

\title{\File{src/lisp/Makefile} Pamphlet}
\author{The Axiom Team}

\begin{document}
\maketitle

\begin{abstract}
\end{abstract}
\eject

\tableofcontents
\eject

\section{The Makefile}

The purpose of this Makefile is to create a fresh Lisp image, [[$(OUT)/lisp]],
for use to make \Tool{interpsys} and \Tool{AXIOMsys}.  To that end, 
it augments an existing Lisp image, at the moment \Tool{GCL}, with 
some specific C-routines. 

\section{The Makefile}

<<build augmented lisp>>=
## Create a fresh image for building interpsys and AXIOMsys
## These objects files are the C runtime support
## and must be compiled into the Lisp image,
## as they must be present in the final interpreter
## and image.
lisp_c_objects = \
		$(build_libdir)/bsdsignal.$(COBJEXT) \
		$(build_libdir)/cfuns-c.$(COBJEXT) \
		$(build_libdir)/sockio-c.$(COBJEXT)

$(OUT)/lisp$(EXEEXT): base-lisp$(EXEEXT)
ifeq (@axiom_lisp_flavor@,gcl)
	@axiom_gcl_rsym_hack@
	echo '(let* ((sys-cc compiler::*cc*) ' \
	     '      (sys-ld compiler::*ld*) ' \
	     '      (compiler::*cc* (concatenate (quote string) ' \
	     '                                   $(GCL_LTCC)    ' \
	     '                                   sys-cc))       ' \
	     '      (compiler::*ld* (concatenate (quote string) ' \
	     '                                   $(GCL_LTLD)    ' \
	     '                                   sys-ld)))       ' \
             '(compiler::link (quote ($(FASLS))) "lisp$(EXEEXT)" ' \
             ' (format nil "(progn (let ((*load-path* (cons ~S *load-path*))'\
                                        ' (si::*load-types* ~S))' \
                                       ' (compiler::emit-fn t))' \
                                  ' (when (fboundp (quote si::sgc-on))' \
                                        ' (si::sgc-on nil))' \
				  ' (setq si::*top-level-hook* (read-from-string \"|AxiomCore|::|topLevel|\")))"' \
                      ' si::*system-directory* (quote (list ".lsp")))' \
               '  "$(lisp_c_objects) @axiom_c_runtime_extra@"))' \
            | ./base-lisp$(EXEEXT)
	$(mkinstalldirs) $(OUT)
	$(INSTALL_PROGRAM) lisp$(EXEEXT) $(OUT)
endif


base-lisp$(EXEEXT): core.$(FASLEXT)
	$(AXIOM_LISP) \
		$(eval_flags) '(load "core")' \
		$(eval_flags) '(|AxiomCore|::|link| "$@" (quote nil) (function |AxiomCore|::|topLevel|))'

core.lisp: $(srcdir)/core.lisp.in
	cd $(top_builddir) && \
	$(SHELL) ./config.status src/lisp/core.lisp

core.$(FASLEXT): core.lisp
	$(AXIOM_LISP) $(quiet_flags) \
		$(eval_flags) '(progn #-:ecl (compile-file "$<"))' \
		$(eval_flags) '(progn #+:ecl (progn (require (quote cmp)) (compile-file "$<" :system-p t) (c::build-fasl "$@" :lisp-files (quote ("core.$(OBJEXT)")))))' \
		$(eval_flags) '(quit)'

@

<<*>>=
OUT = $(axiom_build_bindir)

subdir = src/lisp/

pamphlets = Makefile.pamphlet

build_libdir = ./$(top_builddir)/src/lib

lisp_DEPENDENCIES = $(build_libdir)/cfuns-c.lo \
		    $(build_libdir)/sockio-c.lo \
		    $(build_libdir)/libspad.la


## Ideally, we would like to use Libtool for producing, and linking with,
## object files from C codes.  That means any C source code
## explicitly included in OpenAxiom, or produced internally by a Lisp
## compiler.  However, the SYSTEM calls by GCL on Windows is very tricky
## to convince to properly resolve path names to executables.
## Consequently we temporarily give up here, e.g., we don't
## instruct GCL to use Libtool on Windows.
GCL_LTCC = $(if $(findstring mingw, $(target)),"","$(LIBTOOL) --mode=compile ")
GCL_LTLD = $(if $(findstring mingw, $(target)),"","$(LIBTOOL) --mode=link ")
COBJEXT = $(if $(findstring mingw, $(target)),$(OBJEXT),lo)

## Again, ideally, we would like GCL to link with the compiled Lisp
## code from core.lisp.  However, the general interface compiler::link
## that GCL provides for that task is unsupported on Windows platforms.
## So, we instruct GCL so load the source file instead.
fasl_ext = $(if $(findstring mingw, $(target)),.lisp,.$(FASLEXT))
FASLS = $(patsubst %,"%", $(addsuffix $(fasl_ext),core))

.PHONY: all all-lisp
all: all-ax all-lisp

all-ax all-lisp: stamp

stamp: $(OUT)/lisp$(EXEEXT)
	@rm -f stamp
	$(STAMP) $@

<<build augmented lisp>>

mostlyclean-local:
	rm -f *.$(FASLEXT)
	@rm -f $(OUT)/lisp$(EXEEXT) lisp$(EXEEXT)
	@rm -f stamp

clean-local: mostlyclean

distclean-local: clean-local
	@rm -f Makefile
@

\eject
\begin{thebibliography}{99}
\bibitem{1} nothing
\end{thebibliography}
\end{document}