# GNU-Makefile fr CLISP mit GNU-ANSI-C-Compiler
# Jrg Hhle 6.10.94
# Optionen: GCC26, C20, WIDE, HIGH, KI, KA, LMEM
#  HIGH => C20
#  WIDE => C20
# keeping intermediate files means keeping assembly files
ifdef KI
KA=1
endif

ifdef HIGH
C20=1
endif
ifdef WIDE
C20=1
endif

ifndef C20
MPFLAGS=-Dmc68010
MCFLAGS=-m68000
MAFLAGS=-mc68010
else
MPFLAGS=-Dmc68010 -DMC680Y0
MCFLAGS=-m68020
MAFLAGS=-mc68020
endif

WPFLAGS=
ifdef WIDE
WPFLAGS=-DWIDE -DHAVE_LONGLONG
endif
ifdef HIGH
WPFLAGS=-DAMIGA3000
endif

IXCFLAGS= >NIL: -a -.

ifdef GCC26
# Use GCC259/GCC26
# Path GNU:bin/ GNU:lib/gcc-lib/mc68000-cbm-amigados/2.5.90/
IXCONFIG=GNU:ixem/bin/ixconfig
CC  = gcc
CPP = cpp -undef -D__GNUC__=2 -D__GNUC_MINOR__=5 -lang-c -v
CC1 = cc1 -version
AS  = as

CPPSTACK = 20000
CC1STACK = 400000
LDSTACK  = 180000

INCPATH=-I. -IAB:usr/include/Amiga31 -IGCC258:os-include -IBen:p/gccsmalllib/include -IGCC258:include
LD     = ld $(LIBPATH) $(CRT0)
LIBPATH=-nostdlib -LBen:p/gccsmalllib/lib
LIBS   =-lclisp
CRT0   =Ben:p/gccsmalllib/lib/crt0.o

else
# Use GCC25x
# Path GCC258:bin/ GCC258:lib/gcc-lib/amigados/2.5.8/
# PATH=/GCC258/bin:/GCC258/lib/gcc-lib/amigados/2.5.8:/C
IXCONFIG=GCC258:gnu/ixem/bin/ixconfig
CC  = gcc
CPP = cpp -undef -D__GNUC__=2 -D__GNUC_MINOR__=5 -lang-c -v
CC1 = cc1 -version
AS  = as

CPPSTACK = 20000
CC1STACK = 380000
LDSTACK  = 180000

INCPATH=-I. -IAB:usr/include/Amiga31 -IGCC258:os-include -IBen:p/gccsmalllib/include -IGCC258:include
LD     = ld $(LIBPATH) $(CRT0)
LIBPATH=-nostdlib -LBen:p/gccsmalllib/lib
LIBS   =-lclisp
CRT0   =Ben:p/gccsmalllib/lib/crt0.o
endif


CPPFLAGS = -Wcomment -nostdinc $(INCPATH) -D__OPTIMIZE__ -DSTDC_HEADERS -Damiga -DNO_CLISP_H $(MPFLAGS) $(WPFLAGS)
CC1FLAGS = -quiet -O2 -W -Wimplicit -Wreturn-type -Wswitch -Wcomment -Wpointer-arith\
 -ffixed-a4 -fomit-frame-pointer -fno-strength-reduce $(MCFLAGS)
ASFLAGS  = $(MAFLAGS)
LDFLAGS  =
CFLAGS   = $(LDFLAGS) $(CPPFLAGS) $(CC1FLAGS)

TMPDIR   = T:
FSTMPDIR = RAM:

COMMENT = /utils/comment5
ANSIDECL = /utils/ansidecl
PRESTACK = 20000

# Remote file prefix
R=/src/

D_INC_MACHINE = amiga.d
D_INC_SPECIAL = amiga2.d
D_INC_FURTHER = avl.d sort.d ari68000.d ari68020.d arilev1e.d arilev1i.d
D_INC_NORMAL = lispbibl.d fsubr.d subr.d pseudofun.d constsym.d \
 constobj.d constpack.d aridecl.d arilev0.d $(D_INC_MACHINE)
