On 2022-07-09 18:50, Anton Ertl wrote:
On Sat, Jul 09, 2022 at 06:26:11PM +0100, tristan wrote:
On 2022-07-08 09:39, Anton Ertl wrote:
> On Wed, Jul 06, 2022 at 08:53:50PM +0100, Tristan Williams wrote:
> > Hello,
> >
> > Has anyone successfully built and run gforth 0.7.9 on a mac with the
> > M1 chip? I have a 0.7.3 binary (via homebrew) that runs, but my
> > attempts at building 0.7.9 from the tarball have failed. Any
> > suggestions gratefully received.
>
> We may be better able to help you if you provide more specifics, in
> particular the compilation log.
>
> - anton

Hello Anton,

So far I have followed install.md

    BUILD_FROM=tarball
source ./install-deps.sh # install only the dependencies for a tarball
build
    ./configure
    make
    sudo make install
...
HOSTPREFIX="gcc" GFORTHD="./gforth-ditc -p .:~+:." GFORTH="./gforth-ditc --die-on-signal --debug-mcheck -p .:~+:. -i kernl64l.fi exboot.fs startup.fs arch/arm64/asm.fs arch/arm64/disasm.fs" includedir=`pwd`/include extrastuff=' -I'`pwd`/include/gforth/0.7.9_20220630/arm64 bindir=`pwd` libccdir=`pwd`/lib/gforth/0.7.9_20220630/arm64/libcc-named ./gforthmi gforth.fi --die-on-signal -p ".:~+:." -i kernl64l.fi exboot.fs startup.fs arch/arm64/asm.fs arch/arm64/disasm.fs


Segmentation fault: 11.


Segmentation fault: 11.


Segmentation fault: 11.
make: *** [gforth.fi] Error 1

Ok, no immediate known way to fix it.  You could try showing us the
output of

./gforth-ditc --die-on-signal --debug-mcheck -p .:~+:. -i kernl64l.fi
exboot.fs startup.fs arch/arm64/asm.fs arch/arm64/disasm.fs

at that point, but my guess is that it will be hard to fix without us
working directly on such a box.  I think we have access to such a box,
but it will take a few days.

- anton

Hello Anton,

Running

./gforth-ditc --die-on-signal --debug-mcheck -p .:~+:. -i kernl64l.fi
exboot.fs startup.fs arch/arm64/asm.fs arch/arm64/disasm.fs

immediately after running the makefile results in

Segmentation fault: 11.

and no other output. If the above command should be run from within the Makefile can you tell where it should be placed? I have attached the makefile (made by configure) used.

Having become very attached to recognizers on my 86 based desktop it would be wonderful to have them available on my M1 based laptop.

Best wishes and thanks,
Tristan





#Makefile for Gforth

#Authors: Bernd Paysan, Anton Ertl, Jens Wilke, David Kühling, Neal Crook, Gerald Wodni, Darren Bane
#Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021 Free Software Foundation, Inc.

#This file is part of Gforth.

#Gforth is free software; you can redistribute it and/or
#modify it under the terms of the GNU General Public License
#as published by the Free Software Foundation, either version 3
#of the License, or (at your option) any later version.

#This program 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 General Public License for more details.

#You should have received a copy of the GNU General Public License
#along with this program. If not, see http://www.gnu.org/licenses/.

# To change the values of `make' variables: instead of editing Makefiles,
# (1) if the variable is set in `config.status', edit `config.status'
#     (which will cause the Makefiles to be regenerated when you run `make');
# (2) otherwise, pass the desired values on the `make' command line.

# Warning:
# For some stupid reason setting SHELL to bash does not work properly with
# DOS. If you want to use shell-specific things that must run with DOS make
# an external batch file and call it with bash (see versions.bsh).

# ------------- gforth version

VERSION	= 0.7.9_20220630
DOSVERSION=`echo $(VERSION)|sed 's/\.//g'|sed 's/-.*//g'`
#release version (between releases this is the prospective next release) 
RVERSION = 1.0

# -------------	System specific variables	

machine=arm64
kernel_fi=kernl64l.fi
kernel_anti_dependence=gforth.fi
EXE=

# this is the type of machine
# used to extend the include path with ./arch/$machine
# so we can include a machine specific 
# machine.h file

PATHSEP = :

EC = 
ARCH= @ARCH@
EXT = $(EC)$(EXE)
LA = $(EC).la
EXTRAS= 
HOST= gcc
EXTRAPREFIX= /usr/local
FAST= no
PACKAGE_TARNAME= gforth

# ------------	Install Directories

package = $(DESTDIR)
VPATH = .
prefix = /usr/local
docdir= ${datarootdir}/doc/${PACKAGE_TARNAME}
exec_prefix = ${prefix}
srcdir = .
top_srcdir = .
top_builddir = .
bindir = $(package)${exec_prefix}/bin
#read-only architecture-independent files
datarootdir = ${prefix}/share
datadir = $(package)${datarootdir}
#read-only architecture-dependent non-ascii files
libdir = $(package)${exec_prefix}/lib
libccdir = $(subst $(package),,$(libdir)/gforth/$(VERSION)/$(machine)/libcc-named)
buildccdir = lib/gforth/$(VERSION)/$(machine)/libcc-named
includedir = $(package)${prefix}/include
infodir = $(package)${datarootdir}/info
htmldir = $(package)${docdir}
pdfdir = $(package)${docdir}
mandir = $(package)${datarootdir}/man
man1dir= $(mandir)/man1
man1ext= .1
#older emacses have their site-lisp in $(libdir)/emacs/
lispdir=
emacssitestartdir=
siteforthdir=$(libdir)/gforth/site-forth

# -------------	Utility programs

SHELL	= /bin/sh
RM	= rm
RMTREE	= rm -rf
CP	= cp -pf
MV	= mv
TOUCH   = touch -c
TAR	= tar cf -
MKDIR	= mkdir
MKDIR_P = ./install-sh -c -d
TIMEOUT =  
ACLOCAL_AMFLAGS = -I m4
INSTALL	= /usr/bin/install -c
INSTALL_PROGRAM = ${INSTALL}
MASSAGE_EXE = true
INSTALL_SCRIPT = ${INSTALL}
INSTALL_DATA = ${INSTALL} -m 644
INSTALL_INFO = /usr/bin/install-info
LN_S	= ln -s -f
M4      = m4 -s
GCC	= gcc-11
EMACS   = emacs
LIBTOOL = glibtool
PREFORTH	= ./preforth -p ".$(PATHSEP)~+$(PATHSEP)$(srcdir)"
CC	= $(GCC)
EXTRAPATH = $(PATHSEP)/usr/share/gforth/site-forth$(PATHSEP)/usr/local/share/gforth/site-forth
FORTHPATH = .$(PATHSEP)$(siteforthdir)$(PATHSEP)$(datadir)/gforth/site-forth$(PATHSEP)$(libdir)/gforth/$(VERSION)$(PATHSEP)$(datadir)/gforth/$(VERSION)$(EXTRAPATH)
FORTHSIZES = 
FORTHS_ARGS =  -p ".$(PATHSEP)$(realpath $(srcdir))$(PATHSEP)$(FORTHPATH)"
FORTH_ARGS = --die-on-signal $(FORTHS_ARGS)
ENGINE = ./gforth
DITCENGINE = ./gforth-ditc
FORTH	= $(ENGINE) $(FORTH_ARGS)
FORTHS	= $(ENGINE) $(FORTHS_ARGS)
# the (existing) forth system to use for cross compiling and primitives tables
# per default we use the one in this directory for a rebuild. It is also
# possible to override this variable at the command line for an initial build (jaw)
BUILDFORTH = $(ENGINE) --die-on-signal -m 4M -p ".$(PATHSEP)~+$(PATHSEP)$(srcdir)" -i $(kernel_fi)
# the forth system plus flags we use to build
FORTHB = $(BUILDFORTH) exboot.fs -e 'fpath= .|~+|$(srcdir)'
# the Forth system for running prims2x.fs
#FORTHP = $(FORTH)
ENGINE_FAST = ./gforth-fast$(EXT)
FORTH_FAST	= $(ENGINE_FAST) $(FORTH_ARGS)
FORTHKFLAGS= --die-on-signal -p ".$(PATHSEP)~+$(PATHSEP)$(srcdir)" -i $(kernel_fi)
FORTHK	= ./gforthker -p ".$(PATHSEP)~+$(PATHSEP)$(srcdir)"
#FORTHP	= $(ENGINE) --die-on-signal -i ./$(kernel_fi)
#the "-2 image-included-files +!" undoes the change to image-included-files
# in exboot.fs
STARTUP	= exboot.fs startup.fs arch/arm64/asm.fs arch/arm64/disasm.fs
STRIP	= strip
DOSTRIP = true

# -------------	Compiler Flags

XCFLAGS	= -g -O2 -fomit-frame-pointer -pthread 
XDEFINES = -DHAVE_CONFIG_H
SWITCHES = $(XCFLAGS) $(XDEFINES) $(OPTDEFINES) #-DNDEBUG #turn off assertions
ENGINE_FLAGS =  -fno-gcse -fcaller-saves -fno-defer-pop -fno-inline -fwrapv -fno-strict-aliasing -fno-cse-follow-jumps -fno-reorder-blocks -fno-reorder-blocks-and-partition -fno-toplevel-reorder -falign-labels=1 -falign-loops=1 -falign-jumps=1 -fno-delete-null-pointer-checks -fcf-protection=none -pthread -fno-defer-pop -fcaller-saves
DEBUGFLAG = 
CFLAGS	= $(DEBUGFLAG) -I$(srcdir)/engine -I$(srcdir)/arch/$(machine) -O3 -Wall $(SWITCHES) -DDEFAULTPATH='"$(FORTHPATH)"'
CPPFLAGS =  -I/opt/X11/include -I/opt/homebrew/opt/freetype/include/freetype2  -I/opt/homebrew/Cellar/harfbuzz/4.3.0/include/harfbuzz -I/opt/homebrew/opt/freetype/include/freetype2 -I/opt/homebrew/Cellar/graphite2/1.3.14/include -I/opt/homebrew/Cellar/glib/2.72.2/include/glib-2.0 -I/opt/homebrew/Cellar/glib/2.72.2/lib/glib-2.0/include -I/opt/homebrew/opt/gettext/include -I/opt/homebrew/Cellar/pcre/8.45/include -I/opt/homebrew/Cellar/libffi/3.4.2/include -I/opt/homebrew/Cellar/glib/2.72.2/include -I/opt/homebrew/Cellar/glib/2.72.2/include/glib-2.0 -I/opt/homebrew/Cellar/glib/2.72.2/lib/glib-2.0/include -I/opt/homebrew/opt/gettext/include -I/opt/homebrew/Cellar/pcre/8.45/include 

