diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | config/var-def.mk | 9 | ||||
-rwxr-xr-x | configure | 18 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | configure.ac.pamphlet | 2 | ||||
-rw-r--r-- | src/ChangeLog | 25 | ||||
-rw-r--r-- | src/boot/Makefile.in | 68 | ||||
-rw-r--r-- | src/lisp/Makefile.in | 29 | ||||
-rw-r--r-- | src/lisp/core.lisp.in | 44 |
9 files changed, 147 insertions, 54 deletions
@@ -1,3 +1,7 @@ +2008-08-13 Gabriel Dos Reis <gdr@cs.tamu.edu> + + * config/var-def.mk (LNKEXT): New. + 2008-08-07 Gabriel Dos Reis <gdr@cs.tamu.edu> * configure.ac.pamphlet (oa_use_dynamic_lib): New. Decide when to diff --git a/config/var-def.mk b/config/var-def.mk index a32bccac..194a427a 100644 --- a/config/var-def.mk +++ b/config/var-def.mk @@ -233,6 +233,15 @@ AXIOM_LISP = @AXIOM_LISP@ # Extension of the output file name returned by compile-file FASLEXT = @axiom_fasl_type@ +# Extension of compiled FASLs appropriate for linking into executable +# programs. For most Lisp systems, it is the same as FASLEXT because +# they build programs by dumping images. +ifeq (@axiom_lisp_flavor@,ecl) +LNKEXT = $(OBJEXT) +else +LNKEXT = $(FASLEXT) +endif + ## AXIOMXLROOT=${AXIOM}/compiler @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.60 for OpenAxiom 1.2.0-2008-08-12. +# Generated by GNU Autoconf 2.60 for OpenAxiom 1.2.0-2008-08-13. # # Report bugs to <open-axiom-bugs@lists.sf.net>. # @@ -713,8 +713,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='OpenAxiom' PACKAGE_TARNAME='openaxiom' -PACKAGE_VERSION='1.2.0-2008-08-12' -PACKAGE_STRING='OpenAxiom 1.2.0-2008-08-12' +PACKAGE_VERSION='1.2.0-2008-08-13' +PACKAGE_STRING='OpenAxiom 1.2.0-2008-08-13' PACKAGE_BUGREPORT='open-axiom-bugs@lists.sf.net' ac_unique_file="src/Makefile.pamphlet" @@ -1404,7 +1404,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures OpenAxiom 1.2.0-2008-08-12 to adapt to many kinds of systems. +\`configure' configures OpenAxiom 1.2.0-2008-08-13 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1474,7 +1474,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of OpenAxiom 1.2.0-2008-08-12:";; + short | recursive ) echo "Configuration of OpenAxiom 1.2.0-2008-08-13:";; esac cat <<\_ACEOF @@ -1578,7 +1578,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -OpenAxiom configure 1.2.0-2008-08-12 +OpenAxiom configure 1.2.0-2008-08-13 generated by GNU Autoconf 2.60 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -1592,7 +1592,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by OpenAxiom $as_me 1.2.0-2008-08-12, which was +It was created by OpenAxiom $as_me 1.2.0-2008-08-13, which was generated by GNU Autoconf 2.60. Invocation command line was $ $0 $@ @@ -26089,7 +26089,7 @@ exec 6>&1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by OpenAxiom $as_me 1.2.0-2008-08-12, which was +This file was extended by OpenAxiom $as_me 1.2.0-2008-08-13, which was generated by GNU Autoconf 2.60. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -26138,7 +26138,7 @@ Report bugs to <bug-autoconf@gnu.org>." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -OpenAxiom config.status 1.2.0-2008-08-12 +OpenAxiom config.status 1.2.0-2008-08-13 configured by $0, generated by GNU Autoconf 2.60, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" diff --git a/configure.ac b/configure.ac index 7684b131..b88d8a9e 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ sinclude(config/open-axiom.m4) sinclude(config/aclocal.m4) -AC_INIT([OpenAxiom], [1.2.0-2008-08-12], +AC_INIT([OpenAxiom], [1.2.0-2008-08-13], [open-axiom-bugs@lists.sf.net]) AC_CONFIG_AUX_DIR(config) diff --git a/configure.ac.pamphlet b/configure.ac.pamphlet index 99222744..f90c06c0 100644 --- a/configure.ac.pamphlet +++ b/configure.ac.pamphlet @@ -1118,7 +1118,7 @@ information: <<Autoconf init>>= sinclude(config/open-axiom.m4) sinclude(config/aclocal.m4) -AC_INIT([OpenAxiom], [1.2.0-2008-08-12], +AC_INIT([OpenAxiom], [1.2.0-2008-08-13], [open-axiom-bugs@lists.sf.net]) @ diff --git a/src/ChangeLog b/src/ChangeLog index bf490f90..deb2deb6 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,28 @@ +2008-08-13 Gabriel Dos Reis <gdr@cs.tamu.edu> + + * lisp/core.lisp.in (LINKSET-FROM): New. + (SYSTEM-SUBDIRECTORY): Likewise. + (LINKSET-FROM-IF): Likewise. + (COMPLETE-FASL-LIST-FOR-LINK): Use it. + (getPrologue): New. + (link): Take an additional optional parameter for prologue. Tidy. + (makeHandler): Adjust. + * lisp/Makefile.in: Use LNKEXT where appropriate. + (oa_base_lisp_linkset): New. + ($(oa_target_lispdir)/core.$(LNKEXT)): New rule. + (base-lisp$(EXEEXT)): Now depends on $(oa_base_lisp_linkset). + (mostlyclean-local): Remove $(oa_target_lispdir) too. + * boot/Makefile.in: Use LNKEXT instead of FASLEXT. + (boot_objects_extra): Remove. + (oa_target_bootdir): New. + (oa_boot_linkset): Likewise. + (stamp): Require $(oa_boot_linkset). + ($(oa_target_bootdir)/%.$(LNKEXT)): New rule. + (strap/bootsys$(EXEEXT)): Add prologue code. + (stage1/bootsys$(EXEEXT)): Likewise. + (stage2/bootsys$(EXEEXT)): Likewise. + (mostlyclean-local): Remove $(oa_target_bootdir) too. + 2008-08-12 Gabriel Dos Reis <gdr@cs.tamu.edu> * interp/patches.lisp (RESTART0): Don't duplicate code; call diff --git a/src/boot/Makefile.in b/src/boot/Makefile.in index bbb17612..ab05adca 100644 --- a/src/boot/Makefile.in +++ b/src/boot/Makefile.in @@ -56,21 +56,20 @@ 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)) +boot_objects = initial-env.$(LNKEXT) $(boot_sources:.boot=.$(LNKEXT)) + +oa_target_bootdir = $(axiom_targetdir)/boot +ifeq (@axiom_lisp_flavor@,ecl) +oa_boot_linkset = \ + $(addprefix $(oa_target_bootdir)/, $(boot_objects)) +else +oa_boot_linkset = +endif # 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/ @@ -80,7 +79,7 @@ all: all-ax all-boot all-ax all-boot: stamp -stamp: $(axiom_target_bindir)/bootsys$(EXEEXT) +stamp: $(axiom_target_bindir)/bootsys$(EXEEXT) $(oa_boot_linkset) @rm -f stamp $(STAMP) $@ @@ -89,7 +88,14 @@ $(axiom_target_bindir)/bootsys$(EXEEXT): stage2/bootsys$(EXEEXT) $(mkdir_p) $(axiom_target_bindir) cp -p $< $@ +$(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. @@ -108,8 +114,9 @@ strap/stamp: strap/bootsys$(EXEEXT) strap/bootsys$(EXEEXT): $(strap_boot_objects) $(AXIOM_LOCAL_LISP) -- --make --main="|AxiomCore|::|topLevel|"\ - --output=$@ --load-directory=strap \ - $(boot_objects_extra) $(strap_boot_objects) + --system=$(axiom_targetdir) \ + --prologue='(pushnew :open-axiom-boot *features*)' \ + --output=$@ --load-directory=strap $(strap_boot_objects) $(strap_boot_objects): $(AXIOM_LOCAL_LISP) @@ -119,6 +126,7 @@ $(strap_boot_objects): $(AXIOM_LOCAL_LISP) ## .PRECIOUS: stage1/%.$(FASLEXT) +.PRECIOUS: stage1/%.$(LNKEXT) .PRECIOUS: stage1/%.clisp stage1_boot_clisp = $(addprefix stage1/, $(boot_clisp)) @@ -132,8 +140,9 @@ stage1/stamp: stage1/bootsys$(EXEEXT) stage1/bootsys$(EXEEXT): $(stage1_boot_objects) $(AXIOM_LOCAL_LISP) -- --make --main="|AxiomCore|::|topLevel|" \ - --output=$@ --load-directory=stage1 \ - $(boot_objects_extra) $(stage1_boot_objects) + --system=$(axiom_targetdir) \ + --prologue='(pushnew :open-axiom-boot *features*)' \ + --output=$@ --load-directory=stage1 $(stage1_boot_objects) stage1/%.clisp: %.boot strap/stamp stage1/.started strap/bootsys -- --translate --output=$@ $< @@ -144,6 +153,7 @@ stage1/%.clisp: %.boot strap/stamp stage1/.started ## .PRECIOUS: stage2/%.$(FASLEXT) +.PRECIOUS: stage2/%.$(LNKEXT) .PRECIOUS: stage2/%.clisp stage2_boot_clisp = $(addprefix stage2/, $(boot_clisp)) @@ -157,8 +167,9 @@ stage2/stamp: stage2/bootsys$(EXEEXT) stage2/bootsys$(EXEEXT): $(stage2_boot_objects) $(AXIOM_LOCAL_LISP) -- --make --main="|AxiomCore|::|topLevel|" \ - --output=$@ --load-directory=stage2 \ - $(boot_objects_extra) $(stage2_boot_objects) + --system=$(axiom_targetdir) \ + --prologue='(pushnew :open-axiom-boot *features*)' \ + --output=$@ --load-directory=stage2 $(stage2_boot_objects) stage2/%.clisp: %.boot stage1/stamp stage2/.started stage1/bootsys -- --translate --output=$@ $< @@ -176,31 +187,31 @@ stage2/%.clisp: %.boot stage1/stamp stage2/.started ## FIXME: This should be automatically extracted from the ## Boot source file at packaging time. -%/initial-env.$(FASLEXT): initial-env.lisp %/.started +%/initial-env.$(LNKEXT): initial-env.lisp %/.started $(AXIOM_LOCAL_LISP) -- --compile --output=$@ $< -%/tokens.$(FASLEXT): %/tokens.clisp %/initial-env.$(FASLEXT) +%/tokens.$(LNKEXT): %/tokens.clisp %/initial-env.$(LNKEXT) $(AXIOM_LOCAL_LISP) -- --output=$@ --compile --load-directory=$* $< -%/includer.$(FASLEXT): %/includer.clisp %/tokens.$(FASLEXT) +%/includer.$(LNKEXT): %/includer.clisp %/tokens.$(LNKEXT) $(AXIOM_LOCAL_LISP) -- --output=$@ --compile --load-directory=$* $< -%/scanner.$(FASLEXT): %/scanner.clisp %/tokens.$(FASLEXT) %/includer.$(FASLEXT) +%/scanner.$(LNKEXT): %/scanner.clisp %/tokens.$(LNKEXT) %/includer.$(LNKEXT) $(AXIOM_LOCAL_LISP) -- --output=$@ --compile --load-directory=$* $< -%/pile.$(FASLEXT): %/pile.clisp %/scanner.$(FASLEXT) %/includer.$(FASLEXT) +%/pile.$(LNKEXT): %/pile.clisp %/scanner.$(LNKEXT) %/includer.$(LNKEXT) $(AXIOM_LOCAL_LISP) -- --output=$@ --compile --load-directory=$* $< -%/ast.$(FASLEXT): %/ast.clisp %/includer.$(FASLEXT) +%/ast.$(LNKEXT): %/ast.clisp %/includer.$(LNKEXT) $(AXIOM_LOCAL_LISP) -- --output=$@ --compile --load-directory=$* $< -%/parser.$(FASLEXT): %/parser.clisp %/ast.$(FASLEXT) %/scanner.$(FASLEXT) \ - %/includer.$(FASLEXT) +%/parser.$(LNKEXT): %/parser.clisp %/ast.$(LNKEXT) %/scanner.$(LNKEXT) \ + %/includer.$(LNKEXT) $(AXIOM_LOCAL_LISP) -- --output=$@ --compile --load-directory=$* $< -%/translator.$(FASLEXT): %/translator.clisp %/parser.$(FASLEXT) \ - %/ast.$(FASLEXT) %/pile.$(FASLEXT) %/scanner.$(FASLEXT) \ - %/includer.$(FASLEXT) +%/translator.$(LNKEXT): %/translator.clisp %/parser.$(LNKEXT) \ + %/ast.$(LNKEXT) %/pile.$(LNKEXT) %/scanner.$(LNKEXT) \ + %/includer.$(LNKEXT) $(AXIOM_LOCAL_LISP) -- --output=$@ --compile --load-directory=$* $< @@ -212,6 +223,7 @@ mostlyclean-local: @rm -f $(axiom_target_bindir)/bootsys$(EXEEXT) @rm -rf prev-stage @rm -rf strap stage1 stage2 + @rm -rf $(oa_target_bootdir) @rm -f *.data *.fn @rm -f stamp diff --git a/src/lisp/Makefile.in b/src/lisp/Makefile.in index be8f7f0a..4ca6535e 100644 --- a/src/lisp/Makefile.in +++ b/src/lisp/Makefile.in @@ -31,6 +31,7 @@ OUT = $(axiom_build_bindir) +oa_target_lispdir = $(axiom_targetdir)/lisp subdir = src/lisp/ @@ -55,6 +56,16 @@ GCL_LTLD = $(if $(findstring mingw, $(target)),"","$(LIBTOOL) --mode=link ") fasl_ext = $(if $(findstring mingw, $(target)),.lisp,.$(FASLEXT)) FASLS = $(patsubst %,"%", $(addsuffix $(fasl_ext),core)) + +ifeq (@axiom_lisp_flavor@,ecl) +base_lisp_objects = ("core.$(LNKEXT)") +oa_base_lisp_linkset = $(oa_target_lispdir)/core.$(LNKEXT) +else +base_lisp_objects = nil +oa_base_lisp_linkset = +endif + + .PHONY: all all-lisp all: all-ax all-lisp @@ -64,6 +75,11 @@ stamp: $(OUT)/lisp$(EXEEXT) @rm -f stamp $(STAMP) $@ +$(oa_target_lispdir)/core.$(LNKEXT): core.$(LNKEXT) + $(mkdir_p) $(oa_target_lispdir)/ + cp $< $@ + + ## 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, @@ -101,14 +117,7 @@ else cp -p $< $@ && cp -p $< lisp$(EXEEXT) endif -ifeq (@axiom_lisp_flavor@,ecl) -base_lisp_objects = ("core.$(OBJEXT)") -else -base_lisp_objects = nil -endif - - -base-lisp$(EXEEXT): core.$(FASLEXT) +base-lisp$(EXEEXT): core.$(FASLEXT) $(oa_base_lisp_linkset) $(AXIOM_LISP) \ $(eval_flags) '(load "core")' \ $(eval_flags) '(|AxiomCore|::|link| "$@" (quote $(base_lisp_objects)) "|AxiomCore|::|topLevel|")' @@ -133,6 +142,7 @@ edit = sed \ -e 's|@SHREXT[@]|$(SHREXT)|g' \ -e 's|@LIBEXT[@]|$(LIBEXT)|g' \ -e 's|@oa_c_runtime_extra[@]|$(oa_c_runtime_extra)|g' \ + -e 's|@oa_base_lisp_linkset[@]|$(base_lisp_objects)|g' \ -e 's|@void_type[@]|$(void_type)|g' \ -e 's|@char_type[@]|$(char_type)|g' \ -e 's|@int_type[@]|$(int_type)|g' \ @@ -150,7 +160,7 @@ ifeq (@axiom_lisp_flavor@,ecl) $(AXIOM_LISP) $(quiet_flags) \ $(eval_flags) '(require (quote cmp))' \ $(eval_flags) '(compile-file "$<" :system-p t)' \ - $(eval_flags) '(c::build-fasl "$@" :lisp-files (quote ("core.$(OBJEXT)")))' \ + $(eval_flags) '(c::build-fasl "$@" :lisp-files (quote ("core.$(LNKEXT)")))' \ $(eval_flags) '(quit)' else $(AXIOM_LISP) $(quiet_flags) \ @@ -161,6 +171,7 @@ endif mostlyclean-local: rm -f *.$(FASLEXT) @rm -f $(OUT)/lisp$(EXEEXT) lisp$(EXEEXT) + rm -rf $(oa_target_lispdir) @rm -f stamp clean-local: mostlyclean diff --git a/src/lisp/core.lisp.in b/src/lisp/core.lisp.in index 76b9753c..6dff8f44 100644 --- a/src/lisp/core.lisp.in +++ b/src/lisp/core.lisp.in @@ -126,10 +126,9 @@ '(@axiom_optimize_options@)) (proclaim '(optimize @axiom_optimize_options@)) - ;; Return true if the Boot system is complete bootstrapped. (defun boot-completed-p nil - (member :open-axiom-boot-complete *features*)) + (member :open-axiom-boot *features*)) ;; ;; -*- Hosting Lisp System -*- @@ -217,8 +216,29 @@ (concatenate 'string (|systemRootDirectory|) "lib/")))) +;; Return the list of linkable fasls in in the directory `dir'. +(defun linkset-from (dir) + (directory (make-pathname :directory (pathname-directory dir) + :name :wild + :type |$effectiveFaslType|))) + +;; Return a path to the the subdirectory `subdir' within the +;; OpenAxiom filesystem. +(defun system-subdirectory (subdir) + (concatenate 'string (|systemRootDirectory|) subdir)) + +;; Like linkset-from when `feature' in on the features list. +(defun linkset-from-if (dir pred) + (if (member feature *features*) + (linkset-from (system-subdirectory dir)) + nil)) + +;; Return a complete list of fasls as appropriate for building +;; an executable program user thought consists only of `fasls'. (defun complete-fasl-list-for-link (fasls) - (mapcar #'|compileFilePathname| fasls)) + (append (linkset-from-if "lisp/" :open-axiom-base-lisp) + (linkset-from-if "boot/" :open-axiom-boot) + (map 'list #'|compileFilePathname| fasls))) ;; ;; -*- OpenAxiom Driver Table -*- @@ -232,6 +252,7 @@ ;; --sysalg=<dir>: specify <dir> as directory containing algebras ;; --compile: boot or lisp files ;; --translate: boot files +;; --prologue=<lisp-code>: Run <lisp-code> just before the main entry point. ;; --make: boot, lisp, or fasl files (defparameter |$driverTable| (make-hash-table :test #'equal :size 5)) @@ -330,6 +351,10 @@ (defun |getMainEntryPoint| (options) (|getOptionValue| (|Option| "main") options)) +(defun |getPrologue| (options) + (let ((prologue (|getOptionValue| (|Option| "prologue") options))) + (if prologue (read-from-string prologue) nil))) + ;; Save current image on disk as executable and quit. (defun |saveCore| (core-image &optional (entry-point nil)) ;; When building the OpenAxiom system, and in many other cases I suspect, @@ -533,7 +558,9 @@ ;; Note, despite the name LISP-FILEs, we do not expect bare Lisp source ;; files here. We do insist on FASLs. There is no check for that at ;; this point. You have been warned. -(defun |link| (core-image lisp-files &optional (entry-point nil)) +(defun |link| (core-image lisp-files + &optional (entry-point nil) (prologue nil)) + #-:ecl (declare (ignore prologue)) (if (and entry-point (stringp entry-point)) (setq entry-point `(read-from-string ,entry-point))) #-:ecl (progn @@ -546,7 +573,11 @@ :lisp-files (complete-fasl-list-for-link lisp-files) :ld-flags (extra-runtime-libs) - :epilogue-code `(funcall ,entry-point)) + :epilogue-code + `(progn + (pushnew :open-axiom-base-lisp *features*) + ,prologue + (funcall ,entry-point))) (|coreQuit|))) @@ -637,7 +668,8 @@ (|link| (or (|getOutputPathname| options) "a.out") args - (|getMainEntryPoint| options)) + (|getMainEntryPoint| options) + (|getPrologue| options)) (|coreQuit|)) (|installDriver| (|Option| "make") #'|makeHandler|) |