OBJ=	hd.o tl.o null.o fst.o snd.o \
	maxint.o And.o Or.o Max.o Min.o Sum.o Times.o \
	choplist.o combine.o concmap.o count.o filter.o \
	itlist.o itos.o itosf.o length.o map.o mem.o rev.o \
	reverse.o revitlist.o \
	member.o sublist.o random.o randlist.o \
	leftadj.o rightadj.o space.o split.o splitat.o stoi.o stoil.o take.o \
	assoc.o assocdef.o assocfun.o for.o isalnum.o isalpha.o iscntrl.o \
	isdigit.o islower.o isprint.o ispunct.o isspace.o isupper.o \
	select.o until.o while.o transpose.o \
	abs.o from.o intersect.o difference.o union.o \
	lex.o rotate.o rept.o automat.o odd.o \
	conc.o group.o mapstate.o \
	head.o tail.o index.o mix.o \
	takeword.o translit.o listrec.o reduce.o sort.o tsort.o \
	show.o scan.o last.o all.o exists.o getenv.o not.o \
	anysame.o allsame.o map2.o mapfst.o mapsnd.o partition.o \
	mkset.o subsets.o permutations.o nil.o \
	curry.o uncurry.o \
	force.o argv.o envp.o \
	trace.o trace_c.o openfile.o catch.o throw.o \
	termcap.o termcap_c.o termcap_M.o tofile.o \
	failexit_M.o hiatonic.o delay.o max.o min.o seq.o Pfrom.o \
	Array.o Array_m.o \
	dialog_c.o dialog_M.o dialog.o concargs.o bin.o readchan.o \
	bignum.o Integer.o integerfunc.o stoI.o Itos.o apm.o floatfunc.o
NSOBJ =	Numset.o NS/listtoset.o NS/add.o NS/union.o NS/intsect.o NS/sub.o \
        NS/mem.o NS/upperlim.o NS/issubset.o NS/isempty.o
FOBJ =	Float_dir/Float.o Float_dir/stof.o Float_dir/stof_c.o \
	Float_dir/ftos.o Float_dir/ftos_c.o Float_dir/itof.o \
	Float_dir/ftoi.o Float_dir/ftosf.o Float_dir/ftosf_c.o \
	Float_dir/func.o Float_dir/func_c.o Float_dir/fmtf.o Float_dir/fmtf_c.o \
	pi.o
# some machines doest not support floating point, remove FOBJ in that case
AOBJ = $(OBJ) $(FOBJ)
INCLUDES = OK FILE Dialogue Option
INCLUDE = lib/include
LIBS = lib.index lib.a prelude.p
#LIBS = lib.index lib.a lib_p.a
LIB = lib
DST = /usr/local/lib/lmlc
LMLC = lmlc
ASM = ../../bin/asm
ADDINDEX = ./addindex
LMLFLAGS =
ASMFLAGS =

# the predefined functions:
OBJPRE =	Psel.o Ppre.o fail.o

.SUFFIXES:
.SUFFIXES:	.o .PM .M .m .c

.PM.o:
	peep -f NS/macros.P $*.PM > $*.tmp.M; \
	$(ASM) $(ASMFLAGS) $*.tmp.M; \
	mv $*.tmp.o $*.o; rm $*.tmp.M

.M.o:
	$(ASM) $(ASMFLAGS) $*.M && $(ADDINDEX) < $*.t

.m.o:
	$(LMLC) $(LMLFLAGS) -c $*.m && $(ADDINDEX) < $*.t

.c.o:
	$(CC) $(CFLAGS) -c $*.c

lib.a: 	Header_test ${OBJPRE} ${AOBJ} FILE.t
	$(ADDINDEX) <FILE.t
	$(ADDINDEX) -Z <Pfail.t
	rm -f lib.a
	ar cr lib.a ${AOBJ} ${OBJPRE}
	ranlib lib.a
	(echo "LML Library Functions:   `date`"; echo) > Descriptions
	Header_test *.m >> Descriptions

