diff options
Diffstat (limited to 'src/boot/Makefile.am')
-rw-r--r-- | src/boot/Makefile.am | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/src/boot/Makefile.am b/src/boot/Makefile.am new file mode 100644 index 00000000..b24e923e --- /dev/null +++ b/src/boot/Makefile.am @@ -0,0 +1,242 @@ +# Copyright (c) 1991-2002, The Numerical Algorithms Group Ltd. +# All rights reserved. +# Copyright (C) 2007-2014, Gabriel Dos Reis. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# - Neither the name of The Numerical ALgorithms Group Ltd. nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +# +# Abstract: +# OpenAxiom is built in layers. The first layer is contructed into +# an image called `bootsys'. The `bootsys' image is used +# to translate Boot code to Common Lisp code. Since a Boot coded +# interpreter is needed to translate the code for the Boot coded +# interpreter we have a ``boot-strapping'' problem. In order to get +# the whole process to start we need certain files kept in +# common lisp form. This directory contains those files. +# + +# We start with a Lisp image created in a previous build step (src/lisp). +# That image is used to build Boot translator executable through the +# entire bootstrap process. + +DRIVER = $(top_builddir)/src/driver/open-axiom$(EXEEXT) +OA_LISPSYS = $(oa_target_bindir)/lisp$(EXEEXT) + +# Command used to link FASLs to produce a final executable. +LISP_LINK = \ + $(DRIVER) --execpath=$(OA_LISPSYS) --make \ + --main="|AxiomCore|::|topLevel|" --system=$(oa_targetdir) \ + --prologue='(pushnew :open-axiom-boot *features*)' + +# We use a noinst_ primary because we take care of installation +# procedure ourselves. +noinst_PROGRAMS = bootsys + +bootsys_SOURCES = \ + utility.boot \ + tokens.boot \ + includer.boot \ + scanner.boot \ + pile.boot \ + ast.boot \ + parser.boot \ + translator.boot + +oa_target_bootdir = $(oa_targetdir)/boot +if OA_ECL_RT +oa_bootsys_linkset = $(oa_target_bootdir)/linkset +else +oa_bootsys_linkset = +endif + +bootsys_DEPENDENCIES = stage2/bootsys$(EXEEXT) $(oa_bootsys_linkset) + +# FASLs that comprises `bootsys' +bootsys_clisp = $(bootsys_SOURCES:.boot=.clisp) +bootsys_objects = $(bootsys_SOURCES:.boot=.$(LNKEXT)) + +# Garbage produced by GCL during compilation +bootsys_data = $(bootsys_SOURCES:.boot=.data) +bootsys_fn = $(bootsys_SOURCES:.boot=.fn) + +STAMP = touch + +# Make rule toplevel entry points. +.PHONY: all-boot + +all-am: all-boot +all-boot: $(oa_target_bindir)/bootsys$(EXEEXT) $(oa_bootsys_linkset) + +# The final `bootsys' image. +$(oa_target_bindir)/bootsys$(EXEEXT): stage2/bootsys$(EXEEXT) + cp -p $< $@ + +$(oa_bootsys_linkset): $(addprefix $(oa_target_bootdir)/, $(bootsys_objects)) + rm -f $@ + echo '($(patsubst %, "%", $(bootsys_objects)))' > $@ + +$(oa_target_bootdir)/%.$(LNKEXT): stage2/%.$(LNKEXT) $(oa_target_bootdir) + cp $< $@ + +$(oa_target_bootdir): + $(mkdir_p) $(oa_target_bootdir) + +.PRECIOUS: strap/%.$(FASLEXT) +.PRECIOUS: strap/%.$(LNKEXT) + +# +# The bootstrapping `bootsys' image. +# + +# The bootstrapping Lisp code is cached in the subdirectory strap/. +# It is built first, followed by stage 1, and stage 2 `bootsys' images. +strap_bootsys_clisp = $(addprefix strap/, $(bootsys_clisp)) + +strap_bootsys_objects = \ + $(addprefix strap/, $(bootsys_objects)) + +strap/stamp: strap/bootsys$(EXEEXT) + @rm -f $@ + @$(STAMP) $@ + +strap/bootsys$(EXEEXT): $(strap_bootsys_objects) + $(LISP_LINK) --output=$@ \ + --load-directory=strap $(strap_bootsys_objects) + +$(strap_bootsys_objects): $(OA_LISPSYS) + +# +# Stage 1 `bootsys' image. +# + +.PRECIOUS: stage1/%.$(FASLEXT) +.PRECIOUS: stage1/%.$(LNKEXT) +.PRECIOUS: stage1/%.clisp + +stage1_bootsys_clisp = $(addprefix stage1/, $(bootsys_clisp)) + +stage1_bootsys_objects = \ + $(addprefix stage1/, $(bootsys_objects)) + +stage1/stamp: stage1/bootsys$(EXEEXT) + rm -f $@ + $(STAMP) $@ + +stage1/bootsys$(EXEEXT): $(stage1_bootsys_objects) + $(LISP_LINK) --output=$@ \ + --load-directory=stage1 $(stage1_bootsys_objects) + +stage1/%.clisp: %.boot strap/stamp stage1/.started + $(DRIVER) --execpath=strap/bootsys$(EXEEXT) --translate --import=skip --output=$@ $< + + +# +# Stage 2 `bootsys' image. +# + +.PRECIOUS: stage2/%.$(FASLEXT) +.PRECIOUS: stage2/%.$(LNKEXT) +.PRECIOUS: stage2/%.clisp + +stage2_bootsys_clisp = $(addprefix stage2/, $(bootsys_clisp)) + +stage2_bootsys_objects = \ + $(addprefix stage2/, $(bootsys_objects)) + +stage2/stamp: stage2/bootsys$(EXEEXT) + @echo Building stage 2 + $(STAMP) $@ + +stage2/bootsys$(EXEEXT): $(stage2_bootsys_objects) + $(LISP_LINK) --output=$@ \ + --load-directory=stage2 $(stage2_bootsys_objects) + +stage2/%.clisp: %.boot stage1/stamp stage2/.started + $(DRIVER) --execpath=stage1/bootsys$(EXEEXT) --translate --import=skip --output=$@ $< + +# +# Generic rules for compiling FASLs +# + +.PRECIOUS: %/.started +%/.started: + $(mkdir_p) $* + $(STAMP) $@ + +# Dependency for various modules. +# FIXME: This should be automatically extracted from the +# Boot source file at packaging time. +LISP_COMPILE = \ + $(DRIVER) --execpath=$(OA_LISPSYS) --output=$@ --compile + +%/utility.$(LNKEXT): %/utility.clisp %/.started + $(LISP_COMPILE) --load-directory=$* $< + +%/tokens.$(LNKEXT): %/tokens.clisp %/utility.$(LNKEXT) + $(LISP_COMPILE) --load-directory=$* $< + +%/includer.$(LNKEXT): %/includer.clisp %/tokens.$(LNKEXT) + $(LISP_COMPILE) --load-directory=$* $< + +%/scanner.$(LNKEXT): %/scanner.clisp %/tokens.$(LNKEXT) %/includer.$(LNKEXT) + $(LISP_COMPILE) --load-directory=$* $< + +%/pile.$(LNKEXT): %/pile.clisp %/scanner.$(LNKEXT) %/includer.$(LNKEXT) + $(LISP_COMPILE) --load-directory=$* $< + +%/ast.$(LNKEXT): %/ast.clisp %/includer.$(LNKEXT) + $(LISP_COMPILE) --load-directory=$* $< + +%/parser.$(LNKEXT): %/parser.clisp %/ast.$(LNKEXT) %/scanner.$(LNKEXT) \ + %/includer.$(LNKEXT) + $(LISP_COMPILE) --load-directory=$* $< + +%/translator.$(LNKEXT): %/translator.clisp %/parser.$(LNKEXT) \ + %/ast.$(LNKEXT) %/pile.$(LNKEXT) %/scanner.$(LNKEXT) \ + %/includer.$(LNKEXT) + $(LISP_COMPILE) --load-directory=$* $< + + +# +# Cleaning mess +# + +mostlyclean-local: + @rm -f $(oa_target_bindir)/bootsys$(EXEEXT) + @rm -rf prev-stage + @rm -rf strap stage1 stage2 + @rm -rf $(oa_target_bootdir) + @rm -f *.data *.fn + +clean-local: mostlyclean-local + @rm -f *.clisp + +distclean-local: clean-local |