# Copyright (c) 1990-2004 by Wayne C. Gramlich.
# All rights reserved.

.PHONY: all everything clean

ROOT := ../..

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

COPTS := -g

# Some Macros:

LIBUTIL_DIRECTORY := $(ROOT)/libutil

LIBUTIL := $(LIBUTIL_DIRECTORY)/$(PLATFORM)/libutil.a
XLIBUTIL := $(LIBUTIL_DIRECTORY)/$(XPLATFORM)/libutil.a

CFLAGS := ${COPTS} -I$(LIBUTIL_DIRECTORY) -I. -DLINUX
WINDOWS_CFLAGS := ${COPTS} -I$(LIBUTIL_DIRECTORY) -I. -DWINDOWS

LIBSTIPPLE_DIRECTORY := ../libstipple
LIBSTIPPLE_PLATFORM_DIRECTORY := $(LIBSTIPPLE_DIRECTORY)/$(PLATFORM)
LIBSTIPPLE_XPLATFORM_DIRECTORY := $(LIBSTIPPLE_DIRECTORY)/$(XPLATFORM)


# All headers for all programs:
HEADERS :=			\
	call_defs.h		\
	call_exports.h		\
	call_types.h		\
	exp_defs.h		\
	exp_exports.h		\
	exp_types.h		\
	flags_defs.h		\
	flags_exports.h		\
	flags_types.h		\
	gen_defs.h		\
	gen_exports.h		\
	gen_types.h		\
	generate_defs.h		\
	generate_exports.h	\
	generate_types.h	\
	keyword_defs.h		\
	keyword_exports.h	\
	keyword_types.h		\
	module_defs.h		\
	module_exports.h	\
	module_types.h		\
	msg_defs.h		\
	msg_exports.h		\
	msg_types.h		\
	need_defs.h		\
	need_exports.h		\
	need_types.h		\
	object_defs.h		\
	object_exports.h	\
	object_types.h		\
	out_exports.h		\
	parser_defs.h		\
	parser_exports.h	\
	parser_types.h		\
	routine_defs.h		\
	routine_exports.h	\
	routine_info_defs.h	\
	routine_info_exports.h	\
	routine_info_types.h	\
	routine_types.h		\
	run_time_defs.h		\
	run_time_exports.h	\
	run_time_types.h	\
	statement_defs.h	\
	statement_exports.h	\
	statement_types.h	\
	token_defs.h		\
	token_exports.h		\
	token_types.h		\
	type_defs.h		\
	type_exports.h		\
	type_types.h		\
	var_defs.h		\
	var_exports.h		\
	var_types.h

COMPILER_SOURCES :=		\
	call_create.c		\
	call_gen.c		\
	call_exp_convert.c	\
	call_print.c		\
	exp_parse.c		\
	exp_print.c		\
	flags.c			\
	gen.c			\
	generate_convert.c	\
	generate_gen.c		\
	generate_parse.c	\
	generate_routine.c	\
	keyword.c		\
	module_convert.c	\
	module_gen.c		\
	module_parse.c		\
	module_print.c		\
	module_rw.c		\
	msg.c			\
	need_table.c		\
	object.c		\
	out.c			\
	parser.c		\
	routine_convert.c	\
	routine_entry.c		\
	routine_gen.c		\
	routine_parse.c		\
	routine_print.c		\
	routine_ref.c		\
	routine_table.c		\
	run_time_headers.c	\
	stc.c			\
	statement_convert.c	\
	statement_gen.c		\
	statement_parse.c	\
	statement_print.c	\
	token.c			\
	type_convert.c		\
	type_def.c		\
	type_gen.c		\
	type_parse.c		\
	type_proto.c		\
	type_ref.c		\
	var.c
COMPILER_OBJECTS := ${COMPILER_SOURCES:%.c=$(PLATFORM)/%.o}
COMPILER := $(PLATFORM)/stc

DEBUGGER_SOURCES :=		\
	std.c			\
	routine_info.c		\
	run_time_cmds.c		\
	run_time_loop.c		\
	run_time_util.c
DEBUGGER_OBJECTS := ${DEBUGGER_SOURCES:%.c=$(PLATFORM)/%.o}
WINDOWS_DEBUGGER_OBJECTS := ${DEBUGGER_SOURCES:%.c=$(WINDOWS_PLATFORM)/%.o}

#DEBUGGER := $(PLATFORM)/std

LINKER_ONLY_SOURCES :=		\
	stl.c