#John Wavrik should use -Xlinker -N to get a writable text (executable)
XLDFLAGS =  -pthread -L/opt/X11/lib -L/usr/local/lib
LDFLAGS	=  $(DEBUGFLAG) $(XLDFLAGS)
LDLIBS	= -ldl -lm 

STACK_CACHE_REGS = 3
STACK_CACHE_DEFAULT_FAST = 1

PROFOBJS = 
PROFEXES = 

INSTALLDIRS = kernel kernel-ec doc asm ec test test/fp \
	compat unix minos2 minos2/unicode minos2/tutorial \
	arch arch/generic arch/m68k arch/mips \
	arch/386 arch/hppa arch/sparc arch/power \
	arch/alpha arch/4stack arch/misc arch/6502 \
	arch/8086 arch/avr arch/c165 arch/h8 \
	arch/shboom arch/sharc arch/ia64 arch/amd64 \
	arch/arm arch/arm64 arch/r8c arch/lm32 arch/riscv
INSTALL_LIBDIRS = unix

INCLUDES = engine/forth.h engine/threaded.h engine/io.h engine/longlong.h \
	engine/symver.h

KERN_SRC = \
	mach32b.fs mach32l.fs mach64b.fs mach64l.fs \
	machpc.fs.in \
	kernel/aliases0.fs \
	kernel/args.fs \
	kernel/cond.fs \
	cross.fs \
	kernel/errore.fs \
	kernel/files.fs \
	kernel/require.fs \
	kernel/paths.fs \
	kernel/kernel.fs \
	kernel/main.fs \
	kernel/memory.fs \
	kernel/prim0.fs \
	search.fs \
	kernel/quotes.fs \
	kernel/tools.fs \
	kernel/toolsext.fs \
	kernel/vars.fs \
	kernel/accept.fs \
	kernel/basics.fs \
	kernel/int.fs \
	kernel/comp.fs \
	kernel/recognizer.fs \
	kernel/io.fs \
	kernel/input.fs \
	kernel/input-class.fs \
	kernel/license.fs \
	kernel/nio.fs \
	kernel/saccept.fs \
	kernel/doers.fs \
	kernel/getdoers.fs \
	kernel/copydoers.fs \
	kernel/pass.fs \
	kernel/header-methods.fs \
	kernel/xchars.fs \
	kernel/stringk.fs \
	kernel/termsize.fs

KERN_EC_SRC = kernel-ec/args.fs kernel-ec/basics.fs kernel-ec/cbr.fs	\
	kernel-ec/cbrpi.fs kernel-ec/cloop.fs kernel-ec/comp.fs		\
	kernel-ec/cond.fs kernel-ec/doers.fs kernel-ec/errore.fs	\
	kernel-ec/getdoers.fs kernel-ec/int.fs kernel-ec/io.fs		\
	kernel-ec/kernel.fs kernel-ec/license.fs kernel-ec/main.fs	\
	kernel-ec/nio.fs kernel-ec/pass.fs kernel-ec/quotes.fs		\
	kernel-ec/saccept.fs kernel-ec/toolsext.fs kernel-ec/tools.fs	\
	kernel-ec/vars.fs kernel-ec/version.fs

EC_SRC = $(KERN_EC_SRC) \
	asm/README \
	asm/bitmask.fs \
	asm/numref.fs \
	chains.fs \
	asm/basic.fs \
	asm/generic.fs \
	asm/target.fs \
	ec/README \
	ec/mirror.fs \
	ec/shex.fs \
	ec/builttag.fs \
	ec/dotx.fs \
	ec/nesting.fs \
	build-ec.in

GFORTH_FI_SRC1=\
	ansi.fs \
	assert.fs \
	backtrac.fs \
	blocked.fb \
	blocks.fs \
	bufio.fs \
	code.fs \
	debug.fs \
	debugs.fs \
	dis-gdb.fs \
	ekey.fs \

GFORTH_FI_SRC2=\
	savesys.fs \
	closures.fs \
	environ.fs \
	errors.fs \
	exboot.fs \
	except.fs \
	extend.fs \
	forward.fs \
	fold.fs \
	float.fs \
	glocals.fs \
	hash.fs \
	help.txt \
	history.fs \
	intcomp.fs \
	i18n.fs \
	iloops.fs \
	libcc.fs \
	locals.fs \
	locate1.fs \
	look.fs \
	marker.fs \
	mkdir.fs \
	obsolete.fs \
	prelude.fs \
	quotes.fs \
	rec-string.fs \
	rec-to.fs \
	rec-tick.fs \
	rec-body.fs \
	recognizer2.fs \
	search.fs \
	sections.fs \
	sections2.fs \
	see.fs \
	see-ext.fs \
	simp-see.fs \
	source.fs \
	stagediv.fs \
	startup.fs \
	str-exec.fs \
	string.fs \
	struct.fs \
	struct0x.fs \
	struct-val.fs \
	stuff.fs \
	substitute.fs \
	tasker.fs \
	table.fs \
	user-object.fs \
	utf-8.fs \
	vt100.fs \
	vt100key.fs \
	wordinfo.fs \
	gforthrc.fs \
	options.fs \
	smartdots.fs \
	status-line.fs	\
	mwords.fs \
	arch/386/asm.fs arch/386/disasm.fs \
	arch/amd64/asm.fs arch/amd64/disasm.fs \
	arch/alpha/asm.fs arch/alpha/disasm.fs arch/alpha/testasm.fs\
	arch/arm/asm.fs arch/arm/disasm.fs \
	arch/arm64/asm.fs arch/arm64/disasm.fs \
	arch/arm64/gpios.fs arch/arm64/spi.fs arch/arm64/i2c.fs \
	arch/arm/testdisasm.fs arch/arm/testdisasm.out arch/arm/Makefile \
	arch/mips/asm.fs arch/mips/disasm.fs arch/mips/insts.fs \
	arch/mips/testasm.fs arch/mips/testdisasm.fs \
	arch/power/asm.fs arch/power/disasm.fs arch/power/inst.fs \
	arch/lm32/asm.fs arch/lm32/testasm.fs \
	arch/riscv/asm.fs arch/riscv/disasm.fs \
	arch/riscv/inst16.fs arch/riscv/inst32.fs

# exclude envos.fs from list of distributed sources; don't include compat again
GFORTH_FI_DIST_SRC = \
	$(GFORTH_FI_SRC1) \
	$(GFORTH_FI_SRC2)

GFORTH_FI_SRC = \
	$(GFORTH_FI_SRC1) \
	envos.fs \
	$(GFORTH_FI_SRC2) \
	compat/caseext.fs \
	compat/strcomp.fs

SWIGMODULES =  x.fs xrandr.fs gles.fs png16.fs freetype_gl.fs
SWIGLIBS =  x.fs xrandr.fs png16.fs freetype_gl.fs
SWIG_WRAP = $(patsubst %.fs,unix/%-fsi.c,$(SWIGMODULES))

LIBCC_SRC1 = cstr.fs unix/socket.fs unix/pthread.fs unix/mmap.fs	\
	unix/serial.fs unix/filestat.fs unix/libc.fs unix/time.fs

LIBCC_SRC = $(patsubst %,unix/%,$(SWIGLIBS))

UNIXLIBS_SRC = unix/opengl.fs unix/opengles.fs unix/opengles3.fs	      \
	unix/jnilib.fs unix/soillib.fs unix/soil2lib.fs unix/android.fs	      \
	unix/openmax.fs unix/cpu.fs unix/png.fs unix/gpslib.fs unix/gstlib.fs \
	unix/stb-image.fs unix/stb-image-write.fs

SWIG_SRC = unix/androidlib.i unix/egl.i unix/gles.i unix/gles3.i unix/gl.i    \
	unix/glx.i unix/jni.i unix/omxal.i unix/openvg.i unix/png16.i	      \
	unix/soil.i unix/soil2.i unix/x.i unix/xrandr.i unix/SDL.i	      \
	unix/v4l2.i unix/ios-gles.i unix/ios-gles3.i unix/freetype_gl.i	      \
	unix/gdi32.i unix/user32.i unix/wayland.i unix/gps.i unix/vulkan.i    \
	unix/harfbuzz.i unix/gobject.i unix/gst.i unix/avcodec.i unix/pulse.i \
	unix/opus.i unix/va.i unix/va_glx.i unix/va_drm.i unix/va_x11.i	      \
	unix/opensles.i unix/spi.i unix/i2c.i

FREETYPE_GL_INCLUDE = freetype-gl/freetype-gl-errdef.h			   \
	freetype-gl/ftgl-utils.h freetype-gl/freetype-gl.h		   \
	freetype-gl/opengl.h freetype-gl/platform.h			   \
	freetype-gl/texture-atlas.h freetype-gl/texture-font.h		   \
	freetype-gl/utf8-utils.h freetype-gl/vec234.h freetype-gl/vector.h \
	freetype-gl/distance-field.h freetype-gl/edtaa3func.h
FREETYPE_GL_SRC = freetype-gl/ftgl-utils.c freetype-gl/platform.c	\
	freetype-gl/texture-atlas.c freetype-gl/texture-font.c		\
	freetype-gl/utf8-utils.c freetype-gl/distance-field.c		\
	freetype-gl/vector.c freetype-gl/edtaa3func.c $(FREETYPE_GL_INCLUDE)

EXTRA_DOC = code.fs objects.fs oof.fs moofglos.fs regexp.fs fft.fs \
	 mkdir.fs cilk.fs coverage.fs $(LIBCC_LIB_SRC)

LIBCC_DIST_SRC = $(SWIG_SRC) unix/test.i unix/Makefile.in unix/doexec	\
	unix/doprep

LIBCC_FORTH_SRC = libffi.fs fflib.fs $(UNIXLIBS_SRC) $(LIBCC_SRC1)
LIBCC_GEN_SRC = unix/stat.fs $(patsubst %, unix/%, $(SWIGMODULES))
LIBCC_LIB_SRC = $(patsubst %, unix/%, $(SWIGLIBS))  libffi.fs

LIBCC_BUILD_SRC = $(LIBCC_GEN_SRC)  libffi.fs
LIBCC_BUILD_LA = $(patsubst %.fs,$(buildccdir)/libgf%.la,$(shell echo $(LIBCC_LIB_SRC) $(LIBCC_SRC1) libcc.fs | sed -e s,unix/,,g))

LIBCC_BUILD_NOEC =  $(LIBCC_BUILD_SRC)