D_INC_ALL = $(D_INC_NORMAL) $(D_INC_SPECIAL) $(D_INC_FURTHER)
#D_LISPARIT = arilev1c.d arilev1e.d arilev1i.d arlev1m.d $(D_ARI)
ifdef C20
D_AMODULES = ari68020.d
else
D_AMODULES = ari68000.d
endif
D_EMODULES = # affi.d
D_CMODULES_SPECIAL = rexx.d
D_CMODULES = spvw.d spvwtabf.d spvwtabs.d spvwtabo.d \
 eval.d control.d pathname.d stream.d io.d error.d \
 array.d hashtabl.d list.d package.d record.d sequence.d \
 charstrg.d debug.d misc.d predtype.d symbol.d dbxtypes.d \
 lisparit0.d modules.d $(D_CMODULES_SPECIAL) $(D_EMODULES)
#D_MODULES = $(D_CMODULES) $(D_AMODULES)
DFILES_OTHERARIT = \
 aridecl.d arilev0.d arilev1.d intelem.d intlog.d intplus.d \
 intcomp.d intbyte.d intmal.d intdiv.d intgcd.d int2adic.d \
 intsqrt.d intprint.d intread.d rational.d sfloat.d ffloat.d \
 dfloat.d lfloat.d flo_konv.d flo_rest.d realelem.d realrand.d \
 realtran.d compelem.d comptran.d
RDFILES_OTHERARIT = $(addprefix $(R),$(DFILES_OTHERARIT))

C_INC_SPECIAL = $(subst .d,.c,$(D_INC_SPECIAL))
C_INC_NORMAL = $(subst .d,.c,$(D_INC_NORMAL))
C_INC_ALL = $(subst .d,.c,$(D_INC_ALL))

OBJECTS_SPECIAL = $(subst .d,.o,$(D_CMODULES_SPECIAL))
OBJECTS_C = $(subst .d,.o,$(D_CMODULES))
OBJECTS_A = $(subst .d,.o,$(D_AMODULES))
OBJECTS = $(OBJECTS_C) $(OBJECTS_A)

LSPFILES = \
 init.lsp defseq.lsp backquot.lsp defmacro.lsp macros1.lsp macros2.lsp \
 defs1.lsp places.lsp floatpri.lsp type.lsp defstruc.lsp format.lsp \
 user1.lsp user2.lsp trace.lsp macros3.lsp config.lsp compiler.lsp \
 timezone.lsp defs2.lsp clos.lsp conditio.lsp defs3.lsp gstream.lsp \
 loop.lsp rexx.lsp
FASFILES = $(subst .lsp,.fas,$(LSPFILES))
RFASFILES = $(addprefix $(R),$(FASFILES))

IMEMFILE = interpreted.mem
CMEMFILE = compiled.mem
CLISPEXE = lisp.run
DMEMFILE = compiled.mem_

.SUFFIXES: .d .lsp

# No need to make .d or .lsp files
%.d:

%.lsp:

#%.c: $(R)%.d

all: init allc allo lisp.run

#init: .NEVER

allc: $(C_INC_ALL)

allo: $(OBJECTS)

# Various dependencies
$(OBJECTS_C): $(C_INC_NORMAL)

$(OBJECTS_SPECIAL): $(C_INC_SPECIAL)

spvw.o: avl.c sort.c

modules.o: $(R)modules.h

lisparit0.o: ari68000.c ari68020.c arilev1e.c arilev1i.c

.PHONY: all init allc allo clean force

$(R)lisparit1.d: $(R)lisparit.d
	head >$@ -19 $<
$(R)lisparit2.d: $(R)lisparit.d
	tail >$@ +53 $<
$(R)lisparit0.d: $(R)lisparit1.d $(RDFILES_OTHERARIT) $(R)lisparit2.d
	join $(R)lisparit1.d $(RDFILES_OTHERARIT) $(R)lisparit2.d as $@

