## Copyright (c) 1991-2002, The Numerical Algorithms Group Ltd. ## All rights reserved. ## Copyright (C) 2007-2008, 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. AXIOM_LOCAL_LISP_sources = initial-env.lisp AXIOM_LOCAL_LISP = ../lisp/lisp$(EXEEXT) ## FASLs that comprises `bootsys' boot_SOURCES = initial-env.lisp $(boot_sources) boot_sources = tokens.boot includer.boot scanner.boot \ pile.boot ast.boot parser.boot translator.boot boot_clisp = $(boot_sources:.boot=.clisp) boot_objects = initial-env.$(FASLEXT) $(boot_sources:.boot=.$(FASLEXT)) # Garbage produced by GCL during compilation boot_data = $(boot_sources:.boot=.data) boot_fn = $(boot_sources:.boot=.fn) ## ## ECL's program construction model is not based on image-dumping. It is ## closer to `traditional C' application building. Therefore, since ## bootsys is an augmentation of base-lisp, we need to have the objects ## that made up base-lisp too. ifeq (@axiom_lisp_flavor@,ecl) boot_objects_extra = ../lisp/core.$(FASLEXT) endif # reference to this directory from toplevel subdir = src/boot/ ## Make rule toplevel entry points. .PHONY: all-ax all-boot all: all-ax all-boot all-ax all-boot: stamp stamp: $(axiom_target_bindir)/bootsys$(EXEEXT) @rm -f stamp $(STAMP) $@ ## The final `bootsys' image. $(axiom_target_bindir)/bootsys$(EXEEXT): stage2/bootsys$(EXEEXT) $(mkinstalldirs) $(axiom_target_bindir) $(INSTALL_PROGRAM) $< $@ .PRECIOUS: strap/%.$(FASLEXT) ## ## 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_boot_clisp = $(addprefix strap/, $(boot_clisp)) strap_boot_objects = \ $(addprefix strap/, $(boot_objects)) strap/stamp: strap/bootsys$(EXEEXT) @rm -f $@ @$(STAMP) $@ strap/bootsys$(EXEEXT): $(strap_boot_objects) $(AXIOM_LOCAL_LISP) -- --make --main="|AxiomCore|::|topLevel|"\ --output=$@ --load-directory=strap \ $(boot_objects_extra) $(strap_boot_objects) $(strap_boot_objects): $(AXIOM_LOCAL_LISP) ## ## Stage 1 `bootsys' image. ## .PRECIOUS: stage1/%.$(FASLEXT) .PRECIOUS: stage1/%.clisp stage1_boot_clisp = $(addprefix stage1/, $(boot_clisp)) stage1_boot_objects = \ $(addprefix stage1/, $(boot_objects)) stage1/stamp: stage1/bootsys$(EXEEXT) rm -f $@ $(STAMP) $@ stage1/bootsys$(EXEEXT): $(stage1_boot_objects) $(AXIOM_LOCAL_LISP) -- --make --main="|AxiomCore|::|topLevel|" \ --output=$@ --load-directory=stage1 \ $(boot_objects_extra) $(stage1_boot_objects) stage1/%.clisp: %.boot strap/stamp stage1/.started strap/bootsys -- --translate --output=$@ $< ## ## Stage 2 `bootsys' image. ## .PRECIOUS: stage2/%.$(FASLEXT) .PRECIOUS: stage2/%.clisp stage2_boot_clisp = $(addprefix stage2/, $(boot_clisp)) stage2_boot_objects = \ $(addprefix stage2/, $(boot_objects)) stage2/stamp: stage2/bootsys$(EXEEXT) @echo Building stage 2 $(STAMP) $@ stage2/bootsys$(EXEEXT): $(stage2_boot_objects) $(AXIOM_LOCAL_LISP) -- --make --main="|AxiomCore|::|topLevel|" \ --output=$@ --load-directory=stage2 \ $(boot_objects_extra) $(stage2_boot_objects) stage2/%.clisp: %.boot stage1/stamp stage2/.started stage1/bootsys -- --translate --output=$@ $< ## ## Generic rules for compiling FASLs ## .PRECIOUS: %/.started %/.started: $(mkinstalldirs) $* $(STAMP) $@ ## Dependency for various modules. ## FIXME: This should be automatically extracted from the ## Boot source file at packaging time. %/initial-env.$(FASLEXT): initial-env.lisp %/.started $(AXIOM_LOCAL_LISP) -- --compile --output=$@ $< %/tokens.$(FASLEXT): %/tokens.clisp %/initial-env.$(FASLEXT) $(AXIOM_LOCAL_LISP) -- --output=$@ --compile --load-directory=$* $< %/includer.$(FASLEXT): %/includer.clisp %/tokens.$(FASLEXT) $(AXIOM_LOCAL_LISP) -- --output=$@ --compile --load-directory=$* $< %/scanner.$(FASLEXT): %/scanner.clisp %/tokens.$(FASLEXT) %/includer.$(FASLEXT) $(AXIOM_LOCAL_LISP) -- --output=$@ --compile --load-directory=$* $< %/pile.$(FASLEXT): %/pile.clisp %/scanner.$(FASLEXT) %/includer.$(FASLEXT) $(AXIOM_LOCAL_LISP) -- --output=$@ --compile --load-directory=$* $< %/ast.$(FASLEXT): %/ast.clisp %/includer.$(FASLEXT) $(AXIOM_LOCAL_LISP) -- --output=$@ --compile --load-directory=$* $< %/parser.$(FASLEXT): %/parser.clisp %/ast.$(FASLEXT) %/scanner.$(FASLEXT) \ %/includer.$(FASLEXT) $(AXIOM_LOCAL_LISP) -- --output=$@ --compile --load-directory=$* $< %/translator.$(FASLEXT): %/translator.clisp %/parser.$(FASLEXT) \ %/ast.$(FASLEXT) %/pile.$(FASLEXT) %/scanner.$(FASLEXT) \ %/includer.$(FASLEXT) $(AXIOM_LOCAL_LISP) -- --output=$@ --compile --load-directory=$* $< ## ## Cleaning mess ## mostlyclean-local: @rm -f $(axiom_target_bindir)/bootsys$(EXEEXT) @rm -rf prev-stage @rm -rf strap stage1 stage2 @rm -f *.data *.fn @rm -f stamp clean-local: mostlyclean-local @rm -f *.clisp distclean-local: clean-local