UNICODE_SRC = mirror.fs bidi.fs vertical.fs bidi-db.fs mirrors.fs bidis.fs   \
	verticals.fs unihan.fs unihan.db japanese.db japanese-tc.db brackets.fs brackets.db \
	quotation.db Makefile

MINOS2_TUTORIAL = tutorial.fs buttons.fs plots.fs markdown.fs

MINOS2_SRC = gl-helper.fs gl-terminal.fs jpeg-exif.fs linux-gl.fs	     \
	wayland-gl.fs soil-texture.fs gl-sample.fs gl-slideshow.fs	     \
	ftgl-helper.fs ftgl-sample.fs bidi.fs widgets.fs actors.fs	     \
	x11-actors.fs android-actors.fs wayland-actors.fs presentation.fs    \
	presentation-support.fs mts-tools.fs mkv-tools.fs omx-example.fs     \
	mkv-tags.fs android-recorder.fs animation.fs need-x.fs font-style.fs \
	text-style.fs gst-helper.fs plot.fs md-viewer.fs md-test.fs	     \
	mem-texture.fs pulse-audio.fs sles-audio.fs opus-codec.fs va.fs	     \
	v4l2.fs $(patsubst %, unicode/%, $(UNICODE_SRC))		     \
	$(pathsubst %, tutorial/%, $(MINOS2_TUTORIAL))

MINOS2_BIN = ascii.png button.png button2.png button3.png bad-gateway.png \
	net2o-minos2.png lbubble.png rbubble.png white.png thumb.png

TEST_SRC = tester.fs ttester.fs checkans.fs coretest.fs dbltest.fs	     \
	float.fs gforth.fs forward.fs other.fs postpone.fs read-line.fs	     \
	search.fs signals.fs stagediv.fs string.fs			     \
	primtest.fs coreext.fs deferred.fs coremore.fs gforth-nofast.fs	     \
	libcc.fs macros.fs fp/ak-fp-test.fth fp/fatan2-test.fs		     \
	fp/fpio-test.4th fp/fpzero-test.4th fp/ieee-arith-test.fs	     \
	fp/ieee-fprox-test.fs fp/paranoia.4th fp/readme-fp.txt		     \
	fp/runfptests.fth fp/to-float-test.4th fp/ttester.fs

UNIX_SRC = terminal-server.fs jni-helper.fs jni-tools.fs jni-media.fs	\
	jni-location.fs sensors.fs win32.fs wayland-interfaces.fs

FORTH_SRC = $(KERN_SRC) $(GFORTH_FI_DIST_SRC) $(EC_SRC) $(LIBCC_FORTH_SRC)    \
	$(patsubst %, minos2/%, $(MINOS2_SRC)) $(patsubst %, minos2/%,	      \
	$(MINOS2_BIN)) ans-report.fs ansi.fs answords.fs colorize.fs	      \
	comp-i.fs complex.fs depth-changes.fs dosekey.fs doskey.fs ds2texi.fs \
	envos.dos envos.os2 etags.fs fft.fs filedump.fs fi2c.fs forward.fs    \
	fsl-util.4th fsl-util.fs glosgen.fs gray.fs httpd.fs install-tags.fs  \
	make-app.fs doc/makedoc.fs locate.fs locate1.fs more.fs onebench.fs   \
	fft-bench.fs other.fs prims2x.fs prims2x0.6.2.fs proxy.fs random.fs   \
	regexp.fs regexp-test.fs sokoban.fs string.fs table.fs tags.fs tt.fs  \
	unbuffer.fs wordsets.fs 2012words.fs $(patsubst %, test/%,	      \
	$(TEST_SRC)) bubble.fs siev.fs matrix.fs fib.fs oof.fs oofsampl.fs    \
	objects.fs objexamp.fs mini-oof.fs moof-exm.fs moofglos.fs fixpath.fs \
	mini-oof2.fs moof2-example.fs scope.fs varues.fs callable.fs add.fs   \
	lib.fs oldlib.fs sieve.fs list.fs endtry-iferror.fs recover-endtry.fs \
	$(patsubst %, unix/%, $(UNIX_SRC)) date.fs script.fs wf.fs	      \
	traceall.fs rec-scope.fs rec-env.fs rec-meta.fs notfound.fs utf16.fs  \
	archive.fs cilk.fs fixfiles.fs bits.fs reverse-words.fs config.fs     \
	set-compsem.fs coverage.fs tokenize.fs startup-libcc.fs		      \
	status-line.fs unix/opensles-vals.fs recognizer-ext.fs

COMPAT = compat/README \
	compat/anslocal.fs \
	compat/assert.fs \
	compat/caseext.fs \
	compat/control.fs \
	compat/defer.fs \
	compat/exception.fs \
	compat/execute-parsing.fs \
	compat/loops.fs \
	compat/macros.fs \
	compat/required.fs \
	compat/strcomp.fs \
	compat/struct.fs \
	compat/vocabulary.fs \
	compat/stagediv.fs \
	compat/memory.4th \
	compat/find-name.fs

GFORTH_TEXI =  doc/gforth.texi doc/version.texi

VMGEN_TEXI = doc/vmgen.texi doc/version.texi doc/fdl.texi

ALLSUBDIRS = engine

ARCHS =	\
	arch/generic/machine.h \
	arch/m68k/machine.h \
	arch/mips/machine.h \
	arch/mips/check_prim.c \
	arch/386/machine.h \
	arch/386/android/AndroidManifest.xml.in \
	arch/386/android/config.sh \
	arch/386/android/build.sh \
	arch/386/android/starta.fs \
	arch/386/android/res \
	arch/386/android/src \
	arch/hppa/machine.h \
	arch/hppa/cache.c \
	arch/sparc/machine.h \
	arch/power/machine.h \
	arch/power/_sync_cache_range.c \
	arch/alpha/machine.h \
	arch/arm/machine.h \
	arch/arm/cacheflush0.c \
	arch/arm/cacheflush-linux.c \
	arch/arm/android/AndroidManifest.xml.in \
	arch/arm/android/config.sh \
	arch/arm/android/build.sh \
	arch/arm/android/starta.fs \
	arch/arm/android/res/drawable-hdpi/ic_launcher.png \
	arch/arm/android/res/drawable-ldpi/ic_launcher.png \
	arch/arm/android/res/drawable-mdpi/ic_launcher.png \
	arch/arm/android/res/drawable-xhdpi/ic_launcher.png \
	arch/arm/android/res/values/strings.xml \
	arch/arm/android/src/gnu/gforth/Gforth.java \
	arch/arm/ev3/config.sh \
	arch/ia64/machine.h \
	arch/ia64/flush_icache_block.c \
	arch/amd64/machine.h \
	arch/arm64/android/AndroidManifest.xml.in \
	arch/arm64/android/config.sh \
	arch/arm64/android/build.sh \
	arch/arm64/android/starta.fs \
	arch/arm64/android/res \
	arch/arm64/android/src \
	arch/arm64/machine.h \
	arch/arm64/cacheflush.c \
	arch/4stack/README \
	arch/4stack/asm.fs \
	arch/4stack/mach.fs \
	arch/4stack/prim.fs \
	arch/4stack/mach.sh \
	arch/4stack/relocate.fs \
	arch/misc/README \
	arch/misc/asm.fs \
	arch/misc/mach.fs \
	arch/misc/optcmove.fs \
	arch/misc/prim.fs \
	arch/misc/sim.fs \
	arch/misc/sokoban.fs \
	arch/misc/tt.fs \
	arch/6502/prim.fs \
	arch/6502/mach.fs \
	arch/shboom/asm.fs \
	arch/shboom/compiler.fs \
	arch/shboom/dis.fs \
	arch/shboom/mach.fs \
	arch/shboom/prim.fs \
	arch/shboom/dis2.fs \
	arch/shboom/sh.p \
	arch/shboom/doers.fs \
	arch/sharc/mach.fs \
	arch/sharc/machine.h \
	arch/sharc/compile.sharc \
	arch/sharc/systypes.h \
	arch/sharc/types.h \
	arch/sharc/g21k-3.3.4-bp1.diff \
	arch/r8c/asm.fs \
	arch/r8c/mach.fs \
	arch/r8c/errors.fs \
	arch/r8c/prim.fs \
	arch/r8c/asm-test.fs \
	arch/r8c/errors.fs \
	arch/r8c/lauflicht.fs \
	arch/r8c/tasker.fs \
	arch/r8c/terminal.fs \
	arch/r8c/tt.fs \
	arch/riscv/machine.h \
	arch/riscv/asm.fs \
	arch/riscv/disasm.fs \
	arch/riscv/inst16.fs \
	arch/riscv/inst32.fs \
	arch/sharc/unistd.h \
	arch/lm32/mach.fs \
	arch/lm32/mach.sh \
	arch/lm32/prim.fs \
	arch/lm32/Makefile \
	arch/lm32/testasm.disas-ok \
	engine/arm64-cacheflush.c \
	engine/arm-cacheflush0.c \
	engine/arm-cacheflush-linux.c \
	engine/hppa-cache.c \
	engine/ia64-flush_icache_block.c \
	engine/mips_check_prim.c \
	engine/power_sync_cache_range.c

#not included in distribution until distribution terms are included:
ARCHS_NO_DIST = \
	arch/6502/asm.fs \
	arch/6502/cold.fs \
	arch/6502/softuart.fs \
	arch/6502/zero.fs \
	arch/8086/asm.fs \
	arch/8086/mach.fs \
	arch/8086/mach.sh \
	arch/8086/prim.fs \
	arch/avr/asm.fs \
	arch/c165/asm.fs \
	arch/c165/mach.fs \
	arch/c165/prim.fs \
	arch/h8/asm.fs \
	arch/r8c/tt.fs

# temporary change.  DO NOT COMMIT
ARCHS += $(ARCHS_NO_DIST)

VMGEN_EX = vmgen-ex/Makefile vmgen-ex/README vmgen-ex/disasm.c \
	vmgen-ex/engine.c vmgen-ex/fib.mini \
	vmgen-ex/mini-inst.vmg vmgen-ex/mini-super.vmg vmgen-ex/mini.h \
	vmgen-ex/mini.l vmgen-ex/mini.y vmgen-ex/peephole-blacklist \
	vmgen-ex/peephole.c vmgen-ex/profile.c vmgen-ex/seq2rule.awk \
	vmgen-ex/simple.mini vmgen-ex/stat.awk vmgen-ex/support.c \
	vmgen-ex/test.mini vmgen-ex/test.out

VMGEN_EX2 = $(VMGEN_EX:vmgen-ex/%=vmgen-ex2/%)