# In order to save diskspace, we don't keep intermediary .c, .i or .s files

# Make all include files
$(C_INC_ALL): %.c: $(R)%.d
	stack $(PRESTACK)
#	Named pipes make it slower!
#	run $(COMMENT) $(R)$*.d >FIFO:prepclisp/mwek
#	$(ANSIDECL) <FIFO:prepclisp/r >$@
#	run $(COMMENT) $(R)$*.d >PIPE:prepclisp
#	$(ANSIDECL) <PIPE:prepclisp/r >$@
	$(COMMENT) $(R)$*.d $(FSTMPDIR)$*.dc
	$(ANSIDECL) <$(FSTMPDIR)$*.dc >$@
	delete $(FSTMPDIR)$*.dc

# Make all assembly objects
# Here only when .c is available
$(OBJECTS_A): %.o: %.c
	stack $(CPPSTACK)
	$(CPP) -DUNDERSCORE $(CPPFLAGS) $*.c $(TMPDIR)$*.s
	stack $(CC1STACK)
	$(AS) $(ASFLAGS) -o $@ $(TMPDIR)$*.s
	delete $(TMPDIR)$*.s

# Make all C objects
$(OBJECTS_C) testd.o testn.o: %.o: $(R)%.d
	@date
	stack $(PRESTACK)
	$(COMMENT) $(R)$*.d $(FSTMPDIR)$*.dc
	$(ANSIDECL) <$(FSTMPDIR)$*.dc >$(TMPDIR)$*.c
	delete $(FSTMPDIR)$*.dc
ifdef LMEM
	@avail >nil: flush
	@$(IXCONFIG) $(IXCFLAGS)
endif
	stack $(CPPSTACK)
	$(CPP) $(CPPFLAGS) $(TMPDIR)$*.c $(TMPDIR)$*.i
ifndef KI
	delete $(TMPDIR)$*.c
endif
ifdef LMEM
	@avail >nil: flush
	@$(IXCONFIG) $(IXCFLAGS)
endif
	stack $(CC1STACK)
	-$(CC1) $(CC1FLAGS) -o $(TMPDIR)$*.s $(TMPDIR)$*.i
ifndef KI
	delete $(TMPDIR)$*.i
endif
ifdef YES_HIGH
	copy $(TMPDIR)$*.s to $(FSTMPDIR)$*.es
#	Some lines are too long for Edit
	sed >$(TMPDIR)$*.s -e "s/^I.even/^I.align 2/" $(FSTMPDIR)$*.es
	delete $(FSTMPDIR)$*.es
endif
	$(AS) $(ASFLAGS) -o $@ $(TMPDIR)$*.s
ifndef KA
	delete $(TMPDIR)$*.s
endif

lisp.run: $(OBJECTS)
	@date
	stack $(LDSTACK)
	$(LD) $(LDFLAGS) -o $@ $(OBJECTS) $(LIBS)

testd: testd.o
	stack $(LDSTACK)
	$(LD) $(LDFLAGS) -o $@ $*.o $(LIBS)

testn: testn.o
	stack 300000
	$(CC) -v -o $@ $*.o -lc

# make an interpreted world
$(IMEMFILE):
	@avail >nil: flush
	@date
	$(CLISPEXE) -x (cd"/src/")(load"init.lsp")(saveinitmem)(exit)
	@date
	mv $(R)lispinit.mem $@

# compile LISP files
$(RFASFILES): %.fas: %.lsp
	@avail >nil: flush
	@date
	$(CLISPEXE) -M $(DMEMFILE) -c $*.lsp
	@date

# make a compiled world
$(CMEMFILE): $(RFASFILES)
	@avail >nil: flush
	@date
	$(CLISPEXE) -x (cd"/src/")(load"init.fas")(saveinitmem)(exit)
	@date
	mv $(R)lispinit.mem $@

clean:
	delete $(C_INC_ALL) $(OBJECTS)
force:
