diff options
author | Andy Wingo <wingo@pobox.com> | 2016-01-29 10:21:44 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2016-01-29 10:21:44 +0100 |
commit | eccdeb6cc6c164ea10160fafbd276b6dc5e9b73e (patch) | |
tree | 2e31767aafb05352db514563b003fff9991c3dfa | |
parent | e4be4aea3491be954da25b8356e97c0fe60f98f9 (diff) | |
download | guile-eccdeb6cc6c164ea10160fafbd276b6dc5e9b73e.tar.gz |
Distribute prebuilt bootstraps for common hosts
* am/bootstrap.am: New file, factored out of bootstrap/Makefile.am.
* bootstrap/Makefile.am: Use bootstrap.am.
* prebuilt/Makefile.am:
* prebuilt/i686-pc-linux-gnu/Makefile.am:
* prebuilt/mips-unknown-linux-gnu/Makefile.am:
* prebuilt/x86_64-unknown-linux-gnu/Makefile.am: New files.
* configure.ac: Output the prebuilt/ makefiles.
* Makefile.am: Descend into prebuilt/ when making dist.
* meta/uninstalled-env.in: Arrange to put prebuilt/ in the beginning of
the GUILE_LOAD_COMPILED_PATH. Also fix a case where bootstrap/ wasn't
being correctly added to the load path.
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | am/bootstrap.am | 153 | ||||
-rw-r--r-- | bootstrap/Makefile.am | 133 | ||||
-rw-r--r-- | configure.ac | 5 | ||||
-rw-r--r-- | meta/uninstalled-env.in | 27 | ||||
-rw-r--r-- | prebuilt/Makefile.am | 56 | ||||
-rw-r--r-- | prebuilt/i686-pc-linux-gnu/Makefile.am | 25 | ||||
-rw-r--r-- | prebuilt/mips-unknown-linux-gnu/Makefile.am | 25 | ||||
-rw-r--r-- | prebuilt/x86_64-unknown-linux-gnu/Makefile.am | 25 |
9 files changed, 308 insertions, 143 deletions
diff --git a/Makefile.am b/Makefile.am index 7918c7974..070332611 100644 --- a/Makefile.am +++ b/Makefile.am @@ -41,6 +41,8 @@ SUBDIRS = \ am \ doc +DIST_SUBDIRS = $(SUBDIRS) prebuilt + libguileincludedir = $(pkgincludedir)/$(GUILE_EFFECTIVE_VERSION) libguileinclude_HEADERS = libguile.h diff --git a/am/bootstrap.am b/am/bootstrap.am new file mode 100644 index 000000000..d613d7f02 --- /dev/null +++ b/am/bootstrap.am @@ -0,0 +1,153 @@ +## Copyright (C) 2009, 2010, 2011, 2012, 2013, +## 2014, 2015 Free Software Foundation, Inc. +## +## This file is part of GNU Guile. +## +## GNU Guile is free software; you can redistribute it and/or modify +## it under the terms of the GNU Lesser General Public License as +## published by the Free Software Foundation; either version 3, or (at +## your option) any later version. +## +## GNU Guile is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with GNU Guile; see the file COPYING.LESSER. If not, +## write to the Free Software Foundation, Inc., 51 Franklin Street, +## Fifth Floor, Boston, MA 02110-1301 USA + +# These variables can be set before you include bootstrap.am. +GUILE_WARNINGS ?= -Wunbound-variable -Warity-mismatch -Wformat +GUILE_OPTIMIZATIONS ?= -O2 +GUILE_TARGET ?= $(host) +GUILE_BUILD_TAG ?= BOOTSTRAP + +GOBJECTS = $(SOURCES:%.scm=%.go) +nobase_noinst_DATA = $(GOBJECTS) +CLEANFILES = $(GOBJECTS) + +VM_TARGETS = system/vm/assembler.go system/vm/disassembler.go +$(VM_TARGETS): $(top_builddir)/libguile/vm-operations.h + +AM_V_GUILEC = $(AM_V_GUILEC_$(V)) +AM_V_GUILEC_ = $(AM_V_GUILEC_$(AM_DEFAULT_VERBOSITY)) +AM_V_GUILEC_0 = @echo " $(GUILE_BUILD_TAG) GUILEC" $@; + +vpath %.scm @top_srcdir@/module + +SUFFIXES = .scm .go + +.scm.go: + $(AM_V_GUILEC)GUILE_AUTO_COMPILE=0 \ + $(top_builddir)/meta/uninstalled-env \ + guild compile --target="$(GUILE_TARGET)" \ + $(GUILE_WARNINGS) $(GUILE_OPTIMIZATIONS) \ + -L "$(abs_top_srcdir)/module" \ + -L "$(abs_top_srcdir)/guile-readline" \ + -o "$@" "$<" + +# A subset of sources that are used by the compiler. We can compile +# these in any order; the order below is designed to hopefully result in +# the lowest total compile time. +SOURCES = \ + ice-9/eval.scm \ + ice-9/psyntax-pp.scm \ + language/cps/intmap.scm \ + language/cps/intset.scm \ + language/cps/utils.scm \ + ice-9/vlist.scm \ + srfi/srfi-1.scm \ + \ + language/tree-il.scm \ + language/tree-il/analyze.scm \ + language/tree-il/canonicalize.scm \ + language/tree-il/compile-cps.scm \ + language/tree-il/debug.scm \ + language/tree-il/effects.scm \ + language/tree-il/fix-letrec.scm \ + language/tree-il/optimize.scm \ + language/tree-il/peval.scm \ + language/tree-il/primitives.scm \ + language/tree-il/spec.scm \ + \ + language/cps.scm \ + language/cps/closure-conversion.scm \ + language/cps/compile-bytecode.scm \ + language/cps/constructors.scm \ + language/cps/contification.scm \ + language/cps/cse.scm \ + language/cps/dce.scm \ + language/cps/effects-analysis.scm \ + language/cps/elide-values.scm \ + language/cps/licm.scm \ + language/cps/peel-loops.scm \ + language/cps/primitives.scm \ + language/cps/prune-bailouts.scm \ + language/cps/prune-top-level-scopes.scm \ + language/cps/reify-primitives.scm \ + language/cps/renumber.scm \ + language/cps/rotate-loops.scm \ + language/cps/optimize.scm \ + language/cps/simplify.scm \ + language/cps/self-references.scm \ + language/cps/slot-allocation.scm \ + language/cps/spec.scm \ + language/cps/specialize-primcalls.scm \ + language/cps/specialize-numbers.scm \ + language/cps/split-rec.scm \ + language/cps/type-checks.scm \ + language/cps/type-fold.scm \ + language/cps/types.scm \ + language/cps/verify.scm \ + language/cps/with-cps.scm \ + \ + language/scheme/spec.scm \ + language/scheme/compile-tree-il.scm \ + language/scheme/decompile-tree-il.scm \ + \ + language/bytecode.scm \ + language/bytecode/spec.scm \ + \ + language/value/spec.scm \ + \ + system/base/pmatch.scm \ + system/base/syntax.scm \ + system/base/compile.scm \ + system/base/language.scm \ + system/base/lalr.scm \ + system/base/message.scm \ + system/base/target.scm \ + system/base/types.scm \ + system/base/ck.scm \ + \ + ice-9/boot-9.scm \ + ice-9/r5rs.scm \ + ice-9/deprecated.scm \ + ice-9/binary-ports.scm \ + ice-9/command-line.scm \ + ice-9/control.scm \ + ice-9/format.scm \ + ice-9/getopt-long.scm \ + ice-9/i18n.scm \ + ice-9/match.scm \ + ice-9/networking.scm \ + ice-9/posix.scm \ + ice-9/rdelim.scm \ + ice-9/receive.scm \ + ice-9/regex.scm \ + ice-9/session.scm \ + ice-9/pretty-print.scm \ + \ + system/vm/assembler.scm \ + system/vm/debug.scm \ + system/vm/disassembler.scm \ + system/vm/dwarf.scm \ + system/vm/elf.scm \ + system/vm/frame.scm \ + system/vm/linker.scm \ + system/vm/loader.scm \ + system/vm/program.scm \ + system/vm/vm.scm \ + system/foreign.scm diff --git a/bootstrap/Makefile.am b/bootstrap/Makefile.am index e954059bb..496d5301a 100644 --- a/bootstrap/Makefile.am +++ b/bootstrap/Makefile.am @@ -21,138 +21,11 @@ ## Fifth Floor, Boston, MA 02110-1301 USA -GOBJECTS = $(SOURCES:%.scm=%.go) -# No warnings for the bootstrap build. Run -# make GUILE_WARNINGS="-Wunbound-variable -Warity-mismatch -Wformat" -# to get the normal set of warnings. GUILE_WARNINGS = GUILE_OPTIMIZATIONS = -O1 -nobase_noinst_DATA = $(GOBJECTS) ice-9/eval.go -CLEANFILES = $(GOBJECTS) ice-9/eval.go + +include $(top_srcdir)/am/bootstrap.am # We must build the evaluator first, so that we can be sure to control # the stack. -$(GOBJECTS): ice-9/eval.go - -VM_TARGETS := system/vm/assembler.go system/vm/disassembler.go -$(VM_TARGETS): $(top_builddir)/libguile/vm-operations.h - -AM_V_GUILEC = $(AM_V_GUILEC_$(V)) -AM_V_GUILEC_ = $(AM_V_GUILEC_$(AM_DEFAULT_VERBOSITY)) -AM_V_GUILEC_0 = @echo " BOOTSTRAP GUILEC" $@; - -vpath %.scm @srcdir@/../module - -SUFFIXES = .scm .go - -.scm.go: - $(AM_V_GUILEC)GUILE_AUTO_COMPILE=0 \ - $(top_builddir)/meta/uninstalled-env \ - guild compile --target="$(host)" \ - $(GUILE_WARNINGS) $(GUILE_OPTIMIZATIONS) \ - -L "$(abs_top_srcdir)/module" \ - -L "$(abs_top_srcdir)/guile-readline" \ - -o "$@" "$<" - -# A subset of sources that are used by the compiler. We can compile -# these in any order; the order below is designed to hopefully result in -# the lowest total compile time. -SOURCES = \ - ice-9/psyntax-pp.scm \ - language/cps/intmap.scm \ - language/cps/intset.scm \ - language/cps/utils.scm \ - ice-9/vlist.scm \ - srfi/srfi-1.scm \ - \ - language/tree-il.scm \ - language/tree-il/analyze.scm \ - language/tree-il/canonicalize.scm \ - language/tree-il/compile-cps.scm \ - language/tree-il/debug.scm \ - language/tree-il/effects.scm \ - language/tree-il/fix-letrec.scm \ - language/tree-il/optimize.scm \ - language/tree-il/peval.scm \ - language/tree-il/primitives.scm \ - language/tree-il/spec.scm \ - \ - language/cps.scm \ - language/cps/closure-conversion.scm \ - language/cps/compile-bytecode.scm \ - language/cps/constructors.scm \ - language/cps/contification.scm \ - language/cps/cse.scm \ - language/cps/dce.scm \ - language/cps/effects-analysis.scm \ - language/cps/elide-values.scm \ - language/cps/licm.scm \ - language/cps/peel-loops.scm \ - language/cps/primitives.scm \ - language/cps/prune-bailouts.scm \ - language/cps/prune-top-level-scopes.scm \ - language/cps/reify-primitives.scm \ - language/cps/renumber.scm \ - language/cps/rotate-loops.scm \ - language/cps/optimize.scm \ - language/cps/simplify.scm \ - language/cps/self-references.scm \ - language/cps/slot-allocation.scm \ - language/cps/spec.scm \ - language/cps/specialize-primcalls.scm \ - language/cps/specialize-numbers.scm \ - language/cps/split-rec.scm \ - language/cps/type-checks.scm \ - language/cps/type-fold.scm \ - language/cps/types.scm \ - language/cps/verify.scm \ - language/cps/with-cps.scm \ - \ - language/scheme/spec.scm \ - language/scheme/compile-tree-il.scm \ - language/scheme/decompile-tree-il.scm \ - \ - language/bytecode.scm \ - language/bytecode/spec.scm \ - \ - language/value/spec.scm \ - \ - system/base/pmatch.scm \ - system/base/syntax.scm \ - system/base/compile.scm \ - system/base/language.scm \ - system/base/lalr.scm \ - system/base/message.scm \ - system/base/target.scm \ - system/base/types.scm \ - system/base/ck.scm \ - \ - ice-9/boot-9.scm \ - ice-9/r5rs.scm \ - ice-9/deprecated.scm \ - ice-9/binary-ports.scm \ - ice-9/command-line.scm \ - ice-9/control.scm \ - ice-9/format.scm \ - ice-9/getopt-long.scm \ - ice-9/i18n.scm \ - ice-9/match.scm \ - ice-9/networking.scm \ - ice-9/posix.scm \ - ice-9/rdelim.scm \ - ice-9/receive.scm \ - ice-9/regex.scm \ - ice-9/session.scm \ - ice-9/pretty-print.scm \ - \ - system/vm/assembler.scm \ - system/vm/debug.scm \ - system/vm/disassembler.scm \ - system/vm/dwarf.scm \ - system/vm/elf.scm \ - system/vm/frame.scm \ - system/vm/linker.scm \ - system/vm/loader.scm \ - system/vm/program.scm \ - system/vm/vm.scm \ - system/foreign.scm +$(filter-out ice-9/eval.go, $(GOBJECTS)): ice-9/eval.go diff --git a/configure.ac b/configure.ac index 9e639d6da..0eb2368ec 100644 --- a/configure.ac +++ b/configure.ac @@ -1645,8 +1645,13 @@ AC_CONFIG_FILES([ meta/Makefile bootstrap/Makefile module/Makefile + prebuilt/Makefile + prebuilt/x86_64-unknown-linux-gnu/Makefile + prebuilt/i686-pc-linux-gnu/Makefile + prebuilt/mips-unknown-linux-gnu/Makefile ]) + GUILE_CONFIG_SCRIPT([check-guile]) GUILE_CONFIG_SCRIPT([benchmark-guile]) GUILE_CONFIG_SCRIPT([meta/guile]) diff --git a/meta/uninstalled-env.in b/meta/uninstalled-env.in index 3bcde8eb9..7197eabee 100644 --- a/meta/uninstalled-env.in +++ b/meta/uninstalled-env.in @@ -80,21 +80,22 @@ then fi export GUILE_LOAD_PATH - if test "x$GUILE_LOAD_COMPILED_PATH" = "x" - then - GUILE_LOAD_COMPILED_PATH="${top_builddir}/module:${top_builddir}/guile-readline" + if test "x$GUILE_LOAD_COMPILED_PATH" = "x"; then + GUILE_LOAD_COMPILED_PATH="${top_srcdir}/prebuilt/@host@" else - for d in "/bootstrap" "/module" "/guile-readline" - do - # This hair prevents double inclusion. - # The ":" prevents prefix aliasing. - case x"$GUILE_LOAD_COMPILED_PATH" in - x*${top_builddir}${d}:*) ;; - x*${top_builddir}${d}) ;; - *) GUILE_LOAD_COMPILED_PATH="${top_builddir}${d}:$GUILE_LOAD_COMPILED_PATH" ;; - esac - done + GUILE_LOAD_COMPILED_PATH="${top_srcdir}/prebuilt/@host@:$GUILE_LOAD_COMPILED_PATH" fi + + for d in "/bootstrap" "/module" "/guile-readline" + do + # This hair prevents double inclusion. + # The ":" prevents prefix aliasing. + case x"$GUILE_LOAD_COMPILED_PATH" in + x*${top_builddir}${d}:*) ;; + x*${top_builddir}${d}) ;; + *) GUILE_LOAD_COMPILED_PATH="${top_builddir}${d}:$GUILE_LOAD_COMPILED_PATH" ;; + esac + done export GUILE_LOAD_COMPILED_PATH # Don't look in installed dirs for guile modules diff --git a/prebuilt/Makefile.am b/prebuilt/Makefile.am new file mode 100644 index 000000000..b0a24d023 --- /dev/null +++ b/prebuilt/Makefile.am @@ -0,0 +1,56 @@ +## Process this file with automake to produce Makefile.in. +## +## Copyright (C) 2016 Free Software Foundation, Inc. +## +## This file is part of GNU Guile. +## +## GNU Guile is free software; you can redistribute it and/or modify +## it under the terms of the GNU Lesser General Public License as +## published by the Free Software Foundation; either version 3, or (at +## your option) any later version. +## +## GNU Guile is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with GNU Guile; see the file COPYING.LESSER. If not, +## write to the Free Software Foundation, Inc., 51 Franklin Street, +## Fifth Floor, Boston, MA 02110-1301 USA + +# Guile Scheme is mostly written in Guile Scheme. Its compiler is +# written in Guile Scheme, and its interpreter too. However, it is not +# bootstrapped from itself: Guile includes a minimal interpreter written +# in C as well which can load the compiler, enough to compile the +# interpreter written in Scheme. That compiled interpreter written in +# Scheme is then used to compile the rest of Guile, including the +# compiler itself. +# +# The problem is, this process takes a long time, and for people +# installing Guile from source, it's their first experience of Guile: an +# hour-long bootstrap. It's not the nicest experience. To avoid this, +# in our tarballs we pre-build object files for the essential parts of +# the compiler. +# +# In the future we will do native compilation and so we will need to +# precompile object files for all common host types. Still, since we +# use ELF everywhere, there will be many host types whose compiled files +# are the same: because Guile incorporates its own linker and loader for +# compiled Scheme files, any AArch64 machine, for example, is going to +# have the same compiled files. So, for the variants that will be the +# same, we compile one target triple, and symlink the similar targets to +# that directory. +# +# The current situation though is that we compile to bytecode, and there +# are only four variants of that bytecode: big- or little-endian, and +# 32- or 64-bit. The strategy is the same, only that now +# arm64-unknown-linux-gnu will link to x86_64-unknown-linux-gnu, as they +# have the same word size and endianness. A pending issue to resolve is +# how this wil deal with architectures where longs are 32 bits and +# pointers are 64 bits; we'll let the x32 people deal with that. + +SUBDIRS = \ + x86_64-unknown-linux-gnu \ + i686-pc-linux-gnu \ + mips-unknown-linux-gnu diff --git a/prebuilt/i686-pc-linux-gnu/Makefile.am b/prebuilt/i686-pc-linux-gnu/Makefile.am new file mode 100644 index 000000000..6b5683498 --- /dev/null +++ b/prebuilt/i686-pc-linux-gnu/Makefile.am @@ -0,0 +1,25 @@ +## Process this file with automake to produce Makefile.in. +## +## Copyright (C) 2016 Free Software Foundation, Inc. +## +## This file is part of GNU Guile. +## +## GNU Guile is free software; you can redistribute it and/or modify +## it under the terms of the GNU Lesser General Public License as +## published by the Free Software Foundation; either version 3, or (at +## your option) any later version. +## +## GNU Guile is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with GNU Guile; see the file COPYING.LESSER. If not, +## write to the Free Software Foundation, Inc., 51 Franklin Street, +## Fifth Floor, Boston, MA 02110-1301 USA + +GUILE_TARGET = $(shell basename $(subdir)) +GUILE_BUILD_TAG = PREBUILD $(GUILE_TARGET) + +include $(top_srcdir)/am/bootstrap.am diff --git a/prebuilt/mips-unknown-linux-gnu/Makefile.am b/prebuilt/mips-unknown-linux-gnu/Makefile.am new file mode 100644 index 000000000..6b5683498 --- /dev/null +++ b/prebuilt/mips-unknown-linux-gnu/Makefile.am @@ -0,0 +1,25 @@ +## Process this file with automake to produce Makefile.in. +## +## Copyright (C) 2016 Free Software Foundation, Inc. +## +## This file is part of GNU Guile. +## +## GNU Guile is free software; you can redistribute it and/or modify +## it under the terms of the GNU Lesser General Public License as +## published by the Free Software Foundation; either version 3, or (at +## your option) any later version. +## +## GNU Guile is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with GNU Guile; see the file COPYING.LESSER. If not, +## write to the Free Software Foundation, Inc., 51 Franklin Street, +## Fifth Floor, Boston, MA 02110-1301 USA + +GUILE_TARGET = $(shell basename $(subdir)) +GUILE_BUILD_TAG = PREBUILD $(GUILE_TARGET) + +include $(top_srcdir)/am/bootstrap.am diff --git a/prebuilt/x86_64-unknown-linux-gnu/Makefile.am b/prebuilt/x86_64-unknown-linux-gnu/Makefile.am new file mode 100644 index 000000000..6b5683498 --- /dev/null +++ b/prebuilt/x86_64-unknown-linux-gnu/Makefile.am @@ -0,0 +1,25 @@ +## Process this file with automake to produce Makefile.in. +## +## Copyright (C) 2016 Free Software Foundation, Inc. +## +## This file is part of GNU Guile. +## +## GNU Guile is free software; you can redistribute it and/or modify +## it under the terms of the GNU Lesser General Public License as +## published by the Free Software Foundation; either version 3, or (at +## your option) any later version. +## +## GNU Guile is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with GNU Guile; see the file COPYING.LESSER. If not, +## write to the Free Software Foundation, Inc., 51 Franklin Street, +## Fifth Floor, Boston, MA 02110-1301 USA + +GUILE_TARGET = $(shell basename $(subdir)) +GUILE_BUILD_TAG = PREBUILD $(GUILE_TARGET) + +include $(top_srcdir)/am/bootstrap.am |