CC = gcc-dx10
AS = asm990
LD = lnk990

CFLAGS = -Os -fno-builtin -Iinclude $(DEBUG) $(MINLIB)
ASMFLAGS = -xl $(subst .o,.lst,$@)
SASMFLAGS = -xl $(subst .s,.lst,$@) -o $(subst .s,.o,$@)

LIBC = libc.a
LIBHARD = libhard.a
LIBSOFT = libsoft.a
LIBSA = libsa.a
LIBM = libm.a
LIBM12 = libm12.a
LIBTXDIR = libtxdir.a

DX10INSTDIR = /usr/local/lib/gcc/ti990-ti-dx10/3.4.6
DNOSINSTDIR = /usr/local/lib/gcc/ti990-ti-dnos/3.4.6

INSTLIB = $(LIBC) $(LIBHARD) $(LIBSOFT) $(LIBSA) $(LIBM) $(LIBM12) $(LIBTXDIR)

.s.o:
	$(AS) $(ASMFLAGS) -o $@ $<

.c.s:
	$(CC) $(CFLAGS) -S $<
	$(AS) $(SASMFLAGS) $@ 

MEMORYSRCS = bcmp.s bcopy.s bzero.s memset.s memcpy.s memcmp.s memchr.s \
	memrchr.s
TIMESRCS = ctime.s asctime.s gmtime.s
STDIOSRCS = printf.s puts.s gets.s freopen.s tmpfile.s \
	fopen.s fread.s fwrite.s fputs.s fgets.s fgetc.s fputc.s fprintf.s \
	fclose.s fdopen.s ferror.s clearerr.s feof.s fileno.s fflush.s \
	sprintf.s vsprintf.s readbuffer.s writebuffer.s perror.s \
	errlist.s maperr.s rename.s lseek.s putchar.s putc.s getchar.s getc.s
STDLIBSRCS = atoi.s chartab.s free.s calloc.s malloc.s getenv.s mktemp.s
STRINGSRCS = strcpy.s strncpy.s strcat.s strncat.s strlen.s strcmp.s strncmp.s \
	strchr.s strrchr.s strerror.s
SIGNALSRCS = signal.s
UNISTDSRCS = open.s close.s read.s write.s sleep.s unlink.s flushall.s \
	setpath.s ftell.s fseek.s getpid.s isatty.s access.s fstat.s \
	stty.s gtty.s fcntl.s creat.s
CTYPESRCS = isalnum.s isalpha.s isascii.s iscntrl.s isdigit.s isgraph.s \
	islower.s isprint.s ispunct.s isspace.s isupper.s isxdigit.s \
	isblank.s tolower.s toupper.s
DIRSRCS = opendir.s readdir.s closedir.s rewinddir.s telldir.s seekdir.s \
	stat.s mkdir.s

LIBSRCS = $(TIMESRCS) $(MEMORYSRCS) $(STDIOSRCS) $(STDLIBSRCS) $(STRINGSRCS) \
	$(SIGNALSRCS) $(UNISTDSRCS) $(CTYPESRCS) $(DIRSRCS)


MEMORYOBJS = bcmp.o bcopy.o bzero.o memset.o memcpy.o memcmp.o memchr.o \
	memrchr.o
TIMEOBJS = ctime.o asctime.o gmtime.o
STDIOOBJS = printf.o puts.o gets.o freopen.o tmpfile.o \
	fopen.o fread.o fwrite.o fputs.o fgets.o fgetc.o fputc.o fprintf.o \
	fclose.o fdopen.o ferror.o clearerr.o feof.o fileno.o fflush.o \
	sprintf.o vsprintf.o readbuffer.o writebuffer.o perror.o \
	errlist.o maperr.o rename.o lseek.o putchar.o putc.o getchar.o getc.o
STDLIBOBJS = atoi.o chartab.o free.o calloc.o malloc.o getenv.o mktemp.o
STRINGOBJS = strcpy.o strncpy.o strcat.o strncat.o strlen.o strcmp.o strncmp.o \
	strchr.o strrchr.o strerror.o
SIGNALOBJS = signal.o
UNISTDOBJS = open.o close.o read.o write.o sleep.o unlink.o flushall.o \
	setpath.o ftell.o fseek.o getpid.o isatty.o access.o fstat.o \
	stty.o gtty.o fcntl.o creat.o
SPFPOBJS = addsf3.o divsf3.o mulsf3.o negsf2.o subsf3.o \
	eqsf2.o gesf2.o gtsf2.o lesf2.o ltsf2.o nesf2.o
DPFPOBJS = adddf3.o divdf3.o muldf3.o subdf3.o negdf2.o extendsfdf.o fixdfsi.o \
	floatsidf.o truncdfsf.o eqdf2.o gedf2.o gtdf2.o ledf2.o ltdf2.o nedf2.o
SIOBJS = addsi3.o ashlsi3.o divsi3.o modsi3.o mulsi3.o negsi2.o subsi3.o \
	udvmdsi3.o
HIOBJS = udvmdhi3.o
CTYPEOBJS = isalnum.o isalpha.o isascii.o iscntrl.o isdigit.o isgraph.o \
	islower.o isprint.o ispunct.o isspace.o isupper.o isxdigit.o \
	isblank.o tolower.o toupper.o