ENGINE_SOURCES = engine/Makefile.in engine/config.h.in			\
	engine/engine.c engine/main.c engine/libmain.c engine/io.c	\
	engine/support.c engine/signals.c engine/libcc.h		\
	engine/gforth.h.in engine/profile.c engine/128bit.h		\
	engine/getopt.c engine/getopt1.c engine/getopt.h		\
	engine/select.c engine/memcmp.c engine/rint.c	                \
	engine/strtol.c engine/strtoul.c engine/ansidecl.h		\
	engine/memmove.c engine/exp10.c engine/atanh.c			\
	engine/cleanalign.c engine/strerror.c engine/strsignal.c	\
	engine/dblsub.c engine/fnmatch.h engine/fnmatch.c		\
	engine/zexpand.c engine/androidmain.c engine/sincos.c           \
	$(INCLUDES)

DOCKER = docker/runner/Dockerfile.in docker/runner/build.sh	\
	docker/builder/Dockerfile docker/builder/build.sh

SOURCES = $(ENGINE_SOURCES) compat Makefile.in Makedist.in unix/Makefile.in   \
	gforthmi.in gforthmi.sh.in vmgen.in preforth.in libforth.in	      \
	gforthker.in README.vmgen NEWS.vmgen autogen.sh configure.ac	      \
	configure config.sub config.guess elisp-comp stamp-h.in envos.fs.in   \
	kernel/version.fs.in iss.sh wininst.sh modpath.iss firewall.iss	      \
	install-sh INSTALL.md NEWS README README.md ToDo BUGS		      \
	BUILD-FROM-SCRATCH model COPYING COPYING.LIB COPYING.DOC AUTHORS      \
	ChangeLog Benchres aclocal.m4 ltmain.sh doc/Makefile.in		      \
	doc/gforth.texi.in $(wildcard $(srcdir)/doc/words/*-words)	      \
	doc/words/README doc/gforth.1 doc/gforth.css doc/version.texi.in      \
	doc/vmgen.texi doc/fdl.texi doc/gpl.texi gforth.el $(ARCHS)	      \
	siteinit.fs versions.bsh glosgen.glo doc/glossaries.doc $(FORTH_SRC)  \
	$(LIBCC_DIST_SRC) $(LIBCC_GEN_SRC) $(COMPAT) $(VMGEN_EX) $(VMGEN_EX2) \
	$(FREETYPE_GL_SRC) timings.sc test/coretest.out test/checkans.out     \
	test/gforth.out test/read-line.input test/read-line2.input	      \
	test/read-line.out test/fp/fptest.out $(wildcard		      \
	$(srcdir)/cache*.vmg) peeprules.vmg prim debian/rules		      \
	debian/control.in debian/changelog.in debian/compat gforth.ico	      \
	.travis.yml install-deps.sh install-swig.sh install-freetype-gl.sh    \
	$(SWIG_WRAP) m4/ax_gcc_builtin.m4 move-if-change $(DOCKER)

CONFIG_GEN = Makefile Makedist gforthmi gforthmi.sh vmgen preforth	\
	libforth gforthker engine/Makefile engine/gforth.h		\
	doc/version.texi doc/Makefile unix/Makefile debian/changelog	\
	debian/control build-ec $(CONFIG_FORTH)

CONFIG_FORTH = machpc.fs kernel/version.fs envos.fs

RCS_FILES =  ToDo model high-level

ENGINES = gforth$(EXT)  gforth-ditc$(EXT) gforth-itc$(EXT) $(PROFEXES)

ENGINES_FAST =  gforth-fast$(EXT)

LIBENGINES = $(ENGINES:%=lib%)
LIBENGINES_FAST = $(ENGINES_FAST:%=lib%)

GEN = $(ENGINES) $(ENGINES_FAST) gforth.elc

# things that need a working forth system to be generated
FORTH_GEN_ENGINE=engine/prim.i engine/prim_lab.i engine/prim_names.i \
	engine/prim_superend.i engine/profile.i \
	engine/prim_num.i engine/prim_grp.i \
	engine/costs.i engine/super2.i
FORTH_GEN_ENGINE_FAST= engine/prim-fast.i \
	engine/prim_lab-fast.i engine/prim_names-fast.i \
	engine/prim_superend-fast.i engine/profile-fast.i \
	engine/prim_num-fast.i engine/prim_grp-fast.i \
	engine/costs-fast.i engine/super2-fast.i
FORTH_GEN_PRIMB = $(FORTH_GEN_ENGINE) kernel/aliases.fs kernel/prim.fs\
	kernel/authors.fs
FORTH_GEN0 = prim.b $(FORTH_GEN_PRIMB)
FORTH_GEN_FAST = prim-fast.b $(FORTH_GEN_ENGINE_FAST)
FORTH_GEN =  $(FORTH_GEN0) kernl32l.fi kernl32b.fi kernl64l.fi kernl64b.fi gforth.fi
# this is used for antidependences,
FORTH_GEN1 = $(FORTH_GEN0) kernl64l.fi build-ec

#kernel dependencies
KERN_DEPS = $(KERN_SRC) kernel/aliases.fs kernel/version.fs kernel/authors.fs \
	machpc.fs $(FORTH_GEN0) compat/strcomp.fs

#distributed documentation
DOCDIST = doc/gforth.info $(wildcard doc/gforth.info-*) doc/gforth.ps \
	  doc/gforth.txt doc/vmgen.info doc/vmgen.ps

BKERNLS = kernl32b$(EC).fi kernl32l$(EC).fi \
	  kernl64b$(EC).fi kernl64l$(EC).fi

KERNLS = kernl32b$(EC).fi- kernl32l$(EC).fi- \
	 kernl64b$(EC).fi- kernl64l$(EC).fi-

# -------------        Make forth images
GEN_PRECIOUS = $(FORTH_GEN) $(KERNLS) \
	doc/gforth.texi doc/gforth.dvi doc/gforth.ps \
	doc/vmgen.dvi doc/vmgen.ps \
	$(CONFIG_GEN) configure

#search path pattern

vpath %.fs $(srcdir):.:$(srcdir)/unix:$(srcdir)/test:unix

#standards.info recommends this:
.SUFFIXES:
.SUFFIXES: .c .o

all: kernel/version.fs more  doc start-gforth.el check extras

# use this dependency for phony targets just as mostlyclean,...
FORCE: ;

#targets of failed commands should be deleted:
.DELETE_ON_ERROR:

#this rule avoids remaking everything after minor changes in Makefile.in
#disabled now, as it doesn't have the wanted effect
#version:	Makefile.in configure.ac
#		echo $(VERSION) > $@

# With dos we use normal dos echo
# we cannot pipe the output to engine/version.h directly because
# of the "/ and \" problem. Copying works because we use the
# shell und file utilities.

#kernel/version.fs:	version
#	echo ": version-string s\" $(VERSION)\" ;" > kernel/version.fs

more:	$(ENGINES) $(FORTH_GEN) $(GEN) libgforths build-libcc-named

#from the gcc Makefile: 
#"Deletion of files made during compilation.
# There are four levels of this:
#   `mostlyclean', `clean', `distclean' and `realclean'.
# `mostlyclean' is useful while working on a particular type of machine.
# It deletes most, but not all, of the files made by compilation.
# It does not delete libgcc.a or its parts, so it won't have to be recompiled.
# `clean' deletes everything made by running `make all'.
# `distclean' also deletes the files made by config.
# `realclean' also deletes everything that could be regenerated automatically."

mostlyclean:	FORCE
		-$(RMTREE) engine/*.s gforth.fi *.fi~ *.fi- kernel/version.fs \
		kernel/authors.fs *TAGS gforth~ \
		doc/crossdoc.fd doc/doc.fd doc/gforth.texi doc/gforth.fns \
		doc/gforth.aux doc/gforth.cp doc/gforth.cps \
		doc/gforth.dvi doc/gforth.fn doc/gforth.ky doc/gforth.log \
		doc/gforth.pg \
		doc/gforth.toc doc/gforth.tp doc/gforth.vr html \
		gforth-$(VERSION).tar.gz
		(cd unix && $(MAKE) clean)

# Just the stuff needed to rebuild the documentation nac03feb1999
docclean:	FORCE
		-$(RMTREE) doc/crossdoc.fd doc/doc.fd doc/gforth.texi doc/gforth.fns \
		doc/gforth.aux doc/gforth.cp doc/gforth.cps \
		doc/gforth.dvi doc/gforth.fn doc/gforth.ky doc/gforth.log \
		doc/gforth.pg \
		doc/gforth.toc doc/gforth.tp doc/gforth.vr html

clean:		mostlyclean
	-$(RMTREE) $(GEN) *.o engine/*.o engine/*.lo engine/*.la \
	engine/.libs engine/libgforth* libgforth* arch/*/*.o \
	gforth-itc-noll$(EXT)  engine/gforth-itc-noll$(EXT)  \
	gforth-ditc-noll$(EXT) engine/gforth-ditc-noll$(EXT) \
	gforth-prof-noll$(EXT) engine/gforth-prof-noll$(EXT) \
	engine/prim-s.i $(FORTH_GEN_ENGINE) $(FORTH_GEN_ENGINE_FAST)
	for i in gforth gforth-fast; do for j in $(OPTS); do rm -f engine/$$i$${j}$(EXT) $$i$${j}$(EXT); done; done
	-$(RMTREE) $(buildccdir)
	(cd unix; $(MAKE) clean)

distclean:	clean
		-$(RMTREE) config.cache config.log config.status	\
		engine/config.h engine/gforth.h Makefile Makedist	\
		engine/Makefile stamp-h engine/stamp-h doc/version.texi	\
		gforthmi vmgen preforth $(FORTH_GEN0) $(FORTH_GEN_FAST)	\
		start-gforth.el
		-(cd libltdl && make distclean)

#realclean is useless, but dangerous, so it's commented out
realclean:	distclean
		-$(RMTREE) $(GEN_PRECIOUS) `cat .cvsignore`

kernel-clean:
		-$(RMTREE) $(KERNLS) $(BKERNLS)

fresh: kernel-clean all

#mostlyclean, but also remove some of the stuff that is distributed
virtualclean:	mostlyclean
		-$(RMTREE) gforth.fns gforth.texi gforth.ps gforth.info* \
		gforth-$(VERSION).tar.gz config.cache *~ */*~

maintainer-clean: realclean

#Some makes (Ultrix, SunOS, IRIX) are so broken, they cannot read the
#Makefile if it contains our dist rules.  Therefore we have put these
#rules in Makedist (you can use them with GNU make on these systems).

debdist:

setup-debdist docdist htmldist dist: doc

dist srcdist srconlydist docdist htmldist bindist binonlydist debdist setup-debdist:		Makedist FORCE
		$(MAKE) -f Makedist d$@

#HPUX make breaks the cycle differently when the dates are equal, so
# touch some of the files if it acts up
hpux-workaround:
	$(TOUCH) $(FORTH_GEN_PRIMB)

#strip gforth, because the debugging stuff is hardly useful once
# gforth manages to execute more than a few primitives.

#install does not depend on gforth.info, because that would require
#supplying a lot of files that can be easily generated (only info is
#hard to generate).
#we rebuild gforth.fi, because it contains some path names.
#we delete $build/gforth.fi and $build/install.TAGS after installation because of ownership.
normal-install:
		$(NORMAL_INSTALL)

INSTEXES=gforth gforth-fast gforth-itc gforth-ditc
INSTSCRIPTS=gforthmi vmgen
INSTSUFFIX="" -$(VERSION) -$(machine) -$(VERSION)-$(machine)

rm-install:
		-for i in $(INSTEXES); do \
		    for j in $(INSTSUFFIX); do \
		        $(RM) $(bindir)/$$i$$j$(EXT); \
		    done \
		done
		-for i in $(INSTSCRIPTS); do \
		    for j in $(INSTSUFFIX); do \
		        $(RM) $(bindir)/$$i$$j; \
		    done \
		done

install-prog-bins:
		for i in $(INSTEXES); do \
		    $(INSTALL_PROGRAM) $$i$(EXT) $(bindir)/$$i-$(VERSION)-$(machine)$(EXT); \
		    $(MASSAGE_EXE) $(bindir)/$$i-$(VERSION)-$(machine)$(EXT) || true; \
		done
		$(INSTALL_SCRIPT) gforthmi $(bindir)/gforthmi-$(VERSION)-$(machine)
		$(INSTALL_SCRIPT) vmgen $(bindir)/vmgen-$(VERSION)

install-progs:
		for i in $(INSTEXES) gforthmi; do \
		    for j in "" -$(VERSION) -$(machine); do \
		        (cd $(bindir) && $(LN_S) $$i-$(VERSION)-$(machine)$(EXT) $$i$$j$(EXT)); \
		    done \
		done
		(cd $(bindir) && $(LN_S) vmgen-$(VERSION) vmgen)

install-sources:
		-for i in doc/gforth.info* doc/vmgen.info*; do $(INSTALL_DATA) $$i $(infodir); done
		for i in $(FORTH_SRC) $(COMPAT) prim; do \
			$(INSTALL_DATA) $(srcdir)/$$i $(datadir)/gforth/$(VERSION)/$$i; \
		done

install-gensources:
		for i in $(LIBCC_GEN_SRC) envos.fs machpc.fs; do \
			$(INSTALL_DATA) $$i $(libdir)/gforth/$(VERSION)/$$i; \
		done
		for i in kernel/prim.fs kernel/aliases.fs kernel/version.fs kernel/authors.fs; do \
			$(INSTALL_DATA) $$i $(datadir)/gforth/$(VERSION)/$$i; \
		done
		$(INSTALL_DATA) $(srcdir)/siteinit.fs $(siteforthdir)/siteinit.fs

install-txt:	txt
		$(INSTALL_DATA) doc/gforth.txt $(datadir)/gforth/$(VERSION)/doc/gforth.txt

install-images: install-txt
		$(INSTALL_DATA) $(kernel_fi) $(libdir)/gforth/$(VERSION)
		HOSTPREFIX="$(HOST)" GFORTHD="$(DITCENGINE)$(EXT) -p $(siteforthdir)$(PATHSEP)$(siteforthdir)$(PATHSEP)$(datadir)/gforth/$(VERSION)$(PATHSEP)$(libdir)/gforth/$(VERSION) -i $(kernel_fi)" GFORTH="$(DITCENGINE)$(EXT) -p $(siteforthdir)$(PATHSEP)$(siteforthdir)$(PATHSEP)$(datadir)/gforth/$(VERSION)$(PATHSEP)$(libdir)/gforth/$(VERSION) --die-on-signal --debug-mcheck -i $(kernel_fi) exboot.fs startup.fs" includedir=$(subst $(package),,$(includedir)) bindir=$(subst $(package),,$(bindir)) libccdir=$(libccdir) GFORTHPATH=.:"$$GFORTHPATH" GFORTHDESTDIR="$(package)" ./gforthmi gforth.fi.install $(FORTHSIZES) $(STARTUP) fixfiles.fs
		$(INSTALL_DATA) gforth.fi.install $(libdir)/gforth/$(VERSION)/gforth.fi

install-include:
		$(MKDIR_P) $(includedir)/gforth/$(VERSION)/$(machine) $(includedir)/freetype-gl
		$(INSTALL_DATA) engine/config.h $(srcdir)/engine/libcc.h $(includedir)/gforth/$(VERSION)/$(machine)
		$(INSTALL_DATA) engine/gforth.h $(includedir)
		for i in $(FREETYPE_GL_INCLUDE); do \
		$(INSTALL_DATA) $(srcdir)/$$i $(includedir)/freetype-gl; done

install-libcc:
		if test -n "$(LIBTOOL)"; then for i in $(LIBCC_SRC1) $(LIBCC_LIB_SRC); do \
		   $(LIBTOOL) --silent --mode=install $(INSTALL) $(buildccdir)/libgf`basename $$i .fs`.la `(cd $(package)$(libccdir); pwd)`/libgf`basename $$i .fs`.la; \
		done; fi

install-man:
		-$(INSTALL_DATA) $(srcdir)/doc/gforth.1 $(man1dir)

install-info:	doc
		$(MKDIR_P) $(infodir)
		$(INSTALL_INFO) --info-dir=$(infodir) doc/gforth.info $(infodir)/gforth.info
		$(INSTALL_INFO) --info-dir=$(infodir) doc/vmgen.info $(infodir)/vmgen.info

install-html:	html
		$(MKDIR_P) $(htmldir)/html
		$(CP) doc/gforth/* $(htmldir)/html
		$(MKDIR_P) $(htmldir)/../vmgen/html
		$(CP) doc/vmgen/* $(htmldir)/../vmgen/html

install-pdf:	pdf
		$(MKDIR_P) $(pdfdir)
		$(MKDIR_P) $(pdfdir)/../vmgen
		$(CP) doc/gforth.pdf $(pdfdir)
		$(CP) doc/vmgen.pdf $(pdfdir)/../vmgen/

install-tags:	install.TAGS
		$(INSTALL_DATA) install.TAGS $(datadir)/gforth/$(VERSION)/TAGS

install-elc:
		@if test -n ""; then \
			$(MKDIR_P) $(lispdir); \
			for i in gforth.el gforth.elc; do \
				$(INSTALL_DATA) $$i $(lispdir); \
			done; \
		else \
			echo '>>>>>Please install gforth.{el,elc} in your .../emacs/site-lisp directory'; \
		fi
		@if test -n ""; then \
			$(MKDIR_P) $(emacssitestartdir); \
			for i in start-gforth.el; do \
				$(INSTALL_DATA) $$i $(emacssitestartdir) || true; \
			done; \
		else \
			echo '>>>>>Please install start-gforth.{el,elc} in your .../emacs/.../site-start.d directory'; \
		fi

installdeps:	gforth$(EXT) $(FORTH_SRC) $(kernel_fi) gforthmi vmgen doc/gforth.1 prim gforth.fi start-gforth.el build-libcc-named

install-indep:	installdeps installdirs-indep install-sources install-man install-elc

install-arch:	installdeps installdirs-arch normal-install rm-install install-prog-bins install-gensources install-images install-include install-libcc install-tags libinstall extra-install

install-seq:	install-indep install-arch install-txt install-info

post-inst:
		$(RM) TAGS gforth.TAGS install.TAGS prim.TAGS gforth.fi.install start-gforth.el*
		-$(RM) libgforth*
		$(POST_INSTALL)
		@test 0$$SUDO_UID -ne 0 && find . -user root | sed -e 's/^/failed to clean: /g' || true
		@echo
		@echo
		@echo "============= INSTALL SUCCEEDED ============="
		@echo "Bash users: type 'hash -r' to empty the cache"

install:	installdeps install-seq install-progs post-inst

installnodep:	installdirs install-seq install-progs post-inst

install-strip:	install

libinstall:	$(ENGINES:%$(EXT)=lib%$(EXT)) $(ENGINES_FAST:%$(EXT)=lib%$(EXT))
		for i in $(ENGINES:%$(EXT)=lib%$(EC)) $(ENGINES_FAST:%$(EXT)=lib%$(EC)); do \
		   $(LIBTOOL) --silent --mode=install $(INSTALL) engine/$$i.la `(cd $(libdir); pwd)`/$$i.la; \
		done

installdirs:	installdirs-arch installdirs-indep

installdirs-arch:
		$(NORMAL_INSTALL)
		for i in $(bindir) $(libdir)/gforth/$(VERSION) $(siteforthdir) $(siteforthdir) $(package)$(libccdir); do \
			$(MKDIR_P) $$i; \
		done
		for i in $(INSTALL_LIBDIRS); do \
			$(MKDIR_P) $(libdir)/gforth/$(VERSION)/$$i; \
		done

installdirs-indep:
		$(NORMAL_INSTALL)
		for i in $(man1dir) $(infodir) $(datadir)/gforth/$(VERSION) $(datadir)/gforth/site-forth; do \
			$(MKDIR_P) $$i; \
		done
		for i in $(INSTALLDIRS); do \
			$(MKDIR_P) $(datadir)/gforth/$(VERSION)/$$i; \
		done

#deinstall all files specific to this version of gforth
#to uninstall version foo, type `make uninstall VERSION=foo'
uninstall:	FORCE
		$(NORMAL_UNINSTALL)
		-$(RMTREE) $(libdir)/gforth/$(VERSION) $(datadir)/gforth/$(VERSION) $(includedir)/gforth/$(VERSION)/$(machine)
		-for i in "$(EXT)" -$(VERSION)$(EXT) -$(machine)$(EXT) -$(VERSION)-$(machine)$(EXT); do $(RM) $(bindir)/gforth$$i $(bindir)/gforth-fast$$i $(bindir)/gforth-itc$$i $(bindir)/gforth-ditc$$i $(bindir)/gforthmi$$i ; done
		-$(RM) $(bindir)/vmgen-$(VERSION)
		-$(RMTREE) $(incdir)/gforth/$(VERSION)/$(machine)
		@echo "To remove Gforth completely, type\n$(RMTREE) $(man1dir)/gforth.1 $(infodir)/gforth.info* $(datadir)/gforth $(libdir)/gforth $(bindir)/vmgen"

# Extra dependency for libraries that use libc
$(buildccdir)/libgfmmap.la: $(buildccdir)/libgflibc.la
$(buildccdir)/libgfpthread.la: $(buildccdir)/libgflibc.la
$(buildccdir)/libgfserial.la: $(buildccdir)/libgflibc.la
$(buildccdir)/libgfsocket.la: $(buildccdir)/libgflibc.la

$(buildccdir)/libgf%.la: %.fs $(FORTH_GEN) $(GEN) $(LIBCC_LIB_SRC) libforth
		-./libforth $(package)$(libccdir) $< -e bye
		-$(TOUCH) $@

$(buildccdir)/libgflibcc.la: test/libcc.fs $(FORTH_GEN) $(GEN) $(LIBCC_LIB_SRC) libforth
		-./libforth $(package)$(libccdir) $< -e bye
		-$(TOUCH) $@

build-libcc-named libcc: build-libcc-swig $(LIBCC_BUILD_LA) libccdir

libccdir:	$(buildccdir)

$(buildccdir):
		$(MKDIR_P) $(buildccdir)

build-libcc-swig: $(LIBCC_GEN_SRC)

$(LIBCC_GEN_SRC):
		(cd unix; $(MAKE) $(patsubst unix/%,%,$@))

check:		gforths	gforth.fi more
		$(MAKE) checkones
		@echo "*** Check successful ***"
		./gforth-fast$(EXT) --diag -e '."     in gforth-fast" cr bye'
		./gforth$(EXT) --diag -e '."     in gforth" cr bye'
		./libgforth-fast$(EXT) --diag -e '."     in libgforth-fast" cr bye'
		./libgforth$(EXT) --diag -e '."     in libgforth" cr bye'

checkones:	checkg checkgi checkgdi checkgf checkgd checkgfd checklibg checklibgi checklibgdi checklibgf checklibgd checklibgfd

CHECK = >$@.check 2>&1 || cat $@.check this-file-does-not-exist 2>/dev/null

checklibg:
		$(MAKE) checkone check-nofast ENGINE="./libgforth$(EXT) --no-dynamic" $(CHECK)
		-@$(RM) $@.check

checklibgi:
		$(MAKE) checkone check-nofast ENGINE="./libgforth-itc$(EXT)" $(CHECK)
		-@$(RM) $@.check

checklibgdi:
		$(MAKE) checkone check-nofast ENGINE="./libgforth-ditc$(EXT)" $(CHECK)
		-@$(RM) $@.check

checklibgf:
		$(MAKE) checkone ENGINE="./libgforth-fast$(EXT) --no-dynamic" $(CHECK)
		-@$(RM) $@.check

checklibgd:
		$(MAKE) checkone check-nofast ENGINE="./libgforth$(EXT)" $(CHECK)
		-@$(RM) $@.check

checklibgfd:
		$(MAKE) checkone ENGINE="./libgforth-fast$(EXT)" $(CHECK)
		-@$(RM) $@.check

checkg:
		$(MAKE) checkone check-nofast ENGINE="./gforth$(EXT) --no-dynamic" $(CHECK)
		-@$(RM) $@.check

checkgi:
		$(MAKE) checkone check-nofast ENGINE="./gforth-itc$(EXT)" $(CHECK)
		-@$(RM) $@.check

checkgdi:
		$(MAKE) checkone check-nofast ENGINE="./gforth-ditc$(EXT)" $(CHECK)
		-@$(RM) $@.check

checkgf:
		$(MAKE) checkone ENGINE="./gforth-fast$(EXT) --no-dynamic" $(CHECK)
		-@$(RM) $@.check

checkgd:
		$(MAKE) checkone check-nofast ENGINE="./gforth$(EXT)" $(CHECK)
		-@$(RM) $@.check

checkgfd:
		$(MAKE) checkone ENGINE="./gforth-fast$(EXT)" $(CHECK)
		-@$(RM) $@.check

checkone test: gforth.fi engine/prim-s.i
		$(TIMEOUT) $(FORTH) test/tester.fs test/coretest.fs test/postpone.fs test/dbltest.fs test/string.fs test/float.fs test/deferred.fs test/coreext.fs test/search.fs -e bye 2>/dev/null | tr -d '\015' | diff -r -u - $(srcdir)/test/coretest.out
		$(TIMEOUT) $(FORTH) test/other.fs -e bye
		$(TIMEOUT) $(FORTHS) test/signals.fs -e bye
		$(TIMEOUT) $(FORTHS) test/coremore.fs test/gforth.fs test/macros.fs -e bye 2>&1 | tr -d '\015' | diff -u $(srcdir)/test/gforth.out -
		$(TIMEOUT) $(FORTH) code.fs test/checkans.fs -e bye | tr -d '\015' | diff -u $(srcdir)/test/checkans.out -
		$(TIMEOUT) $(FORTH) prims2x.fs -e \
		  "c-flag on s\" prim.i\" out-filename 2! s\" prim.b\" ' output-c ' output-c-combined process-file bye"| \
		  tr -d '\015' | grep -v '^#line '|diff -u engine/prim-s.i -
		-$(TIMEOUT) $(FORTH) test/fp/runfptests.fth -e bye | diff -u $(srcdir)/test/fp/fptest.out - || echo "Floating point test failed"
		$(TIMEOUT) $(FORTHS) test/read-line.fs -e bye | diff -u - $(srcdir)/test/read-line.out

check-nofast: gforth.fi
		$(TIMEOUT) $(FORTHS) test/gforth-nofast.fs -e bye

test/primtest.fi: test/primtest.fs mach32l.fs cross.fs
		$(TIMEOUT) $(FORTHB) -e 's" mach32l.fs"' $(srcdir)/test/primtest.fs -e "save-cross $@ $(bindir)/gforth-$(VERSION) bye"

primtest:	gforth test/primtest.fi FORCE
		(echo rs|ENVVAR=bla ./gforth -i test/primtest.fi); echo $$?

bench:		gforth-fast$(EXT) gforth.fi
		@echo 'Each benchmark takes about 30s on a 486-66 (gcc-2.6.3 -DFORCE_REG)'
		time $(FORTH_FAST) siev.fs -e "main bye"
		time $(FORTH_FAST) bubble.fs -e "main bye"
		time $(FORTH_FAST) matrix.fs -e "main bye"
		time $(FORTH_FAST) fib.fs -e "main bye"
		time $(FORTH_FAST) fft-bench.fs -e "main bye"

onebench one-bench:
	$(FORTH_FAST) onebench.fs

threebench 3-bench:
	$(FORTH_FAST) onebench.fs -e "run-bench cr run-bench cr bye"

all-bench allbench:
	./gforth-fast$(EXT) --dynamic onebench.fs
	./libgforth-fast$(EXT) --dynamic onebench.fs
	./gforth-fast$(EXT) --no-dynamic onebench.fs
	./libgforth-fast$(EXT) --no-dynamic onebench.fs
	./gforth$(EXT) --dynamic onebench.fs
	./libgforth$(EXT) --dynamic onebench.fs
	./gforth$(EXT) --no-dynamic onebench.fs
	./libgforth$(EXT) --no-dynamic onebench.fs
	./gforth-itc$(EXT) onebench.fs
	./libgforth-itc$(EXT) onebench.fs
	./gforth-ditc$(EXT) onebench.fs
	./libgforth-ditc$(EXT) onebench.fs

EXTRAVARS="GCC=$(GCC)" "CFLAGS=$(XCFLAGS)" "LIBTOOL=$(LIBTOOL)" "HOST=$(HOST)" "SRC=$(shell pwd)" "ENGINE=$(DITCENGINE) -i $(shell pwd)/gforth.fi" "LIBCCNAMED=$(shell pwd)/$(buildccdir)" "libccdir=$(libccdir)" "package=$(package)" "PREFIX=$(EXTRAPREFIX)" "datadir=$(datadir)/gforth/$(VERSION)" "ARCH=" "FAST=$(FAST)" "GFVER=$(VERSION)"

extras:	gforth.fi $(EXTRAS:%=%.extras)

%.extras:
	cd $(@:%.extras=%); \
	$(MAKE) -f ./Makefile configs $(EXTRAVARS); \
	$(MAKE) -f ./Makefile all $(EXTRAVARS);

extra-install:	gforth.fi $(EXTRAS:%=%.extrasinst)

%.extrasinst:
	cd $(@:%.extrasinst=%); $(MAKE) -f ./Makefile extra-install $(EXTRAVARS)

# -------------	Make forth images

kernel/authors.fs:	AUTHORS Makefile.in
	echo ": authors ( -- ) cr" >kernel/authors.fs
	echo "  \G show the list of authors" >>kernel/authors.fs
	grep '^[ND]:' $< | sed -e 's/^N: \(.*\)/  1 attr\! ." \1:" 0 attr\! cr /g' -e 's/^D: \(.*\)/  ."   \1" cr /g'>>kernel/authors.fs
	echo ";" >>kernel/authors.fs

# How to make new images:
# 1. Produce an image called kernlXYZ.fi-
#    the original kernel.fi is not touched because it's needed for creation
# 2. copy old kernlXYZ.fi to kernlXYZ.fi~
#    that's a backup copy in case the new kernels don't work
# 3. copy new kernels to kernlXYZ.fi
#    these are the ones we want to use now

kernl32l$(EC).fi-:	$(KERN_DEPS) mach32l.fs preforth
		-$(CP) kernl32l$(EC).fi kernl32l$(EC).fi~
		$(PREFORTH) -e 's" mach32l.fs" include $(srcdir)/kernel/main.fs' -e "save-cross kernl32l$(EC).fi- $(bindir)/gforth-$(VERSION) bye"

kernl32b$(EC).fi-:	$(KERN_DEPS) mach32b.fs preforth
		-$(CP) kernl32b$(EC).fi kernl32b$(EC).fi~
		$(PREFORTH) -e 's" mach32b.fs" include $(srcdir)/kernel/main.fs' -e "save-cross kernl32b$(EC).fi- $(bindir)/gforth-$(VERSION) bye"

kernl64l$(EC).fi-:	$(KERN_DEPS) mach64l.fs preforth
		-$(CP) kernl64l$(EC).fi kernl64l$(EC).fi~
		$(PREFORTH) -e 's" mach64l.fs" include $(srcdir)/kernel/main.fs' -e "save-cross kernl64l$(EC).fi- $(bindir)/gforth-$(VERSION) bye"

kernl64b$(EC).fi-:	$(KERN_DEPS) mach64b.fs preforth
		-$(CP) kernl64b$(EC).fi kernl64b$(EC).fi~
		$(PREFORTH) -e 's" mach64b.fs" include $(srcdir)/kernel/main.fs' -e "save-cross kernl64b$(EC).fi- $(bindir)/gforth-$(VERSION) bye"

# Atomic copy, as kernel might be loaded concurrently
kernl%$(EC).fi:	kernl%$(EC).fi-
		-$(CP) $< $@+
		-$(MV) $@+ $@
		-$(TOUCH) $@

#Solaris make does not like that:
kernl-%.fi:	arch/%/mach.fs arch/%/prim.fs arch/%/asm.fs $(KERN_SRC) kernel/version.fs $(FORTH_GEN0) preforth kernl64l.fi
		$(PREFORTH) -e 's" $<" include $(srcdir)/kernel-ec/main.fs' -e "save-cross $@- $(bindir)/gforth-$(VERSION) bye"
		if [ -f `echo $< | sed s/fs/sh/` ]; \
		then sh `echo $< | sed s/fs/sh/` $@; \
		else $(CP) $@- $@; \
		fi

#SunOS make does not like that
#arch/%/mach.fs:	arch/%/prim.fs arch/%/asm.fs

gforth.fi:	$(kernel_fi) gforthmi gforth-ditc$(EXT) $(GFORTH_FI_SRC) comp-i.fs
		HOSTPREFIX="$(HOST)" GFORTHD="$(DITCENGINE)$(EXT) -p .$(PATHSEP)~+$(PATHSEP)$(srcdir)" GFORTH="$(DITCENGINE)$(EXT) --die-on-signal --debug-mcheck -p .$(PATHSEP)~+$(PATHSEP)$(srcdir) -i $(kernel_fi) $(STARTUP)" includedir=`pwd`/include extrastuff=' -I'`pwd`/include/gforth/$(VERSION)/$(machine) bindir=`pwd` libccdir=`pwd`/$(buildccdir) ./gforthmi gforth.fi $(FORTHSIZES) $(FORTHKFLAGS) $(STARTUP)

# -------------	Make c-engine

prim.b:		prim cache0.vmg Makefile.in preforth.in
		(cd $(srcdir) && $(M4) -Dcondbranch_opt=0 prim) >$@
#		sleep 1 #should make hpux-workaround unnecessary

prim-fast.b:	prim cache-fast$(STACK_CACHE_DEFAULT_FAST).vmg cache-regs$(STACK_CACHE_REGS).vmg peeprules.vmg Makefile.in preforth.in gforth$(EXT)
		(cd $(srcdir) && $(M4) -Dcondbranch_opt=1 -DSTACK_CACHE_FILE=cache-fast$(STACK_CACHE_DEFAULT_FAST).vmg -DSTACK_CACHE_REGS=cache-regs$(STACK_CACHE_REGS).vmg prim) >$@
#		sleep 1 #should make hpux-workaround unnecessary

engine/prim.i:	prim.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" prim.i\" save-mem out-filename 2! s\" "$<"\" ' output-c ' output-c-combined process-file bye" >$@

# normal prim rules

engine/prim_lab.i:	prim.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" "$<"\" ' output-label dup process-file bye" >$@

engine/prim_grp.i:	prim.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" "$<"\" ' noop dup process-file bye" >$@

engine/prim_names.i:	prim.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" "$<"\" ' output-forthname dup process-file bye" >$@

engine/prim_superend.i:	prim.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" "$<"\" ' output-superend dup process-file bye" >$@

engine/profile.i:	prim.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" "$<"\" ' output-profile ' output-profile-combined process-file bye" >$@

engine/super2.i:	prim.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" "$<"\" ' output-super2-simple ' output-super2-combined process-file bye" >$@

engine/costs.i:	prim.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" "$<"\" ' output-costs-gforth-simple ' output-costs-gforth-combined process-file bye" >$@

engine/prim_num.i:	prim.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" "$<"\" ' output-c-prim-num ' noop process-file bye" >$@

prim_effects.fs: prim.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag off s\" "$<"\" ' output-stack-effects ' noop process-file bye" >$@

# fast prim rules...

engine/prim-fast.i:	prim-fast.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" prim-fast.i\" save-mem out-filename 2! s\" "$<"\" ' output-c ' output-c-combined process-file bye" >$@

engine/prim_lab-fast.i:	prim-fast.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" "$<"\" ' output-label dup process-file bye" >$@

engine/prim_grp-fast.i:	prim-fast.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" "$<"\" ' noop dup process-file bye" >$@

engine/prim_names-fast.i:	prim-fast.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" "$<"\" ' output-forthname dup process-file bye" >$@

engine/prim_superend-fast.i:	prim-fast.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" "$<"\" ' output-superend dup process-file bye" >$@

engine/profile-fast.i:	prim-fast.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" "$<"\" ' output-profile ' output-profile-combined process-file bye" >$@

engine/super2-fast.i:	prim-fast.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" "$<"\" ' output-super2-simple ' output-super2-combined process-file bye" >$@

engine/costs-fast.i:	prim-fast.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" "$<"\" ' output-costs-gforth-simple ' output-costs-gforth-combined process-file bye" >$@

engine/prim_num-fast.i:	prim-fast.b prims2x.fs
	$(PREFORTH) prims2x.fs -e "c-flag on s\" "$<"\" ' output-c-prim-num ' noop process-file bye" >$@

engine/prim-s.i: engine/prim.i
		grep -v '^#line ' $< >$@

kernel/aliases.fs:	prim.b prims2x.fs kernel/aliases0.fs preforth.in
		$(CP) $(srcdir)/kernel/aliases0.fs $@-
		$(PREFORTH) prims2x.fs -e "forth-flag on s\" prim.b\" ' output-alias ' noop process-file bye" >>$@-
		$(MV) $@- $@

kernel/prim.fs:	prim.b prims2x.fs kernel/prim0.fs preforth.in
		$(CP) $(srcdir)/kernel/prim0.fs kernel/prim.fs-
		$(PREFORTH) prims2x.fs -e "forth-flag on s\" prim.b\" ' output-forth ' output-forth-combined process-file bye" >>$@-
		$(MV) $@- $@


OPTS =  -ll-reg -noll-reg -ll -noll

MAKELINE-ll-reg   = OPT=-ll-reg OPTDEFINES="-DFORCE_LL -DFORCE_REG" OPTOBJECTS=
MAKELINE-noll-reg = OPT=-noll-reg OPTDEFINES=-DFORCE_REG OPTOBJECTS=dblsub.o
MAKELINE-ll       = OPT=-ll OPTDEFINES=-DFORCE_LL OPTOBJECTS=
MAKELINE-noll     = OPT=-noll OPTDEFINES= OPTOBJECTS=dblsub.o
MAKELINE-itc      = OPT=-noll OPTDEFINES= OPTOBJECTS=dblsub.o
MAKELINE-ditc     = OPT=-noll OPTDEFINES= OPTOBJECTS=dblsub.o

FIRSTOBJECTS = io.o signals.o  ${LIBOBJDIR}arm64-cacheflush$U.o ${LIBOBJDIR}exp10$U.o ${LIBOBJDIR}sincos$U.o support-ll.o support-noll.o support-ll-reg.o support-noll-reg.o dblsub.o libmain.o

GFORTHOBJECTS = $(patsubst %,engine/%,$(FIRSTOBJECTS))
GFORTHLIBOBJECTS = $(patsubst %.o,engine/lib%.lo,$(FIRSTOBJECTS))

$(GFORTHOBJECTS) $(GFORTHLIBOBJECTS):
	(cd engine; $(MAKE) $(patsubst engine/%,%,$@))

gforth$(EXT): $(ENGINE_SOURCES) $(FORTH_GEN0) engine/config.h $(kernel_anti_dependence) $(GFORTHOBJECTS)

gforth$(OPT)$(EXT): $(GFORTHOBJECTS)
	if test -z "$(OPT)"; then \
		for i in $(OPTS); do $(RM) gforth$${i}$(EXT); $(MAKE) DOSTRIP=$(DOSTRIP) optgforth OPT=$$i && $(CP) gforth$${i}$(EXT) $@ && break; done; \
	else \
		(cd engine && $(MAKE) DOSTRIP=$(DOSTRIP) $@ ) && \
		$(CP) engine/$@ $@ && \
		($(MASSAGE_EXE) $@ || true); \
		true; \
		 $(MAKE) checkone check-nofast ENGINE=./engine/$@; \
	fi
	$(DOSTRIP) $@

.PHONY: optgforth optgforth-fast

optgforth: $(GFORTHOBJECTS)
	$(MAKE) gforth$(OPT)$(EXT) $(MAKELINE$(OPT))

gforth-fast$(EXT): $(ENGINE_SOURCES) $(FORTH_GEN_FAST) engine/config.h $(GFORTHOBJECTS)

gforth-fast$(OPT)$(EXT): $(GFORTHOBJECTS)
	if test -z "$(OPT)"; then \
		for i in $(OPTS); do $(RM) gforth-fast$${i}$(EXT); $(MAKE) DOSTRIP=$(DOSTRIP) optgforth-fast OPT=$$i && $(CP) gforth-fast$${i}$(EXT) $@ && break; done; \
	else \
		(cd engine && $(MAKE) DOSTRIP=$(DOSTRIP) $@ ) && \
		$(CP) engine/$@ $@ && \
		($(MASSAGE_EXE) $@ || true); \
		true; \
		 $(MAKE) checkone ENGINE=./engine/$@; \
	fi
	$(DOSTRIP) $@

optgforth-fast: $(GFORTHOBJECTS)
	$(MAKE) DOSTRIP=$(DOSTRIP) gforth-fast$(OPT)$(EXT) $(MAKELINE$(OPT))

gforth-itc$(EXT): $(ENGINE_SOURCES) $(FORTH_GEN_ENGINE) engine/Makefile engine/config.h $(GFORTHOBJECTS)
	cd engine && $(MAKE) DOSTRIP=$(DOSTRIP) gforth-itc-noll$(EXT) $(MAKELINE-itc)
	$(CP) engine/gforth-itc-noll$(EXT) $@
	$(DOSTRIP) $@
	true

gforth-ditc$(EXT): $(ENGINE_SOURCES) $(FORTH_GEN_ENGINE) engine/Makefile engine/config.h $(GFORTHOBJECTS)
	cd engine && $(MAKE) DOSTRIP=$(DOSTRIP) gforth-ditc-noll$(EXT) $(MAKELINE-ditc)
	$(CP) engine/gforth-ditc-noll$(EXT) $@
	$(DOSTRIP) $@
	true

gforth-prof$(EXT): $(ENGINE_SOURCES) $(FORTH_GEN_ENGINE) engine/Makefile engine/config.h $(GFORTHOBJECTS)
	cd engine && $(MAKE) DOSTRIP=$(DOSTRIP) gforth-prof-noll$(EXT) $(MAKELINE-noll)
	$(CP) engine/gforth-prof-noll$(EXT) $@
	$(DOSTRIP) $@

gforths: $(GFORTHOBJECTS) $(ENGINES) $(ENGINES_FAST)

libgforth$(EXT): $(ENGINE_SOURCES) $(FORTH_GEN_ENGINE) engine/config.h $(kernel_anti_dependence) $(GFORTHLIBOBJECTS)

libgforth$(OPT)$(EXT): $(ENGINE_SOURCES) $(GFORTHLIBOBJECTS)
	if test -z "$(OPT)"; then \
		for i in $(OPTS); do $(MAKE) DOSTRIP=$(DOSTRIP) optlibgforth OPT=$$i && $(MAKE) optlibgforth2 OPT=$$i && $(LN_S) engine/$@ $@ && break; done; \
	else \
		(cd engine && $(MAKE) DOSTRIP=$(DOSTRIP) $@ ); \
		 $(MAKE) checkone check-nofast ENGINE=./engine/$@; \
	fi

optlibgforth: $(GFORTHLIBOBJECTS)
	$(MAKE) libgforth$(OPT)$(EXT) $(MAKELINE$(OPT))

optlibgforth2: $(GFORTHLIBOBJECTS)
	(cd engine && $(MAKE) libgforth$(EXT) $(MAKELINE$(OPT)))

libgforth-fast$(EXT): $(ENGINE_SOURCES) $(FORTH_GEN_ENGINE_FAST) engine/config.h $(GFORTHLIBOBJECTS)

libgforth-fast$(OPT)$(EXT): $(ENGINE_SOURCES) $(GFORTHLIBOBJECTS)
	if test -z "$(OPT)"; then \
		for i in $(OPTS); do $(MAKE) DOSTRIP=$(DOSTRIP) optlibgforth-fast OPT=$$i && $(MAKE) optlibgforth-fast2 OPT=$$i && $(LN_S) engine/$@ $@ && break; done; \
	else \
		(cd engine && $(MAKE) DOSTRIP=$(DOSTRIP) $@ ); \
		 $(MAKE) checkone ENGINE=./engine/$@; \
	fi

optlibgforth-fast: $(GFORTHLIBOBJECTS)
	$(MAKE) libgforth-fast$(OPT)$(EXT) $(MAKELINE$(OPT))

optlibgforth-fast2: $(GFORTHLIBOBJECTS)
	(cd engine && $(MAKE) libgforth-fast$(EXT) $(MAKELINE$(OPT)))

libgforth-itc$(EXT): $(ENGINE_SOURCES) $(FORTH_GEN_ENGINE) engine/Makefile engine/config.h $(GFORTHLIBOBJECTS)
		cd engine && $(MAKE) libgforth-itc$(EXT) $(MAKELINE-itc)
		$(LN_S) engine/$@ $@
		$(MASSAGE_EXE) $@ || true

libgforth-ditc$(EXT): $(ENGINE_SOURCES) $(FORTH_GEN_ENGINE) engine/Makefile engine/config.h $(GFORTHLIBOBJECTS)
		cd engine && $(MAKE) libgforth-ditc$(EXT) $(MAKELINE-ditc)
		$(LN_S) engine/$@ $@
		$(MASSAGE_EXE) $@ || true

libgforth-prof$(EXT): $(ENGINE_SOURCES) $(FORTH_GEN_ENGINE) engine/Makefile engine/config.h $(GFORTHLIBOBJECTS)
		cd engine && $(MAKE) libgforth-prof$(EXT) $(MAKELINE-noll)
		$(LN_S) engine/$@ $@
		$(MASSAGE_EXE) $@ || true

.PHONY: libgforths
libgforths:	$(GFORTHLIBOBJECTS) $(LIBENGINES) $(LIBENGINES_FAST)

# ------------- additional C primitives

.SUFFIXES:	.c .pri

%.c:            %.pri gforth$(EXT) prim2cl.fs
		$(FORTHK) prim2cl.fs -e "file $< altogether bye" >$@

%.so:		%.c
		$(GCC) -shared $(CFLAGS) $(CPPFLAGS) $< -o $@

# -------------	Make Documentation

#TAGS is a GNU standard target
TAGS:		gforth.fi gforth.TAGS
		$(CP) gforth.TAGS $@

tags:		gforth.fi gforth.tags
		$(CP) gforth.tags $@

install.TAGS:	TAGS install-tags.fs preforth kernl64l.fi
		sed 's;^\$(srcdir)/;;' TAGS|$(PREFORTH) -e 's" '${datarootdir}/gforth/$(VERSION)/'"' $(srcdir)/install-tags.fs -e bye >install.TAGS

MINOS_ROOT =	 minos2/widgets.fs

gforth.TAGS:	kernl64l.fi gforth$(EXT) $(GFORTH_FI_SRC) $(LIBCC_BUILD_SRC) $(patsubst %, minos2/%, $(MINOS2_SRC)) prim.TAGS kernel.TAGS
		includedir=`pwd`/include extrastuff=' -I'`pwd`/include/gforth/$(VERSION)/$(machine) $(FORTHK) etags.fs except.fs startup.fs $(LIBCC_BUILD_NOEC) $(MINOS_ROOT) -e bye
		cat TAGS prim.TAGS kernel.TAGS >gforth.TAGS
		rm TAGS

gforth.tags:	kernl64l.fi gforth$(EXT) $(GFORTH_FI_SRC) $(patsubst %, minos2/%, $(MINOS2_SRC)) prim.tags kernel.tags
		$(FORTHK) tags.fs except.fs startup.fs $(LIBCC_BUILD_NOEC) $(MINOS_ROOT) -e bye
		cat tags prim.tags kernel.tags >gforth.tags
		rm tags

prim.TAGS: 	prim.b prims2x.fs preforth kernl64l.fi
		$(PREFORTH) prims2x.fs -e "s\" prim.b\" ' output-tag dup process-file bye"|sed 's#^./prim#prim#' >$@-
		$(MV) $@- $@

prim.tags: 	prim.b prims2x.fs preforth kernl64l.fi
		$(PREFORTH) prims2x.fs -e "s\" prim.b\" ' output-vi-tag dup process-file bye" >$@-
		$(MV) $@- $@

kernel.TAGS kernel.tags:
		-$(RM) kernl64l.fi-
		$(MAKE) kernl64l.fi-

#elc files
gforth.elc:	gforth.el
		-$(EMACS) --batch --no-site-file -f batch-byte-compile gforth.el

start-gforth.el:	gforth.el
		echo > $@
		-$(EMACS) --batch -l autoload --eval "(setq generated-autoload-file \"$$PWD/$@\")" -f batch-update-autoloads $(dir $<)

#Documentation

doc/doc.fd:	doc/makedoc.fs gforth$(EXT) $(GFORTH_FI_SRC) $(EXTRA_DOC) $(LIBCC_GEN_SRC)
		$(FORTHK) -e "s\" doc/doc.fd.tmp\"" doc/makedoc.fs except.fs startup.fs $(EXTRA_DOC) -e bye
		$(srcdir)/move-if-change doc/doc.fd.tmp $@

doc/crossdoc.fd:	$(KERN_SRC) gforth$(EXT) kernel/version.fs $(FORTH_GEN0)
		$(FORTHK) -e 's" mach32l.fs" include kernel/main.fs' -e bye
		$(srcdir)/move-if-change doc/crossdoc.fd.tmp $@

#call explicitly on machine with libffi and ffcall
doc/words/$(RVERSION)-words: gforth$(EXT) $(GFORTH_FI_SRC) $(EXTRA_DOC) $(LIBCC_GEN_SRC)
		$(FORTHS) $(EXTRA_DOC) -e "locals-types words c-lib words see-voc words environment words forth words bye" >$@-
		$(MV) $@- $@

doc/gforth.texi: doc/gforth.texi.in prim.b ds2texi.fs prims2x.fs \
		doc/doc.fd doc/crossdoc.fd preforth kernl64l.fi \
		$(wildcard $(srcdir)/doc/words/0.*-words)
		$(PREFORTH) ds2texi.fs prims2x.fs -e "s\" prim.b\" ' register-doc ' noop process-file" doc/crossdoc.fd doc/doc.fd -e "args-gforth-versions s\" $(srcdir)/doc/gforth.texi.in\" r/o open-file throw ds2texi bye" $(wildcard $(srcdir)/doc/words/*-words) >$@-
		$(MV) $@- $@

checkdoc:	doc/gforth.texi.in prim.b ds2texi.fs prims2x.fs doc/doc.fd doc/crossdoc.fd answords.fs doc/gforth.texi
		$(FORTH) ds2texi.fs prims2x.fs -e "s\" prim.b\" ' register-doc ' noop process-file" doc/crossdoc.fd doc/doc.fd answords.fs -e bye
		-grep unknown doc/gforth.texi
		-grep doc- doc/gforth.texi| grep -v '^@c'

doc/gforth.txt:	txt

doc pdf ebook dvi txt ps html: $(GFORTH_TEXI) $(VMGEN_TEXI) doc/Makefile
		-cd doc; $(MAKE) $@

# For an explanation of the following Makefile rules, see node
# `Automatic Remaking' in GNU Autoconf documentation.

#Note: no target "$(srcdir)/configure", because that does not trigger 
#unless $(srcdir)!="."
configure: configure.ac aclocal.m4
	cd $(srcdir) && autoconf

$(srcdir)/aclocal.m4:	configure.ac
	cd $(srcdir) && aclocal $(ACLOCAL_AMFLAGS)

# autoheader might not change config.h.in, so touch a stamp file.
engine/config.h.in: stamp-h.in
stamp-h.in: configure.ac aclocal.m4
	cd $(srcdir) && autoheader
	echo timestamp > $(srcdir)/stamp-h.in

engine/config.h: stamp-h
stamp-h: engine/config.h.in config.status stamp-h.in
	./config.status

$(CONFIG_GEN): Makefile.in Makedist.in engine/Makefile.in doc/Makefile.in unix/Makefile.in gforthmi.in vmgen.in preforth.in libforth.in gforthker.in machpc.fs.in doc/version.texi.in config.status configure.ac envos.fs.in build-ec.in engine/gforth.h.in gforthmi.sh.in kernel/version.fs.in engine/config.h.in
	./config.status

config.status: configure
	./config.status --recheck

ChangeLog.git: FORCE
	git log --name-only --date=short --pretty=format:'%cd -%d %s <%an> %h%n%b' --abbrev-commit >ChangeLog.git

Reply via email to