LINKER_SOURCES :=		\
	${LINKER_ONLY_SOURCES}	\
	run_time_headers.c
LINKER_OBJECTS := ${LINKER_SOURCES:%.c=$(PLATFORM)/%.o}
LINKER := $(PLATFORM)/stl

STHEADERS_ONLY_SOURCES :=		\
	stheaders.c
STHEADERS_SOURCES := 			\
	${STHEADERS_ONLY_SOURCES}	\
	run_time_headers.c
STHEADERS_OBJECTS := ${STHEADERS_SOURCES:%.c=$(PLATFORM)/%.o}
STHEADERS := $(PLATFORM)/stheaders

# Some additional macros:

SOURCES :=			\
	${COMPILER_SOURCES}	\
	${LINKER_ONLY_SOURCES}	\
	${DEBUGGER_SOURCES}	\
	${STHEADERS_ONLY_SOURCES}

SOURCES_AND_HEADERS :=		\
	${SOURCES}		\
	${HEADERS}		\
	index.html

OBJECTS :=			\
	${COMPILER_OBJECTS}	\
	${LINKER_OBJECTS}	\
	${DEBUGGER_OBJECTS}	\
	${STHEADERS_OBJECTS}

PROGRAMS :=			\
	$(COMPILER)		\
	$(LINKER)

#	$(DEBUGGER)

#EXTRA_BASES :=			\
#	strt0.o			\
#	libutil.a		\
#	libstipple.a
#EXTRA_FILES := ${EXTRA_BASES:%=$(PLATFORM)/%}
#XEXTRA_FILES := ${EXTRA_BASES:%=$(XPLATFORM)/%}

# Some targets:

.PHONY: all clean copy deep deep2 spell

all: ${PLATFORMS} $(WAIT)		\
    ${SOURCES_AND_HEADERS} $(WAIT)	\
    ${PROGRAMS} $(WAIT)			\
    ${DEBUGGER_OBJECTS}			\
    ${WINDOWS_DEBUGGER_OBJECTS}

deep: deep2 $(WAIT) all

deep2:
	cd $(LIBUTIL_DIRECTORY); $(MAKE)

$(COMPILER): stheaders.h $(WAIT) ${COMPILER_OBJECTS}
	rm -f $@
	$(CC) -o $@ ${COMPILER_OBJECTS} $(LIBUTIL)

#$(DEBUGGER): stheaders.h $(WAIT) ${DEBUGGER_OBJECTS}
#	rm -f $@
#	$(CC) -o $@ ${DEBUGGER_OBJECTS} $(LIBUTIL)

$(LINKER): ${LINKER_OBJECTS}
	rm -f $@
	$(CC) -o $@ ${LINKER_OBJECTS} $(LIBUTIL)

$(STHEADERS): ${STHEADERS_OBJECTS}
	rm -f $@
	$(CC) -o $@ ${STHEADERS_OBJECTS} $(LIBUTIL)

$(PLATFORM)/strt0.o: $(LIBSTIPPLE_PLATFORM_DIRECTORY)/strt0.o
	rm -f $@
	ln $(LIBSTIPPLE_PLATFORM_DIRECTORY)/strt0.o $@

$(PLATFORM)/libutil.a: $(LIBUTIL)
	rm -f $@
	ln $(LIBUTIL) $@

$(PLATFORM)/libstipple.a: $(LIBSTIPPLE_PLATFORM_DIRECTORY)/libstipple.a
	rm -f $@
	ln $(LIBSTIPPLE_PLATFORM_DIRECTORY)/libstipple.a $@


$(XPLATFORM)/strt0.o: $(LIBSTIPPLE_XPLATFORM_DIRECTORY)/strt0.o
	rm -f $@
	ln $(LIBSTIPPLE_XPLATFORM_DIRECTORY)/strt0.o $@

$(XPLATFORM)/libutil.a: $(XLIBUTIL)
	rm -f $@
	ln $(XLIBUTIL) $@

$(XPLATFORM)/libstipple.a: $(LIBSTIPPLE_XPLATFORM_DIRECTORY)/libstipple.a
	rm -f $@
	ln $(LIBSTIPPLE_XPLATFORM_DIRECTORY)/libstipple.a $@


stheaders.h: $(PLATFORM)/stheaders
	# Generate stheaders.h:
	$(PLATFORM)/stheaders

clean:
	rm -rf ${PLATFORMS} stheaders.h
	$(CLEAN)






