# Copyright (c) 1995-2006 by Wayne C. Gramlich.
# All rights reserved.

# Some macros:

ROOT := ../..

include $(ROOT)/Makefile_common.mk
include $(ROOT)/Makefile_private.mk

# Disable -O2 optimizations; the new gcc screws up!!!
COPTS := -g
#COPTS :=

LIBUTIL_DIRECTORY := $(ROOT)/libutil
STIPPLE_DIRECTORY := $(ROOT)/stipple
STC_DIRECTORY := $(STIPPLE_DIRECTORY)/stc
NSTC_DIRECTORY := $(STIPPLE_DIRECTORY)/nstc
LIBSTIPPLE_DIRECTORY := $(STIPPLE_DIRECTORY)/libstipple

# A few libraries:
LIBUTIL := $(LIBUTIL_DIRECTORY)/$(PLATFORM)/libutil.a
LIBSTIPPLE := $(PLATFORM)/libstipple.a
WINDOWS_LIBUTIL := $(LIBUTIL_DIRECTORY)/$(WINDOWS_PLATFORM)/libutil.a
WINDOWS_LIBSTIPPLE := $(WINDOWS_PLATFORM)/libstipple.a

# A few programs:
STC := $(STC_DIRECTORY)/$(PLATFORM)/stc
STL := $(STC_DIRECTORY)/$(PLATFORM)/stl
NSTC := $(NSTC_DIRECTORY)/$(PLATFORM)/nstc

C_INCLUDES :=			\
	-I../../libutil		\
	-I../stc
CFLAGS := ${COPTS} ${C_INCLUDES} -DLINUX
WINDOWS_C_INCLUDES := ${C_INCLUDES}
WINDOWS_CFLAGS := ${COPTS} ${WINDOWS_C_INCLUDES} -DWINDOWS
STC_INCLUDES :=			\
	-I $(PLATFORM)
#STC_FLAGS := ${STC_OPTIONS} ${STC_INCLUDES}
STC_FLAGS := -G ${STC_INCLUDES}

#	heap
#	printer

C_BASES :=		\
	address		\
	character	\
	directory	\
	file_set	\
	float		\
	in_stream	\
	integer		\
	logical		\
	long_jump	\
	memory		\
	out_stream	\
	real		\
	save		\
	serial_port	\
	status		\
	string		\
	string_array	\
	system		\
	time		\
	unsigned	\
	user		\
	unix_system	\
	unix_termios	\
	vector
C_SOURCES := ${C_BASES:%=%_c.c}
C_OBJECTS := ${C_BASES:%=$(PLATFORM)/%_c.o}
WINDOWS_C_OBJECTS := ${C_BASES:%=$(WINDOWS_PLATFORM)/%_c.o}

#	printer
#	heap

STS_BASES :=		\
	address		\
	c_import	\
	character	\
	command_parse	\
	command_types	\
	delay		\
	directory	\
	errors		\
	fail		\
	file_name	\
	file_set	\
	file_system	\
	float		\
	format		\
	in_stream	\
	input_stream	\
	integer		\
	io_dispatcher	\
	logical		\
	long_jump	\
	memory		\
	network		\
	null		\
	out_stream	\
	output_stream	\
	real		\
	save		\
	serial_port	\
	set		\
	status		\
	string		\
	string_array	\
	system		\
	table		\
	time		\
	timer		\
	unsigned	\
	user		\
	unix_system	\
	unix_termios	\
	url		\
	vector		\
	xml

STS_SOURCES := ${STS_BASES:%=%.sts}
STS_INTERFACES := ${STS_BASES:%=$(PLATFORM)/%.sti}
STS_OBJECTS := ${STS_BASES:%=$(PLATFORM)/%.o}
STS_HTMLS := ${STS_BASES:%=%.html}
STS_IMPORTS := ${STS_BASES:%=STDB/%.import.so.1}

WINDOWS_STS_INTERFACES := ${STS_BASES:%=$(WINDOWS_PLATFORM)/%.sti}
WINDOWS_STS_OBJECTS := ${STS_BASES:%=$(WINDOWS_PLATFORM)/%.o}

DEBUGGER_OBJECTS :=				\
	../stc/$(PLATFORM)/routine_info.o	\
	../stc/$(PLATFORM)/run_time_cmds.o	\
	../stc/$(PLATFORM)/run_time_loop.o	\
	../stc/$(PLATFORM)/run_time_util.o

WINDOWS_DEBUGGER_OBJECTS :=				\
	../stc/$(WINDOWS_PLATFORM)/routine_info.o	\
	../stc/$(WINDOWS_PLATFORM)/run_time_cmds.o	\
	../stc/$(WINDOWS_PLATFORM)/run_time_loop.o	\
	../stc/$(WINDOWS_PLATFORM)/run_time_util.o

SOURCES :=			\
	${C_SOURCES}		\
	${STS_SOURCES}		\
	run_time_debug.c	\
	strt0.c			\
	index.html

HTMLS :=			\
	${STS_HTMLS}		\
	source.html<

LIB_OBJECTS :=			\
	${STS_OBJECTS}		\
	${C_OBJECTS}		\
	$(PLATFORM)/run_time_debug.o
OBJECTS :=			\
	${LIB_OBJECTS}		\
	$(PLATFORM)/strt0.o

WINDOWS_LIB_OBJECTS :=			\
	${WINDOWS_STS_OBJECTS}		\
	${WINDOWS_C_OBJECTS}		\
	$(WINDOWS_PLATFORM)/run_time_debug.o
WINDOWS_OBJECTS :=			\
	${WINDOWS_LIB_OBJECTS}		\
	$(WINDOWS_PLATFORM)/strt0.o

HELLO_BASES :=			\
	hello
HELLO_INTERFACES := ${HELLO_BASES:%=$(PLATFORM)/%.sti}
HELLO_OBJECTS := ${HELLO_BASES:%=$(PLATFORM)/%.o}
HELLO := $(PLATFORM)/hello
WINDOWS_HELLO_INTERFACES := ${HELLO_BASES:%=$(WINDOWS_PLATFORM)/%.sti}
WINDOWS_HELLO_OBJECTS := ${HELLO_BASES:%=$(WINDOWS_PLATFORM)/%.o}
WINDOWS_HELLO := $(WINDOWS_PLATFORM)/hello.exe

STRING_TEST_BASES :=		\
	string_test
STRING_TEST_INTERFACES := ${STRING_TEST_BASES:%=$(PLATFORM)/%.sti}
STRING_TEST_OBJECTS := ${STRING_TEST_BASES:%=$(PLATFORM)/%.o}
STRING_TEST := $(PLATFORM)/string_test

STREAM_TEST_BASES :=		\
	stream_test
STREAM_TEST_INTERFACES := ${STREAM_TEST_BASES:%=$(PLATFORM)/%.sti}
STREAM_TEST_OBJECTS := ${STREAM_TEST_BASES:%=$(PLATFORM)/%.o}
STREAM_TEST := $(PLATFORM)/stream_test

VECTOR_TEST_BASES :=		\
	vector_test
VECTOR_TEST_INTERFACES := ${VECTOR_TEST_BASES:%=$(PLATFORM)/%.sti}
VECTOR_TEST_OBJECTS := ${VECTOR_TEST_BASES:%=$(PLATFORM)/%.o}
VECTOR_TEST := $(PLATFORM)/vector_test

TERMIOS_TEST_BASES :=		\
	termios_test
TERMIOS_TEST_INTERFACES := ${TERMIOS_TEST_BASES:%=$(PLATFORM)/%.sti}
TERMIOS_TEST_OBJECTS := ${TERMIOS_TEST_BASES:%=$(PLATFORM)/%.o}
TERMIOS_TEST := $(PLATFORM)/termios_test

UNIX_SYSTEM_TEST_BASES :=	\
	unix_system_test
UNIX_SYSTEM_TEST_INTERFACES := ${UNIX_SYSTEM_TEST_BASES:%=$(PLATFORM)/%.sti}
UNIX_SYSTEM_TEST_OBJECTS := ${UNIX_SYSTEM_TEST_BASES:%=$(PLATFORM)/%.o}
UNIX_SYSTEM_TEST := $(PLATFORM)/unix_system_test

URL_TEST_BASES :=		\
	url_test
URL_TEST_INTERFACES := ${URL_TEST_BASES:%=$(PLATFORM)/%.sti}
URL_TEST_OBJECTS := ${URL_TEST_BASES:%=$(PLATFORM)/%.o}
URL_TEST := $(PLATFORM)/url_test

PROGRAMS :=			\
	$(HELLO)		\
	$(WINDOWS_HELLO)	\
	$(STRING_TEST)		\
	$(STREAM_TEST)		\
	$(UNIX_SYSTEM_TEST)	\
	$(VECTOR_TEST)		\
	$(TERMIOS_TEST)		\
	$(URL_TEST)

# Some rules:

STDB/%.import.so.1: %.sts
	$(NSTC) -m interface $<

# Some targets:

.PHONY: all clean copy deep everything everything_else site

all: ${SOURCES} $(WAIT)					\
    ${PLATFORMS} $(WAIT)				\
    ${STS_INTERFACES} ${WINDOWS_STS_INTERFACES} $(WAIT)	\
    ${OBJECTS} ${WINDOWS_OBJECTS} $(WAIT) 			\
    $(LIBSTIPPLE) $(WINDOWS_LIBSTIPPLE) $(WAIT)		\
    ${PROGRAMS} $(WAIT) source.html

deep: everything_else $(WAIT) all

everything_else:
	cd ../../libutil; $(MAKE)
	cd ../stc; $(MAKE)

# I'm missing a dependency on ${DEBUGGER_OBJECTS}.  It is not worth
# the hassle to fix it.
$(LIBSTIPPLE): ${STS_INTERFACES} $(WAIT) ${OBJECTS}
	rm -f $@
	ar cr $@ ${OBJECTS} ${DEBUGGER_OBJECTS}
	ranlib $@
	rm -f $(STC_DIRECTORY)/$(PLATFORM)/libstipple.a
	rm -f $(STC_DIRECTORY)/$(PLATFORM)/strt0.o
	rm -f $(STC_DIRECTORY)/$(PLATFORM)/libutil.a
	cp $@ $(LIBUTIL) $(PLATFORM)/strt0.o $(STC_DIRECTORY)/$(PLATFORM)

$(WINDOWS_LIBSTIPPLE): ${WINDOWS_STS_INTERFACES} $(WAIT) ${WINDOWS_OBJECTS}
	rm -f $@
	$(WINDOWS_AR) cr $@ ${WINDOWS_OBJECTS} ${WINDOWS_DEBUGGER_OBJECTS}
	$(WINDOWS_RANLIB) $@
	rm -f $(STC_DIRECTORY)/$(WINDOWS_PLATFORM)/libstipple.a
	rm -f $(STC_DIRECTORY)/$(WINDOWS_PLATFORM)/strt0.o
	rm -f $(STC_DIRECTORY)/$(WINDOWS_PLATFORM)/libutil.a
	cp $@ $(WINDOWS_LIBUTIL) $(WINDOWS_PLATFORM)/strt0.o \
	    $(STC_DIRECTORY)/$(WINDOWS_PLATFORM)

xtest.exe: xtest.c
	$(XCC) -o $@ xtest.c

$(HELLO): ${HELLO_INTERFACES} $(WAIT) ${HELLO_OBJECTS} $(WAIT) $(LIBSTIPPLE)
	rm -f $@
	$(STL) -o $@ ${HELLO_INTERFACES} ${HELLO_OBJECTS}

$(WINDOWS_HELLO): ${WINDOWS_HELLO_INTERFACES} $(WAIT) \
    ${WINDOWS_HELLO_OBJECTS} $(WAIT) $(WINDOWS_LIBSTIPPLE)
	rm -f $@
	$(STL) -v -o $@ -W -w $(WINDOWS_CC) ${WINDOWS_HELLO_INTERFACES} ${WINDOWS_HELLO_OBJECTS}

$(UNIX_SYSTEM_TEST): ${UNIX_SYSTEM_TEST_INTERFACES} $(WAIT)	\
    ${UNIX_SYSTEM_TEST_OBJECTS} $(WAIT) $(LIBSTIPPLE)
	rm -f $@
	$(STL) -o $@ ${UNIX_SYSTEM_TEST_INTERFACES} ${UNIX_SYSTEM_TEST_OBJECTS}

$(STRING_TEST): ${STRING_TEST_INTERFACES} $(WAIT)		\
    ${STRING_TEST_OBJECTS} $(WAIT) $(LIBSTIPPLE)
	rm -f $@
	$(STL) -o $@ ${STRING_TEST_INTERFACES} ${STRING_TEST_OBJECTS}

$(STREAM_TEST): ${STREAM_TEST_INTERFACES} $(WAIT)		\
    ${STREAM_TEST_OBJECTS} $(WAIT) $(LIBSTIPPLE)
	rm -f $@
	$(STL) -o $@ ${STREAM_TEST_INTERFACES} ${STREAM_TEST_OBJECTS}

$(VECTOR_TEST): ${VECTOR_TEST_INTERFACES} $(WAIT)		\
    ${VECTOR_TEST_OBJECTS} $(WAIT) $(LIBSTIPPLE)
	rm -f $@
	$(STL) -v -o $@ ${VECTOR_TEST_INTERFACES} ${VECTOR_TEST_OBJECTS}

$(TERMIOS_TEST): ${TERMIOS_TEST_INTERFACES} $(WAIT)		\
    ${TERMIOS_TEST_OBJECTS} $(WAIT) $(LIBSTIPPLE)
	rm -f $@
	$(STL) -v -o $@ ${TERMIOS_TEST_INTERFACES} ${TERMIOS_TEST_OBJECTS}

$(URL_TEST): ${URL_TEST_INTERFACES} $(WAIT)			\
    ${URL_TEST_OBJECTS} $(WAIT) $(LIBSTIPLE)
	rm -f $@
	$(STL) -o $@ ${URL_TEST_INTERFACES} ${URL_TEST_OBJECTS}

$(NSTC):
	$(MAKE) -C $(NSTC_DIRECTORY)

clean:
	rm -rf ${PLATFORMS} STDB source.html ${STS_HTMLS}
	$(CLEAN)

source.html: Makefile $(NSTC) $(WAIT) ${STS_HTMLS}
	@echo -n "Generating $@..."
	@rm -f $@
	@echo '<HTML>' > $@
	@echo '<Head>' >> $@
	@echo '<Title>New STIPPLE Compiler Source Files</Title>' >> $@
	@echo '</Head>' >> $@
	@echo '<Body>' >> $@
	@echo '<P>These are the source files for the' >> $@
	@echo '<A HRef="index.html">New STIPPLE Compiler</A>.</P>' >> $@
	@echo '<H1>' >> $@
	@echo 'New STIPPLE Compiler Source Files' >> $@
	@echo '</H1>' >> $@
	@echo '<P>The following extracted documentation is available:</P>'>> $@
	@echo '<UL>' >> $@
	@for i in ${STS_BASES} ; do					\
		echo "  <LI><A HRef='$$i.html'>$$i</A></LI>" >> $@ ;	\
		done
	@echo '</UL>' >> $@
	@echo '<P>The following source files are available:</P>' >> $@
	@echo '<UL>' >> $@
	@for i in `ls Makefile ${STS_SOURCES} ${C_SOURCES} | sort`; do \
		echo "  <LI><A HRef='$$i'>$$i</A></LI>" >> $@ ;		\
		done
	@echo '</UL>' >> $@
	@echo '<HR>' >> $@
	@echo '<Address>' >> $@
	@echo '<A HRef="../../../copyright.html">' >> $@
	@echo 'Copyright</A> (c) 1997 by' >> $@
	@echo '<A HRef="../../../gramlich.html">' >> $@
	@echo 'Wayne Gramlich</A> All rights reserved.' >> $@
	@echo '</Address>' >> $@
	@echo '</Body>' >> $@
	@echo '</HTML>' >> $@
	@echo "Done"