DIROBJS = opendir.o readdir.o closedir.o rewinddir.o telldir.o seekdir.o \
	stat.o mkdir.o

LIBOBJS = heapstk.o $(TIMEOBJS) $(STDIOOBJS) $(UNISTDOBJS) $(MEMORYOBJS) \
	$(STRINGOBJS) $(STDLIBOBJS) $(SIGNALOBJS) rand.o time.o localtime.o \
	year2day.o dirtime.o cvtint.o cvtflt.o setjmp.o longjmp.o \
	$(SIOBJS) $(SPFPOBJS) $(DPFPOBJS) $(CTYPEOBJS) $(DIROBJS) $(HIOBJS)
LIBSAOBJS = crte.o
LIB12OBJS = fritp.o

OBJS = $(LIBOBJS) $(LIB12OBJS) $(LIBSAOBJS)
CRTOBJS = crt0sci.o crt0sa.o crt0os.o crt0tx.o crt0srv.o


all: syslib $(CRTOBJS) $(LIBC) $(LIBHARD) $(LIBSOFT) $(LIBM) \
	$(LIBM12) $(LIBSA) $(LIBTXDIR)

syslib: $(CRTOBJS)
	rm -f $(LIBOBJS) $(LIBSAOBJS)
	make MINLIB=-DMINLIB $(LIBC) $(LIBSA)
	mv $(LIBC) libcsys.a
	rm -f $(LIBOBJS) $(LIBSAOBJS)

$(LIBC): $(LIBOBJS)
	cat $(LIBOBJS) >$@

$(LIBHARD): $(LIB12OBJS)
	cat $(LIB12OBJS) >$@

$(LIBSA): $(LIBSAOBJS)
	cat $(LIBSAOBJS) >$@

$(LIBM): 
	make -C math DEBUG="$(DEBUG)" clean all
	cp math/$(LIBM) $@

$(LIBM12): 
	make -C math DEBUG="-mmodel12 $(DEBUG)" clean all
	cp math/$(LIBM) $@

$(LIBSOFT): 
	make -C softlib
	cp softlib/$(LIBSOFT) ./

$(LIBTXDIR):
	make -C txdir DEBUG="$(DEBUG)"
	cp txdir/$(LIBTXDIR) $@

clean:
	rm -f $(OBJS) $(CRTOBJS) *.lst $(LIBC) make.log
	rm -f $(LIBHARD) $(LIBSOFT) $(LIBSA) $(LIBM) $(LIBM12) $(LIBTXDIR)
	rm -f $(LIBSRCS) libcsys.a

distclean: clean randclean
	$(MAKE) -C tests distclean
	$(MAKE) -C math distclean
	$(MAKE) -C softlib distclean
	$(MAKE) -C txdir distclean
	rm -f checkdir/*

randclean:
	rm -rf libc libhard libsoft libsa libm libm12 libdnsci libdxsci

install:
	@if [ -d $(DNOSINSTDIR) ] ; then \
		make install-dnos ;\
	fi ;\
	if [ -d $(DX10INSTDIR) ] ; then \
		make install-dx10 ;\
	fi 

install-dnos:
	cp crt0sci.o $(DNOSINSTDIR)/crt0.o
	cp crt0os.o $(DNOSINSTDIR)/
	cp crt0sa.o $(DNOSINSTDIR)/
	cp crt0srv.o $(DNOSINSTDIR)/
	cp $(INSTLIB) $(DNOSINSTDIR)/
	cp libcsys.a $(DNOSINSTDIR)/
	cp libdnsci.a $(DNOSINSTDIR)/libsci.a
	rm -rf $(DNOSINSTDIR)/include
	mkdir $(DNOSINSTDIR)/include
	cp -r include/* $(DNOSINSTDIR)/include/

install-dx10:
	cp crt0sci.o $(DX10INSTDIR)/crt0.o
	cp crt0os.o $(DX10INSTDIR)/
	cp crt0sa.o $(DX10INSTDIR)/
	cp crt0srv.o $(DX10INSTDIR)/
	cp $(INSTLIB) $(DX10INSTDIR)/
	cp libcsys.a $(DX10INSTDIR)/
	cp libdxsci.a $(DX10INSTDIR)/libsci.a
	rm -rf $(DX10INSTDIR)/include
	mkdir $(DX10INSTDIR)/include
	cp -r include/* $(DX10INSTDIR)/include/

random: all randclean
	-mkdir libc libhard libsoft libsa libm libm12 libdnsci libdxsci
	(splitobj libc.a libc; cd libc; objlink *.obj)
	(splitobj libhard.a libhard; cd libhard; objlink *.obj)
	(splitobj libsoft.a libsoft; cd libsoft; objlink *.obj)
	(splitobj libsa.a libsa; cd libsa; objlink *.obj)
	(splitobj libm.a libm; cd libm; objlink *.obj)
	(splitobj libm12.a libm12; cd libm12; objlink *.obj)
	(splitobj libdnsci.a libdnsci; cd libdnsci; objlink *.obj)
	(splitobj libdxsci.a libdxsci; cd libdxsci; objlink *.obj)

setcheck:
	@cp *.o checkdir/

check:
	@./checkit

sources: $(LIBSRCS)
	