lib_p.a:	Header_test ${OBJPRE} ${AOBJ}
	mv -f *.o lib.a normo
	@touch profo/DUMMY.o
	mv -f profo/*.o .
	make LMLFLAGS=-pg ASMFLAGS=-DPROFILE lib.a
	mv lib.a lib_p.a
	mv *.o profo
	mv normo/* .

install:
	-mkdir $(DST)/$(LIB) $(DST)/$(INCLUDE) $(DST)/$(LIB)/parsed
	cp $(LIBS) $(DST)/$(LIB)
	cp $(INCLUDES) $(DST)/$(INCLUDE)
	cp parsed/* $(DST)/$(LIB)/parsed
	ranlib $(DST)/$(LIB)/lib.a
#
countlines:
	wc *.m

#predef
Ppre.o:	Ppre.m Ptype
	$(LMLC) $(LMLFLAGS) -c -Z Ppre.m && ( sed -e 's/import .\([^a-z]*\):/import (\1):/' Ppre.t ; cat Ptype ) | ../syntax/lmlp -Z -p > prelude.p
Pconc.o:	Pconc.m
	$(LMLC) $(LMLFLAGS) -c -Z Pconc.m && $(ADDINDEX) -Z <Pconc.t
Psel.o:	Psel.m
	$(LMLC) $(LMLFLAGS) -c -Z Psel.m && $(ADDINDEX) -Z <Psel.t
Ppre1.o:	Ppre1.m
	$(LMLC) $(LMLFLAGS) -c -Z Ppre1.m && $(ADDINDEX) -Z <Ppre1.t
argv.o:	argv.m
	$(LMLC) $(LMLFLAGS) -c -Z argv.m && $(ADDINDEX) -Z <argv.t
envp.o:	envp.m
	$(LMLC) $(LMLFLAGS) -c -Z envp.m && $(ADDINDEX) -Z <envp.t
concargs.o:	concargs.m
	$(LMLC) $(LMLFLAGS) -c -Z concargs.m
bin.o:	bin.m
	$(LMLC) $(LMLFLAGS) -c bin.m && $(ADDINDEX) <bint.t
Array.o:	Array.M
	$(ASM) $(ASMFLAGS) Array.M && $(ADDINDEX) -Z <Array.t
Array_m.o:	Array_m.m
	$(LMLC) $(LMLFLAGS) -c -Z Array_m.m && $(ADDINDEX) -Z <Array_m.t
Integer.o:	Integer.M
	$(ASM) $(ASMFLAGS) Integer.M && $(ADDINDEX) -Z <Integer.t
integerfunc.o:	integerfunc.m
	$(LMLC) $(LMLFLAGS) -c -Z integerfunc.m && $(ADDINDEX) -Z <integerfunc.t

Float_dir/Float.o:	Float_dir/Float.M
	$(ASM) $(ASMFLAGS) Float_dir/Float.M && $(ADDINDEX) -Z <Float_dir/Float.t
Float_dir/fmtf.o:	Float_dir/fmtf.M
	$(ASM) $(ASMFLAGS) Float_dir/fmtf.M && $(ADDINDEX) -Z <Float_dir/fmtf.t
Float_dir/ftoi.o:	Float_dir/ftoi.M
	$(ASM) $(ASMFLAGS) Float_dir/ftoi.M && $(ADDINDEX) -Z <Float_dir/ftoi.t
Float_dir/ftos.o:	Float_dir/ftos.M
	$(ASM) $(ASMFLAGS) Float_dir/ftos.M && $(ADDINDEX) -Z <Float_dir/ftos.t
Float_dir/ftosf.o:	Float_dir/ftosf.M
	$(ASM) $(ASMFLAGS) Float_dir/ftosf.M && $(ADDINDEX) -Z <Float_dir/ftosf.t
Float_dir/func.o:	Float_dir/func.M
	$(ASM) $(ASMFLAGS) Float_dir/func.M && $(ADDINDEX) -Z <Float_dir/func.t
Float_dir/itof.o:	Float_dir/itof.M
	$(ASM) $(ASMFLAGS) Float_dir/itof.M && $(ADDINDEX) -Z <Float_dir/itof.t
Float_dir/stof.o:	Float_dir/stof.M
	$(ASM) $(ASMFLAGS) Float_dir/stof.M && $(ADDINDEX) -Z <Float_dir/stof.t
# cc is brain damaged, thus we need these rules
Float_dir/func_c.o:	Float_dir/func_c.c
	$(CC) $(CFLAGS) -c Float_dir/func_c.c; mv func_c.o Float_dir
Float_dir/stof_c.o:	Float_dir/stof_c.c
	$(CC) $(CFLAGS) -c Float_dir/stof_c.c; mv stof_c.o Float_dir
Float_dir/ftos_c.o:	Float_dir/ftos_c.c
	$(CC) $(CFLAGS) -c Float_dir/ftos_c.c; mv ftos_c.o Float_dir
Float_dir/ftosf_c.o:	Float_dir/ftosf_c.c
	$(CC) $(CFLAGS) -c Float_dir/ftosf_c.c; mv ftosf_c.o Float_dir
Float_dir/fmtf_c.o:	Float_dir/fmtf_c.c
	$(CC) $(CFLAGS) -c Float_dir/fmtf_c.c; mv fmtf_c.o Float_dir
floatfunc.o:	floatfunc.m
	$(LMLC) $(LMLFLAGS) -c -Z floatfunc.m && $(ADDINDEX) -Z <floatfunc.t

seq.o:	seq.m
	$(LMLC) $(LMLFLAGS) -c -Z seq.m && $(ADDINDEX) -Z <seq.t
fail.o:	fail.m
	$(LMLC) $(LMLFLAGS) -c -Z fail.m && $(ADDINDEX) -Z <fail.t
Pfrom.o:	Pfrom.m
	$(LMLC) $(LMLFLAGS) -c -Z Pfrom.m && $(ADDINDEX) -Z <Pfrom.t
catch.o:	catch.m
	$(LMLC) $(LMLFLAGS) -c -Z catch.m && $(ADDINDEX) -Z <catch.t
throw.o:	throw.m
	$(LMLC) $(LMLFLAGS) -c -Z throw.m && $(ADDINDEX) -Z <throw.t
#
# library functions interdependencies
difference.o intersect.o:	filter.o
group.o:			choplist.o take.o
index.o:			head.o length.o
isalpha.o:			islower.o isupper.o
isalnum.o:			isalpha.o isdigit.o
ispunct.o:			isprint.o isalnum.o
iscntrl.o:			isprint.o
space.o:			rept.o
leftadj.o rightadj.o:		rept.o length.o
itosf.o:			itos.o rightadj.o
randlist.o:			abs.o
stoi.o:				revitlist.o take.o isdigit.o
stoil.o:			isdigit.o
take.o:				reverse.o
transpose.o:			map.o Or.o
union.o:			difference.o
show.o:				itos.o mix.o map.o concmap.o
takeword.o:			isalpha.o isalnum.o isdigit.o take.o
translit.o:			assocdef.o
Max.o Min.o:			revitlist.o maxint.o
sort.o:				automat.o
scan.o:				takeword.o take.o mem.o isdigit.o stoi.o isspace.o
subset.o:			map.o
permutations.o:			map.o concmap.o

Header_test:	Header_test.l
		lex Header_test.l
		cc -O lex.yy.c -o Header_test
		rm lex.yy.c

clean:
	rm -f *.o lib.a lib_p.a
oosave:
	mv *.o lib.a saveoo
	mv saveoo/runtime* .
unosave:
	mv saveoo/* .
osave:
	mv *.o lib.a saveo
	mv saveo/runtime* .
unsave:
	mv saveo/* .
