##  	Copyright (C) 2009-2022 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 ?= -W1
GUILE_OPTIMIZATIONS ?= -O2
GUILE_TARGET ?= $(host)
GUILE_BUILD_TAG ?= BOOTSTRAP($(GUILE_BOOTSTRAP_STAGE))

GOBJECTS = $(SOURCES:%.scm=%.go) $(ELISP_SOURCES:%.el=%.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
vpath %.el @top_srcdir@/module

SUFFIXES = .scm .el .go

COMPILE = $(AM_V_GUILEC)					\
	GUILE_BOOTSTRAP_STAGE=$(GUILE_BOOTSTRAP_STAGE)		\
	$(top_builddir)/meta/build-env				\
	guild compile --target="$(GUILE_TARGET)"                \
          $(GUILE_WARNINGS) $(GUILE_OPTIMIZATIONS)              \
	  -L "$(abs_top_srcdir)/module"

.scm.go:
	$(COMPILE) -o "$@" "$<"

.el.go:
	$(COMPILE) --from=elisp -o "$@" "$<"

ice-9/boot-9.go: ice-9/boot-9.scm ice-9/quasisyntax.scm ice-9/r6rs-libraries.scm ice-9/r7rs-libraries.scm ice-9/read.scm
ice-9/match.go: ice-9/match.scm ice-9/match.upstream.scm
srfi/srfi-64.go: srfi/srfi-64.scm srfi/srfi-64/testing.scm

# Keep this rule in sync with that in `am/guilec'.
ice-9/psyntax-pp.go: ice-9/psyntax.scm ice-9/psyntax-pp.scm
	$(COMPILE) -o "$@" "$<"

# All sources.  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				\
  ice-9/boot-9.scm				\
						\
  language/tree-il.scm				\
  language/tree-il/analyze.scm			\
  language/tree-il/compile-bytecode.scm		\
  language/tree-il/compile-cps.scm		\
  language/tree-il/cps-primitives.scm		\
  language/tree-il/debug.scm			\
  language/tree-il/effects.scm			\
  language/tree-il/eta-expand.scm		\
  language/tree-il/fix-letrec.scm		\
  language/tree-il/inlinable-exports.scm	\
  language/tree-il/letrectify.scm		\
  language/tree-il/optimize.scm			\
  language/tree-il/peval.scm			\
  language/tree-il/primitives.scm		\
  language/tree-il/resolve-free-vars.scm	\
  language/tree-il/spec.scm			\
						\
  language/cps.scm				\
  language/cps/closure-conversion.scm		\
  language/cps/compile-bytecode.scm		\
  language/cps/contification.scm		\
  language/cps/cse.scm				\
  language/cps/dce.scm				\
  language/cps/devirtualize-integers.scm	\
  language/cps/dump.scm				\
  language/cps/elide-arity-checks.scm		\
  language/cps/effects-analysis.scm		\
  language/cps/graphs.scm			\
  language/cps/intmap.scm			\
  language/cps/intset.scm			\
  language/cps/licm.scm				\
  language/cps/loop-instrumentation.scm		\
  language/cps/optimize.scm			\
  language/cps/peel-loops.scm			\
  language/cps/prune-top-level-scopes.scm	\
  language/cps/reify-primitives.scm		\
  language/cps/renumber.scm			\
  language/cps/return-types.scm			\
  language/cps/rotate-loops.scm			\
  language/cps/self-references.scm		\
  language/cps/simplify.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/switch.scm			\
  language/cps/type-checks.scm			\
  language/cps/type-fold.scm			\
  language/cps/types.scm			\
  language/cps/utils.scm			\
  language/cps/verify.scm			\
  language/cps/with-cps.scm			\
						\
  ice-9/and-let-star.scm			\
  ice-9/arrays.scm				\
  ice-9/atomic.scm				\
  ice-9/binary-ports.scm			\
  ice-9/buffered-input.scm			\
  ice-9/calling.scm				\
  ice-9/command-line.scm			\
  ice-9/common-list.scm				\
  ice-9/control.scm				\
  ice-9/copy-tree.scm				\
  ice-9/curried-definitions.scm			\
  ice-9/deprecated.scm				\
  ice-9/documentation.scm			\
  ice-9/eval-string.scm				\
  ice-9/exceptions.scm				\
  ice-9/expect.scm				\
  ice-9/fdes-finalizers.scm			\
  ice-9/format.scm				\
  ice-9/ftw.scm					\
  ice-9/futures.scm				\
  ice-9/gap-buffer.scm				\
  ice-9/getopt-long.scm				\
  ice-9/hash-table.scm				\
  ice-9/hcons.scm				\
  ice-9/history.scm				\
  ice-9/i18n.scm				\
  ice-9/iconv.scm				\
  ice-9/lineio.scm				\
  ice-9/list.scm				\
  ice-9/local-eval.scm				\
  ice-9/ls.scm					\
  ice-9/match.scm				\
  ice-9/networking.scm				\
  ice-9/null.scm				\
  ice-9/occam-channel.scm			\
  ice-9/optargs.scm				\
  ice-9/peg.scm					\
  ice-9/peg/cache.scm				\
  ice-9/peg/codegen.scm				\
  ice-9/peg/simplify-tree.scm			\
  ice-9/peg/string-peg.scm			\
  ice-9/peg/using-parsers.scm			\
  ice-9/poe.scm					\
  ice-9/poll.scm				\
  ice-9/popen.scm				\
  ice-9/ports.scm				\
  ice-9/posix.scm				\
  ice-9/pretty-print.scm			\
  ice-9/q.scm					\
  ice-9/r5rs.scm				\
  ice-9/rdelim.scm				\
  ice-9/receive.scm				\
  ice-9/regex.scm				\
  ice-9/runq.scm				\
  ice-9/rw.scm					\
  ice-9/safe-r5rs.scm				\
  ice-9/safe.scm				\
  ice-9/sandbox.scm				\
  ice-9/save-stack.scm				\
  ice-9/scm-style-repl.scm			\
  ice-9/serialize.scm				\
  ice-9/session.scm				\
  ice-9/slib.scm				\
  ice-9/stack-catch.scm				\
  ice-9/streams.scm				\
  ice-9/string-fun.scm				\
  ice-9/suspendable-ports.scm			\
  ice-9/textual-ports.scm			\
  ice-9/threads.scm				\
  ice-9/time.scm				\
  ice-9/top-repl.scm				\
  ice-9/unicode.scm				\
  ice-9/vlist.scm				\
  ice-9/weak-vector.scm				\
						\
  language/brainfuck/parse.scm			\
  language/brainfuck/compile-scheme.scm		\
  language/brainfuck/compile-tree-il.scm	\
  language/brainfuck/spec.scm			\
						\
  language/bytecode.scm				\
  language/bytecode/spec.scm			\
						\
  language/ecmascript/tokenize.scm		\
  language/ecmascript/parse.scm			\
  language/ecmascript/impl.scm			\
  language/ecmascript/base.scm			\
  language/ecmascript/function.scm		\
  language/ecmascript/array.scm			\
  language/ecmascript/compile-tree-il.scm	\
  language/ecmascript/spec.scm			\
						\
  language/elisp/falias.scm			\
  language/elisp/lexer.scm			\
  language/elisp/parser.scm			\
  language/elisp/bindings.scm			\
  language/elisp/compile-tree-il.scm		\
  language/elisp/runtime.scm			\
  language/elisp/runtime/function-slot.scm	\
  language/elisp/runtime/value-slot.scm		\
  language/elisp/spec.scm			\
						\
  language/scheme/compile-tree-il.scm		\
  language/scheme/decompile-tree-il.scm		\
  language/scheme/spec.scm			\
						\
  language/value/spec.scm			\
						\
  rnrs/base.scm					\
  rnrs/conditions.scm				\
  rnrs/control.scm				\
  rnrs/enums.scm				\
  rnrs/eval.scm					\
  rnrs/exceptions.scm				\
  rnrs/files.scm				\
  rnrs/hashtables.scm				\
  rnrs/lists.scm				\
  rnrs/mutable-pairs.scm			\
  rnrs/mutable-strings.scm			\
  rnrs/programs.scm				\
  rnrs/r5rs.scm					\
  rnrs/sorting.scm				\
  rnrs/syntax-case.scm				\
  rnrs/unicode.scm				\
  rnrs/arithmetic/bitwise.scm			\
  rnrs/arithmetic/fixnums.scm			\
  rnrs/arithmetic/flonums.scm			\
  rnrs/bytevectors.scm				\
  rnrs/io/simple.scm				\
  rnrs/io/ports.scm				\
  rnrs/records/inspection.scm			\
  rnrs/records/procedural.scm			\
  rnrs/records/syntactic.scm			\
  rnrs.scm					\
						\
  oop/goops.scm					\
  oop/goops/active-slot.scm			\
  oop/goops/composite-slot.scm			\
  oop/goops/describe.scm			\
  oop/goops/internal.scm			\
  oop/goops/save.scm				\
  oop/goops/stklos.scm				\
  oop/goops/accessors.scm			\
  oop/goops/simple.scm				\
						\
  scheme/base.scm				\
  scheme/case-lambda.scm			\
  scheme/char.scm				\
  scheme/complex.scm				\
  scheme/cxr.scm				\
  scheme/eval.scm				\
  scheme/file.scm				\
  scheme/inexact.scm				\
  scheme/lazy.scm				\
  scheme/load.scm				\
  scheme/process-context.scm			\
  scheme/r5rs.scm				\
  scheme/read.scm				\
  scheme/repl.scm				\
  scheme/time.scm				\
  scheme/write.scm				\
						\
  scripts/compile.scm				\
  scripts/disassemble.scm			\
  scripts/display-commentary.scm		\
  scripts/doc-snarf.scm				\
  scripts/frisk.scm				\
  scripts/generate-autoload.scm			\
  scripts/help.scm				\
  scripts/lint.scm				\
  scripts/list.scm				\
  scripts/punify.scm				\
  scripts/read-scheme-source.scm		\
  scripts/read-text-outline.scm			\
  scripts/use2dot.scm				\
  scripts/snarf-check-and-output-texi.scm	\
  scripts/summarize-guile-TODO.scm		\
  scripts/api-diff.scm				\
  scripts/read-rfc822.scm			\
  scripts/snarf-guile-m4-docs.scm		\
  scripts/autofrisk.scm				\
  scripts/scan-api.scm				\
						\
  srfi/srfi-1.scm				\
  srfi/srfi-2.scm				\
  srfi/srfi-4.scm				\
  srfi/srfi-4/gnu.scm				\
  srfi/srfi-6.scm				\
  srfi/srfi-8.scm				\
  srfi/srfi-9.scm				\
  srfi/srfi-9/gnu.scm				\
  srfi/srfi-10.scm				\
  srfi/srfi-11.scm				\
  srfi/srfi-13.scm				\
  srfi/srfi-14.scm				\
  srfi/srfi-16.scm				\
  srfi/srfi-17.scm				\
  srfi/srfi-18.scm				\
  srfi/srfi-19.scm				\
  srfi/srfi-26.scm				\
  srfi/srfi-27.scm				\
  srfi/srfi-28.scm				\
  srfi/srfi-31.scm				\
  srfi/srfi-34.scm				\
  srfi/srfi-35.scm				\
  srfi/srfi-37.scm				\
  srfi/srfi-38.scm				\
  srfi/srfi-41.scm				\
  srfi/srfi-42.scm				\
  srfi/srfi-43.scm				\
  srfi/srfi-39.scm				\
  srfi/srfi-45.scm				\
  srfi/srfi-60.scm				\
  srfi/srfi-64.scm				\
  srfi/srfi-67.scm				\
  srfi/srfi-69.scm				\
  srfi/srfi-71.scm				\
  srfi/srfi-88.scm				\
  srfi/srfi-98.scm				\
  srfi/srfi-111.scm				\
  srfi/srfi-171.scm                             \
  srfi/srfi-171/gnu.scm                         \
  srfi/srfi-171/meta.scm                        \
						\
  statprof.scm					\
						\
  system/base/pmatch.scm			\
  system/base/syntax.scm			\
  system/base/compile.scm			\
  system/base/optimize.scm			\
  system/base/language.scm			\
  system/base/lalr.scm				\
  system/base/message.scm			\
  system/base/target.scm			\
  system/base/types.scm				\
  system/base/types/internal.scm		\
  system/base/ck.scm				\
						\
  system/foreign.scm				\
  system/foreign-library.scm			\
  system/foreign-object.scm			\
						\
  system/repl/debug.scm				\
  system/repl/error-handling.scm		\
  system/repl/common.scm			\
  system/repl/command.scm			\
  system/repl/repl.scm				\
  system/repl/server.scm			\
  system/repl/coop-server.scm			\
						\
  system/vm/assembler.scm			\
  system/vm/coverage.scm			\
  system/vm/debug.scm				\
  system/vm/disassembler.scm			\
  system/vm/dwarf.scm				\
  system/vm/elf.scm				\
  system/vm/frame.scm				\
  system/vm/inspect.scm				\
  system/vm/linker.scm				\
  system/vm/loader.scm				\
  system/vm/program.scm				\
  system/vm/trace.scm				\
  system/vm/trap-state.scm			\
  system/vm/traps.scm				\
  system/vm/vm.scm				\
						\
  system/syntax.scm				\
						\
  system/xref.scm				\
						\
  sxml/apply-templates.scm			\
  sxml/fold.scm					\
  sxml/match.scm				\
  sxml/simple.scm				\
  sxml/ssax/input-parse.scm			\
  sxml/ssax.scm					\
  sxml/transform.scm				\
  sxml/xpath.scm				\
						\
  texinfo.scm					\
  texinfo/docbook.scm				\
  texinfo/html.scm				\
  texinfo/indexing.scm				\
  texinfo/string-utils.scm			\
  texinfo/plain-text.scm			\
  texinfo/reflection.scm			\
  texinfo/serialize.scm				\
						\
  web/client.scm				\
  web/http.scm					\
  web/request.scm				\
  web/response.scm				\
  web/server.scm				\
  web/server/http.scm				\
  web/uri.scm

ELISP_SOURCES =					\
  language/elisp/boot.el

NOCOMP_SOURCES =				\
  ice-9/match.upstream.scm			\
  ice-9/psyntax.scm				\
  ice-9/read.scm				\
  ice-9/r6rs-libraries.scm			\
  ice-9/r7rs-libraries.scm			\
  ice-9/quasisyntax.scm				\
  srfi/srfi-42/ec.scm				\
  srfi/srfi-64/testing.scm			\
  srfi/srfi-67/compare.scm			\
  system/base/lalr.upstream.scm			\
  system/repl/describe.scm			\
  sxml/sxml-match.ss				\
  sxml/upstream/SSAX.scm			\
  sxml/upstream/SXML-tree-trans.scm		\
  sxml/upstream/SXPath-old.scm			\
  sxml/upstream/assert.scm			\
  sxml/upstream/input-parse.scm
